Matlab量化投资.docx
《Matlab量化投资.docx》由会员分享,可在线阅读,更多相关《Matlab量化投资.docx(18页珍藏版)》请在冰豆网上搜索。
Matlab量化投资
我不是牛人,谈量化投资,牛人有很多,我这里仅仅想把自己的一点心得和大家分享一下,量化投资的概念很宽泛,从投资标的来分类,涉及到期货、期权、股票、外汇等的量化投资方法和理念,我在主要讨论期货的量化投资,范围再小一点是关于期货的程序化交易的一些方法和理念,后期会讨论一些股票alpha的东西,关于期权和外汇我个人实战经验少,相关东西暂且不做讨论。
如果从数学角度来看,一个交易系统仅仅是一个从行情序列到资金曲线的映射:
f(ts,para)=equity
其中f是一个交易系统,ts是某一个投资标的的行情时间序列,para是交易系统的参数组,equity是资金曲线。
如果f可以解析表达,那么可以使用泛函的东西,直接来研究f的一些性质,包括其连续性、稳健性、对参数的敏感性等一些性质,也可以使用控制论的东西来研究这个系统的鲁棒性。
通过对资金曲线equity的一些再处理,可以得到一些评价指标(年化收益率、年化夏普比率、最大回撤等等),通过这些指标,可以从一定角度来窥探这个交易系统的性能。
之所以将交易系统使用数学抽象表达出来,一则是这样来看待问题更加清晰和明了化;二则也尝试将交易系统的一些问题进行公理化的方式解决,包括最主要的参数选择问题,包括某一具体交易系统与随机交易系统的对比和统计检验问题,后面你回发现采用数学描述来看待这些问题会别有一番洞天。
我时常在想复杂的数学工具在量化投资领域的实战中到底有没有用?
在军工和航天领域复杂的数学工具肯定是有实战的用武之地的,金融这个系统的复杂性肯定不会比军工和航天低,照这个逻辑推是复杂的数学工具在量化投资实战中会有一定作用,但金融与军工和航天领域的最大差别是,金融中有人的参与,导致其未知因素和噪声的不可控性大大加大,而军工和航天领域其噪声虽然也是随机的但大体是可控和可估计的。
也不知道西蒙斯的量化团队都用了哪些数学工具?
《基于Matlab的量化投资》这个系列帖子除了讨论量化投资的方法和理念,还会讨论Matlab这个工具的一些实用问题,之所以采用Matlab来做量化投资而没用采用MC,TB,MT4,天软等其他量化(程序化)平台,一是因为自己用Matlab也7年左右比较熟悉;二是自己使用Matlab来建立量化回测平台,我可以很容易掌控自己的平台的每一个细节(包括资金流的计算、图形的展示、评价指标的计算等等),虽然建立回测平台框架的过程可能会花费一些时间,但一旦整个框架建立起来,日后的使用将会非常方便;三是使用Matlab建立金融模型其周期会比C快很多。
随后的内容可能会讨论的东西很多很杂,我争取做到让整体的逻辑清晰一些,这一段也太忙,没有太多时间来理清《基于Matlab的量化投资》系列帖子的逻辑思路,每天就在上班路上的地铁上思考一下大致该写那些东西,毕竟要认真写一个东西需要将其思路理清,否则还不如不写。
2.从一个例子说起-基于Matlab的量化投资
太多虚的和理论的东西先不说,先上一个实例,后面的一些测试和讨论可能大多数会拿这个做例子来说明。
测试策略:
FRB(Faruto’sRangeBreaker)
策略类型:
日内策略,趋势类策略
策略简介:
突破某一区间入场、尾盘固定时间离场、固定比例止损、每日至多交易1次。
测试品种:
IF、CU。
测试周期:
1分钟。
测试手续费:
采用2012年6月1日起四大交易所手续费新标准的1.5倍,比如IF最新手续费为0.35%%,则测试手续费为0.35%%*1.5=0.525%%。
测试冲击成本:
采用绝对形式,IF买卖共1.5跳(slip),其他品种1跳(slip),实际操作时在买时加入冲击成本,卖时无冲击成本,比如IF在测试时在入场点加入1.5跳冲击成本,离场点无冲击成本。
参数设置:
参数共两个,一个和生成区间中轴相关,另一个是中轴加减的幅度来生成上下轴,暂且不进行参数寻优,使用经验参数固定下来在IF、CU做测试。
其他说明:
使用固定1手进行测试。
IF测试结果评价指标:
3.关于BackTesting中一些细节的思考-基于Matlab的量化投资
在<从一个例子说起-基于Matlab的量化投资>这篇文章中,我介绍了FRB策略在IF、CU、AL上使用经验固定参数的测试结果,我们看到FRB策略在IF、CU、AL上都是正收益的一个系统,但是资金曲线并不完美有好有怀,直观感觉FRB对于固定品种调整适当参数后其效果会变好,更多关于参数寻优调整和策略通用性的讨论放在后面文章进行,这里先来讨论一些关于回测(BackTesting)中的一些细节问题。
回测的目的:
尽可能的真实地还原实际交易过程!
以期检测策略的表现。
首先需要明确回测的目的是什么,这样做回测才有意义。
回测的目的就是真实地还原实际的交易过程,来检查相关策略在历史行情的表现,下面关于回测中的一些细节问题讨论,我会时刻围绕这个目的来进行讨论,因为只有明确这个目的,讨论才有意义。
回测标的的选取
由于期货是有交割的,所以相应的品种的数据并不连续,这就涉及到一个问题,我们进行回测时选取什么回测标的?
可以有N种定义方法将相关的期货合约品种连接起来,但那种是在某种意义上最合理的呢?
回想回测的目的(尽可能的真实地还原实际交易过程!
),实际交易中的你我是怎么进行的?
我想对于单边趋势类策略大家肯定会在相关品种的主力合约上进行交易,对于其他类型策略(震荡类、对冲类)可能大家会有其他选择,这里单就单边趋势类策略而言。
这里有个问题,“主力合约”怎么定义?
可以定义成交量*持仓量最大的为主力合约或者其他你认为合理的定义,目的是找出你心中的“主力合约”(活跃合约)。
有了主力合约的定义,那么回到回测标的的选取就有了答案,那就用主力连续合约进行回测即可,这样就能真实的反应实际交易过程,主力连续合约的构造按照主力合约的定义给出即可:
假设有A、B、C、D四个同一品种不同月份的期货合约,现把这几个不同月份的合约进行连接,设T为时间轴,在Ti天计算成交量*持仓量,该值为最大的合约为主力合约,但该换月过程“不可逆”,即若某一合约K(属于A、B、C、D中一个)在Tk天之前做过主力合约,在Tk天主力进行了换月,在Tk天之后的某一天又为K合约的成交量*持仓量为最大值,此时忽略K。
可能有人采取使用某一品种的所有合约的加权平均的指数作为回测标的,或者采用在指数上发现信号,在主力合约上下单子进行回测,按照“尽可能的真实地还原实际交易过程”这个回测目的而言,我个人不认为这种选取加权指数或者其他方式为回测标的是好的方式,当然你可以认为这是一种信号再处理的方式,可以保留意见。
冲击成本的估计
冲击成本是回测中的未知量,其大小理论上和市场的深度和广度相关,最有说服力的估计方式就是你有多年的实盘账单,进而可以估计出某一品种的实际冲击成本的大小,但往往在做回测的您还拿不出“多年的实盘账单”,只能进行大致估计,一般而言,流动性好的品种,使用1-2slip作为冲击成本的估计应该足够了,流动性不好的需要更大的冲击成本,比如股指的远月合约,其冲击成本有时候可能会大到5-7个BP。
PS:
冲击成本也并不一定对你的策略是不利的,这点要见仁见智的看,依据不同的交易思路和策略,有时候冲击成本会对你有利。
往往有时候可以巧妙的利用这一点来为我所用。
手续费的设置
手续费一般是固定的成本,为了严格一些可以将手续费设的大一些,比如设成交易所手续费的1.5-3倍,当然也没有必要将手续费设置的过大,因为所有的手续费在手续费趋向于无穷大的时候都会废掉,如果你手续费设置的过大,会湮没你策略本身的某些细节,只要手续费设置的稍微大一点,表明你的策略能抗衡手续费就行了,更多关于策略对于手续费的敏感性,可以单独做敏感性压力测试。
入场离场位置的设置
我采用的方式是,设Bar(k)为当前Tick的Bar,检查前一个Bar的收盘价Bar(k-1).Close(或者使用前一个Bar的其他价格)若发现入场信号,则用当前Bar的开盘价Bar(k).Open加入冲击成本作为回测的入场价,离场方式的确定类似。
这样做的目的是为了“尽可能的真实地还原实际交易过程”,可能有人采用若在当前Bar的收盘价(或使用当前Bar的其他价格信息)上发现入场信号,则用当前Bar的收盘价加入冲击成本作为回测的入场价,你可以做做测试,上面两种入场离场方式的选取是有一定差异的,在合约连续性足够好的情况下,前一个Bar的收盘价可以无限逼近当前Bar的开盘价,进而两种方式可以近似等同,但现实情况往往不是这样,按照“尽可能的真实地还原实际交易过程”这个回测目的,我个人认为前者的方式更佳。
交易系统的评价
关于交易系统(策略)的好坏评价,这一部分后面会有专门文章进行讨论,这里先说几句,如何能更加全面的评价一个交易系统是一个很复杂的问题,这并不是用几个简单的指标(年化收益率、夏普比率等等)就能很好描述的,而且当下大家熟悉的指标都不是稳健的指标,并不能很好的描述这个交易系统的某个侧面,在后面我和大家讨论一些稳健的统计指标以及其他一些方面来综合描述一个交易系统,更多关于“稳健”的定义,请参看稳健统计学(RobustStatistics)的相关东西,这里不做深入的讲解。
当然最NB的检验一个交易系统的方式,就是“实战”!
其他方法仅仅能从方法论上给自己一个安慰,告诉上天我是在认认真真地最回测,做检验,阿弥陀佛!
4.K线图以及常用技术指标的Matlab实现-基于Matlab的量化投资
本次测试Demo使用数据,IF在20120104的主力数据-1分钟线。
数据形式:
2012-8-421:
31:
39上传
下载附件(53.16KB)
K线图实现:
2012-8-421:
31:
37上传
下载附件(50.29KB)
局部:
2012-8-509:
49:
18上传
下载附件(12.36KB)
该K线图实现与matlab自带的candle的K线图实现的区别是
matlab的candle生成的K线图阴线阳线的颜色是一样的,不能灵活设置。
该K线图可以灵活设置阴线阳线的颜色。
实现测试脚本代码:
1.%%K线图Matlab实现Demo
2.%byLiYang/faruto
3.%Email:
farutoliyang@
4.%2012/8/4
5.scrsz=get(0,'ScreenSize');
6.figure('Position',[11scrsz(3)*4/5scrsz(4)]);
7.
8.subplot(3,1,[12]);
9.OHLC=F(:
3:
6);
10.cndlV2(OHLC,0,'r','b','k');
11.xlim([1,length(OHLC)]);
12.
13. %%TickLabelSet
14. XTick=[];
15. XTickLabel=[];
16.
17. XTick=[XTick;1];
18. str=[num2str(F(1,1)),'-',num2str(F(1,2))];
19. XTickLabel{numel(XTickLabel)+1,1}=str;
20.
21. ind=find(F(:
2)==1000,1);
22. if~isempty(ind)
23. XTick=[XTick;ind];
24. str=[num2str(F(ind,1)),'-',num2str(F(ind,2))];
25. XTickLabel{numel(XTickLabel)+1,1}=str;
26. end
27.
28. ind=find(F(:
2)==1130,1);
29. if~isempty(ind)
30. XTick=[XTick;ind];
31. str=[num2str(F(ind,1)),'-',num2str(F(ind,2))];
32. XTickLabel{numel(XTickLabel)+1,1}=str;
33. end
34.
35. ind=find(F(:
2)==1400,1);
36. if~isempty(ind)
37. XTick=[XTick;ind];
38. str=[num2str(F(ind,1)),'-',num2str(F(ind,2))];
39. XTickLabel{numel(XTickLabel)+1,1}=str;
40. end
41.
42. ind=length(F(:
1));
43. XTick=[XTick;ind];
44. str=[num2str(F(ind,1)),'-',num2str(F(ind,2))];
45. XTickLabel{numel(XTickLabel)+1,1}=str;
46.
47. set(gca,'XTick',XTick);
48. set(gca,'XTickLabel',XTickLabel);
49. TickLabelRotate(gca,'x',30,'right');
50.
51.title('K线图Matlab实现Demo','FontWeight','Bold','FontSize',15);
52.
53.subplot(313);
54.bar(F(:
7));
55.xlim([1,length(OHLC)]);
56.title('成交量','FontWeight','Bold','FontSize',15);
57.
58. set(gca,'XTick',XTick);
59. set(gca,'XTickLabel',XTickLabel);
60. TickLabelRotate(gca,'x',30,'right');
复制代码
K线图函数代码(只需开高低收,即可画出K线图)
1.functioncndlV2(varargin)
2.%Seeifwehave[OHLC]orseperatevectorsandretrieveour
3.%requiredvariables(Feelfreetomakethiscodemorepretty;-)
4.isMat=size(varargin{1},2);
5.indexShift=0;
6.useDate=0;
7.
8.ifisMat==4,
9. O=varargin{1}(:
1);
10. H=varargin{1}(:
2);
11. L=varargin{1}(:
3);
12. C=varargin{1}(:
4);
13.else
14. O=varargin{1};
15. H=varargin{2};
16. L=varargin{3};
17. C=varargin{4};
18. indexShift=3;
19.end
20.ifnargin+isMat<7,
21. colorDown='k';
22. colorUp='w';
23. colorLine='k';
24.else
25. colorUp=varargin{3+indexShift};
26. colorDown=varargin{4+indexShift};
27. colorLine=varargin{5+indexShift};
28.end
29.ifnargin+isMat<6,
30. date=(1:
length(O))';
31.else
32. ifvarargin{2+indexShift}~=0
33. date=varargin{2+indexShift};
34. useDate=1;
35. else
36. date=(1:
length(O))';
37. end
38.end
39.
40.%w=Widthofbody,changemultipliertodrawbodythickerorthinner
41.%the'min'ensuresnoerrorsonweekends('timegapFri.Mon.'>wanted
42.%spacing)
43.w=.3*min([(date
(2)-date
(1))(date(3)-date
(2))]);
44.%%%%%%%%%%%Findupanddowndays%%%%%%%%%%%%%%%%%%%
45.d=C-O;
46.l=length(d);
47.holdon
48.%%%%%%%%drawlinefromLowtoHigh%%%%%%%%%%%%%%%%%
49.fori=1:
l
50. line([date(i)date(i)],[L(i)H(i)],'Color',colorLine)
51.end
52.%%%%%%%%%%drawwhite(oruserdefined)body(downday)%%%%%%%%%%%%%%%%%
53.n=find(d<0);
54.fori=1:
length(n)
55. x=[date(n(i))-wdate(n(i))-wdate(n(i))+wdate(n(i))+wdate(n(i))-w];
56. y=[O(n(i))C(n(i))C(n(i))O(n(i))O(n(i))];
57. fill(x,y,colorDown)
58.end
59.%%%%%%%%%%drawblack(oruserdefined)body(upday)%%%%%%%%%%%%%%%%%%%
60.n=find(d>=0);
61.fori=1:
length(n)
62. x=[date(n(i))-wdate(n(i))-wdate(n(i))+wdate(n(i))+wdate(n(i))-w];
63. y=[O(n(i))C(n(i))C(n(i))O(n(i))O(n(i))];
64. fill(x,y,colorUp)
65.end
66.
67.if(nargin+isMat>5)&&useDate,
68.% tlabel('x');
69. dynamicDateTicks
70.end
71.
72.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73.holdoff
复制代码
常见技术指标
1)MA(移动平均)
2)MACD(指数平滑异同移动平均线)
MACD的计算:
(1)计算短期(S日)指数移动平均线和长期(L日)指数移动平均线EMA1、EMA2。
(2)计算离差值DIF=EMA1-EMA2。
(3)计算DIF的N日指数移动平均线,即DEA。
(4)计算MACD=2*(DIF-DEA)。
3)DMA(平均线差指标)
DMA的计算:
(1)计算短期(S日)移动均线和长期(L日)移动均线MA1、MA2。
(2)计算平均线差DMA=MA1-MA2。
(3)计算DMA的M日移动平均线,即AMA。
4)TRIX(三重指数平滑移动平均指标)
TRIX的计算:
(1)计算N日的指数移动平均线EMA。
(2)对上述EMA再进行两次N日指数移动平均后得到TR。
(3)计算TRIX=(TR-昨日TR)/昨日TR*100。
(4)计算TRIX的M日简单移动平均MATRIX。
实现Demo
2012-8-421:
31:
38上传
下载附件(115.61KB)
实现测试脚本代码:
1.%%常见技术指标Matlab实现
2.%byLiYang/faruto
3.%Email:
farutoliyang@
4.%2012/8/4
5.%%MA
6.S=5;
7.L=20;
8.[SMA,LMA]=movavg(Data,S,L);
9.SMA(1:
S-1)=NaN;
10.LMA(1:
L-1)=NaN;
11.
12.scrsz=get(0,'ScreenSize');
13.figure('Position',[11scrsz(3)*4/5scrsz(4)]);
14.
15.subplot(221);
16.OHLC=F(:
3:
6);
17.cndlV2(OHLC,0,'r','b','k');
18.xlim([1,length(OHLC)]);
19. set(gca,'XTick',XTick);
20. set(gca,'XTickLabel',XTickLabel);
21. TickLabelRotate(gca,'x',30,'right');
22.
23.holdon;
24.H1=plot(SMA,'g','LineWidth',1.5);
25.H2=plot(LMA,'r','LineWidth',1.5);
26.title('常见技术指标SMA(简单移动平均线)Matlab实现Demo','FontWeight','Bold','FontSize',15);
27.M={'MA5';'MA20'};
28