今天是月底,所以要回顾本月的课题:数据挖掘。
数据挖掘是一门新兴学科,目前正大行其道。从微软的excel中的数据挖掘插件到具体公司要求的BI,都离不开这个课题。而我本月的主要目的是进行数据挖掘的一些回顾与练习,并以实际的沪深股市为例,从中获取一些经验。
无论是分类还是聚类,无论是差异点分析还是神经网络的,它们大致的过程都是一样的,而且这里涉及到的东西还有模式的识别问题(如图像、声音等)。可以说,数据挖掘的技术已经深入到计算机的各个角落。
然而,万变不离其宗,主线是清晰的:数据的收集--数据的处理--数据的分析--结果的展示与验证。 本次挖掘想利用SAP的BW整套工具,最终没有采用,而仅仅是在SQLserver上进行了数据的处理和分析,真有点小儿科的意味。不过,至少从几个方面得到了收获:1,数据的处理预估时间问题。我在前20个关联关系处理需要1个小时左右进行了线性的预估,得出了整个数据处理大致需要3天左右的时间,实际时间基本上吻合。2,采用interger处理与float处理相比,竟然要慢一些。难以理解。原来以为数字都采用float的计算,会涉及到位数和计算周期较长的问题,实际的情况却是采用interger处理比float处理需要时间多了40%。3,熟悉了一些基本sqlserver操作:如需要用到的临时表,游标等。还有就是sql语句的特殊写法等问题。
回到沪深股市上来,我采用了提前一天(数据前面有)和提前两天的关系来对比,发现提前一天的值要高些,这点很奇怪。可惜没有时间分析。
24225 SH601988 SH600580 2 2008年 391798 245 7.99587755102041
24227 SH601988 SH600784 2 2008年 391470 245 7.98918367346939
24229 SH601988 SZ000011 2 2008年 391415 245 7.9880612244898
24222 SH601988 SH600227 2 2008年 390995 245 7.97948979591837
20005 SH600519 SH600580 2 2008年 390227 245 7.96381632653061
24224 SH601988 SH600467 2 2008年 389923 245 7.95761224489796
24359 SZ000011 SZ000011 2 2008年 354725 223 7.95347533632287
24221 SH601988 SH600114 2 2008年 389592 245 7.95085714285714
20009 SH600519 SZ000011 2 2008年 389519 245 7.94936734693878
15819 SH600006 SH600122 2 2008年 387602 244 7.94266393442623
24035 SH601398 SH600580 2 2008年 387525 244 7.94108606557377
24209 SH601939 SZ000011 2 2008年 389102 245 7.94085714285714
28815 SZ002007 SH600580 2 2008年 385391 243 7.92985596707819
24319 SZ000007 SZ000011 2 2008年 331458 209 7.92961722488038
24135 SH601857 SH600580 2 2008年 385318 243 7.92835390946502
27755 SZ000869 SH600580 2 2008年 385085 243 7.92355967078189
21629 SH600697 SZ000011 2 2008年 388142 245 7.92126530612245
24037 SH601398 SH600784 2 2008年 386493 244 7.91993852459016
18099 SH600276 SZ000011 2 2008年 388033 245 7.91904081632653
24205 SH601939 SH600580 2 2008年 387979 245 7.9179387755102
有关的sql语句如下:
存储过程:计算所有股票关系值。
ALTER PROCEDURE [dbo].[BUILDRESULT]
AS
BEGIN
declare @stocka nchar(10)
declare Type_Cursor_StockA CURSOR FOR
select stockname from tbstocknum
open Type_Cursor_StockA
fetch next from Type_Cursor_StockA into @stocka
while @@FETCH_STATUS=0
begin
exec insertstocka @stockname = @stocka
exec calcallstock
exec SAVETEMPRESULTANDDELETE
fetch next from Type_Cursor_StockA into @stocka
end
close Type_Cursor_StockA
deallocate Type_Cursor_StockA
END
存储过程:计算AB股票的关系值
ALTER PROCEDURE [dbo].[CalcABStock]
-- Add the parameters for the stored procedure here
@stockb nchar(10)
AS
BEGIN
declare @sumtotal float
declare @stock1 char(10)
declare @stock2 char(10)
set @stock1 = ( select top 1 stockname from tempa)
set @stock2 =@stockb
select a.datenum as datenum, 2000-abs((a.updown-b.updown)) as tempscore into #temp_table2
from tempa a,tempb b
where a.datenum = b.datenum-2 and b.stockname = @stock2
UPDATE [stockdb].[dbo].[TEMPA]
SET [TEMPSCORE] = 1000
upDATE c
SET c.[TEMPSCORE] = d.tempscore
from tempa c, #temp_table2 d
where c.datenum = d.datenum
drop table #temp_table2
UPDATE [stockdb].[dbo].[TEMPA]
SET [TEMPSCORE] = 1000
where [TEMPSCORE] is null
set @sumtotal = (select sum(tempscore) from tempa)
INSERT INTO [stockdb].[dbo].[TEMPRESULT]
([A]
,[B]
,[LIMITDATE]
,[PERIOD]
,[SCORE])
VALUES
(@stock1,
@stock2,
2,
'2008年',
@sumtotal)
END
存储过程:计算A股票与所有股票的关系值
ALTER PROCEDURE [dbo].[CALCALLSTOCK]
AS
BEGIN
declare @stockname nchar(10)
declare Type_Cursor CURSOR FOR
select stockname from tbstocknum
open Type_Cursor
fetch next from Type_Cursor into @stockname
while @@FETCH_STATUS=0
begin
exec calcabstock @stockb = @stockname
fetch next from Type_Cursor into @stockname
end
close Type_Cursor
deallocate Type_Cursor
END
存储过程:初始化处理
ALTER PROCEDURE [dbo].[INSERTSTOCKA]
-- Add the parameters for the stored procedure here
@stockname nchar(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
delete from tempa
INSERT INTO [stockdb].[dbo].[TEMPA]
([STOCKNAME]
,[DATENUM]
,[UPDOWN]
)
select [STOCKNAME]
,[DATENUM]
,[UPDOWN]
from tempb
where tempb.stockname = @stockname
END
存储过程:保存结果
ALTER PROCEDURE [dbo].[SAVETEMPRESULTANDDELETE]
AS
BEGIN
--保存结果到结果表中,并删除不需要的临时表
declare @rownum int
set @rownum = (select count(*) from tempa)
INSERT INTO [stockdb].[dbo].[RESULT]
([A]
,[B]
,[LIMITDATE]
,[PERIOD]
,[SCORE],prddate)
select top 10 a,b,limitdate,period,score,@rownum from tempresult
--update result
--set result.prddate = @rownum
--where result.prddate is null
delete from tempresult
delete from tempa
END