在上个帖子里提到动态规划可以用于做用户行为的分析,于是我想对股市的波动做一些分析。虽然结果和开始想的不太一样,但也有一些发现。
1 数据标准化问题。正负号不难选择,关键是增幅(何时大于一),因为连乘时会存在放大和缩小,没有适当的增幅转换就得不到理想的数列。我取了 1%作为1的分界点。
2 变号问题。由于频繁的变向,导致了乘积大小频繁转化(这也算满极端的客户行为了)
*3 股市究竟有多善变? 研究从2015-12-16到2016-1-29的30个交易日,发现共有14个上涨日,16个下跌日。从熵的角度看,几乎是最大的(信息最少)。
另外有20个交易日发生反转(涨跌互换), 65%情况的交易日1天后变向,25%的情况交易日2天后变向,10%的情况交易日3天后变向。
所以最佳策略似乎是持有1到2天卖出/买入。但是,如果看1-26,1-27,1-28三个交易日,分别下跌 6.4%,0.5%,2.9%,如果用这个策略可能就被坑了。所以散户不能轻轻松松赚钱。
可以看看下面的变盘日以及变盘前累计的天数。
总结:
1 由于股票波动变化太频繁,用最大乘积序列不合适。(获取选取到合适的数据转换方式有可能适用)
将来考虑用隐马尔科夫模型或者贝叶斯网络的方法研究这个问题,毕竟股票的指数高低只是一个指标,还有成交量也是必须充分考虑的。
2 用动态规划算法给出了乘积最大值以及序列,总的来说,算法的复杂度是可以接受的。
题外话:
今天新闻人工智能已经击败了围棋欧洲冠军,不同于深蓝的暴力计算,该算法更倾向于考虑特定模型。其实这背后应该也是动态规划的思想。
**************************************以下是sas代码****************************************
/*为简便,只取7天*/
%let itv=7;
%let itv2=%eval(&itv+2);
/*导入csv Table.finance.yahoo.com/table.csv?s=000001.ss */
%imp(E:\file,table,stock)
/*1 取最近30天沪市指数*/
data s30;
set stock;
if _n_ le&itv;
keep date close;
run;
/*2 偏移一天*/
data l30;
set stock;
if 2 le _n_ le (&itv+1) ;
close1=close;
keep date close1;
run;
/*3 横向拼接*/
data sl30;
set s30;
set l30(keep=close1);
run;
/*4 计算涨跌幅*/
data sl30;
set sl30;
rate=(close-close1)/close1;
format rate percent7.1;
run;
/*5 涨跌幅标准化*/
proc means data=sl30 noprint;
var rate;
output out=st std(rate)=srate;
run;
data _null_;
set st;
call symput('srate',srate);
run;
data dsl30;
set sl30;
tval=(rate/&srate)*3;
tval1=round(tval*10)/10;
format tval 6.2;
run;
%sort(dsl30,date)
proc iml;
/*读入数据集数据*/
use dsl30;
read all var{date close rate tval1} into a;
/*取转换后的tval1变量,转置,并在前面附加两个0*/
a1={0 0}||t(a[,4]);
max=j(1,&itv2,0);
min=max;
/*计算序列最大值*/
do i=3 to ncol(a1);
max=max(a1,a1*max[i-1],a1*min[i-1]);
min=min(a1,a1*max[i-1],a1*min[i-1]);
end;
/*取产生最大值的位置*/
mpos=max[,<:>];
mul=1;
/*回溯,获取最大积序列的起点*/
/*需要修改默认的递增规则 - -!*/
do i=mpos to 1 by -1;
mul=mul#a1;
dif=max[mpos]-mul;
if dif < 1e-3 then minpos=i;
end;
res=a1[minpos:mpos]`;
print a1;
print max;
print minpos mpos;
print res;
quit;
a1
0
0
-3
1.2
0.7
-5.9
-0.5
-2.7
2.9
max
0
0
0
1.2
0.84
14.868
2.95
20.0718
58.20822
minpos
mpos
3
9
res
-3
1.2
0.7
-5.9
-0.5
-2.7
2.9