版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、开源分布式量化交易系统一一回测系统(一)回测系统基础概念在开始编写策略系统之前,需要了解一些基础概念,搞明白什么是回测系统?怎么进行回测?如何进行回测分析?并且在回测中需要注意的一些要素,真正的做到有效的策略回测。根据回测的精度可分为Bar回测和Tick回测,所谓的Bar是指一根包含上下引线的柱体,由开盘价、最高价、最低价、收盘价、成交量、成交额、持仓量、时间等组成的分钟、小时、天、周或年的数据,这种方式回测速度快但精度不够细,适用于中低频策略;而Tick由最新价、卖一价、卖一量、买一价、买一量、成交量、成交金额、持仓量、时间等组成的实时数据,这种方式精度细回测慢,适用于高频策略或针对中低频策
2、略进行分段精细测试。回测了最关键的是数据,但数据清理和检验是一件繁琐但又非常重要的事情,因为数据是策略回测的根源,根源出错了,所有的分析都是白费,所以找一份靠谱的数据源至关重要。而对于期货品种来说,会涉及到换月问题,这里引入“主力复权合约”这个名词,主力换月通常会根据当天收盘后的成交量或持仓量进行判断是否需要将老的主力合约切到最活跃的合约上去,同时将换月缺口补齐,让数据的连续性更好,这样就形成了主力复权合约;通常历史回测需要加载较长一段时间数据进行测试,并且要考虑换月问题,所以用处理好的主力复权合约数据进行回测是最方便和最科学的方式。有了历史数据就可以通过程序按时间先后顺序进行遍历,在遍历过程
3、中加载策略逻辑,通过逻辑发出买卖信号并模拟产生成交,同时对每一笔的交易进行统计,如:记录交易次数、盈亏、手续费、最大盈利、最大回撤等分析指标。最终生成一份完整的策略报告用于评测策略的优劣。策略编写时常常还会用到指标,所谓的指标即用一组数据利用各种数学公式计算得出一组新的数据,通常指标分为趋势类、震荡类、量能类等,如:MA均线、KDJ、MACD、BOLL、RSI、SAR、CCI、VOL等。而这些指标有了这些概念,可以通过各种方式进行回测,如果数据不大,ExceI也能达到回测效果,但是为了能更高效进行回测,需要搭建自己的回测系统,把一些重复的代码抽出来复用,并搭建好回测系统的结构,让策略编写人员的
4、专注力放在策略逻辑上和分析上,而不是侧重于对数据整理、指标封装、信号入库等,本教程回测系统的架构如下:园测T人AFTMAlNEpng回测T-ACDEALER回测中心ROUTERPULLDEA_EPUSH回测工人内部回测逻辑|初始化策略遍历数据开始PJSH产生交易信号生成报告数组成:InitStrategy、为了方便今后回测系统与实/-JJXJ/1_II1、/J、-VU-J-X-、-j、vwIVf-/x5jx-v11JJi*i1zzsji-*i1iRtnTickData、RtnBarData、RtnRspOrder、RtnRspTrade等。注意点策略编写过程中避免使用未来函数报告分析时必须考虑
5、滑点,实盘滑点是避免不了的实盘交易时考虑换月问题和下单方式(需封装算法单)盘后需要对信号进行检验,避免实盘和回测的运行结果不一致定期回顾策略,不断优化、顺应市场下面我们分别对指标库、回测中心、回测工人进行代码解析,并实战演练一下策略开发,并且对策略进行分析。指标库概念介绍指标的某一时间点的Bar数据是对应这个时间点的一组指标数据,所以内部Bar的序列数量和指标序列数量是一一对应的,由于一个指标一个时间点存在多个值,所以用Dictionary进行分组保存每个时间点的值,最后通过遍历每个时间点,根据Bar数据进行公式计算即可得出一组指标数据,并将数据存放于ValueDict中供用户调用。基类中的G
6、raphDict是用于存放画图用的值,后期介绍图形库的时候会详细介绍,下面看下具体指标基类的代码:publicclassBaseindicatorprivateint_count;privateint_maxCacheCount=10;protectedListbarDatas;protectedDictionaryvstring,ListvalueDict;protectedDictionarygraphDict;publicBaselndicator(Listbars)barDatas=newList();if(bars!=null)barDatas.AddRange(bars);_cou
7、nt=barDatas.Count;valueDict=newDictionarystring,List();graphDict=newDictionary();protectedvirtualvoidCaculate()if(IsSimpleMode)if(barDatas.CountMaxCacheCount)barDatas.RemoveRange(0,barDatas.Count-MaxCacheCount);graphDict.Clear();GC.Collect();#region公共属性/指标名称/publicstringNameget;set;/指标描述/publicstrin
8、gDescriptionget;set;/是否在主图上显加/publicboolIsShowInMainget;set;/标签/publicstringTagget;set;/精简模式/publicboolIsSimpleModeget;set;/数据字典/publicDictionaryvstring,ListValueDictgetreturnvalueDict;/图形字典/publicDictionaryvstring,lndicatorGraphGraphDictgetreturngraphDict;/数量/publicintCountgetreturn_count;set_count
9、=value;/缓存Bar数量/publicintMaxCacheCountgetreturn_maxCacheCount;set_maxCacheCount=value;#endregion#region公共方法/添加参考线/publicvoidAddGuidLine(stringname,doublevalue,Colorcolor,EnumLineStylelineStyle=EnumLineStyle.DotLine)if(!graphDict.ContainsKey(name)vargraph=newIndicatorGraph()Name=name,LineStyle=lineSt
10、yle;graph.AddValue(value,color);graphDict.Add(name,graph);/删除参考线/publicvoidDelGuidLine(stringname)graphDict.Remove(name);/根据索引获取Bar数据(0-最新一根,1-前一根,以此推类)/publicBarDataGetBarData(intindex=0)if(indexCount)returnbarDatasbarDatas.Count-index-1;elsereturnnull;/获取最新缓存Bar数据/publicListGetBarDatas()returnbarD
11、atas;/绑定数据/publicvoidBindData(Listdatas)barDatas.Clear();barDatas.AddRange(datas);Caculate();/添加Bar数据至最后/publicvirtualvoidAddBarData(BarDatabar)barDatas.Add(newBarData(bar);if(IsSimpleMode&barDatas.CountMaxCacheCount)barDatas.RemoveAt(O);_count+;/更新Bar数据/publicvirtualvoidUpdateBarData(BarDatabar)bar
12、DatasbarDatas.Count-1=newBarData(bar);/插入Bar数据/publicvoidInsertBar(intindex,BarDatabar)if(indexMaxCacheCount)barDatas.RemoveAt(O);_count+;Caculate();/批量添加Bars/IllpublicvoidAddBars(Listbars)barDatas.AddRange(bars);_count+=bars.Count;Caculate();/Ill批量插入BarsIllIlllllpublicvoidInsertBars(intindex,Listba
13、rs)if(indexbarDatas.Count)if(barsbars.Count-1.RealDateTime=barDatasindex.RealDateTime)barDatas.RemoveAt(index);/删除第一根实时接收Bar数据_count-;_count+=bars.Count;barDatas.InsertRange(index,bars);Caculate();llllll获取最新一组数据llllllpublicDictionarystring,doubleGetLastValues()DictionaryresultDict=newDictionary();fo
14、reach(varvdinvalueDict)if(Count!=0)resultDict.Add(vd.Key,vd.ValueCount-1);elseresultDict.Add(vd.Key,JPR.NaN);returnresultDict;#endregion案例介绍MA指标MA是最简单的一个指标,又称“简单移动平均线”,通常有一个长度参数,用于计算这个长度的数据的平均值。构造函数中需传入barDatas数据集合,isShowlnMain和tag都是后期画图用参数,其余参数可以根据策略不同定义不同参数。SetParameters用于调整参数并重新计算指标值。GenerateSMA计
15、算指标值,并将结果存放于valueDict中,主要逻辑全部在该函数内实现。UpdateBarData和AddBarData在新数据过来时进行更新指标。GetData、GetValues、GetValue、GetLast等都是取值函数。publicclassMA:BaseindicatorprivateEnumBarStructbarStruct;privateint_length;privateint_length;privateAveragesaverages;publicMA(ListbarDatas,EnumBarStructobjBarStruct=EnumBarStruct.Clos
16、e,intlength=10,boolisSimpleMode=true,boolisShowInMain=true,stringtag=1):base(barDatas)Tag=tag;_length=length;barStruct=objBarStruct;IsSimpleMode=isSimpleMode;stringparamTag=string.Format(0,1),barStruct.ToString(),ength);Name=string.Format(MA0,paramTag);Description=;valueDict.Add(MA,newList();if(HsSi
17、mpleMode)graphDict.Add(MA,newIndicatorGraph()Name=MA,Tag=paramTag,LineStyle=EnumLineStyle.SolidLine);averageS=newAverageS();IsShowInMain=isShowInMain;Caculate();publicvoidSetParameters(EnumBarStructobjBarStruct,intlength)if(objBarStruct!=barStruct|length!=_length)stringparamTag=string.Format(0,1),ob
18、jBarStruct.ToString(),length);Name=string.Format(MA0,paramTag);if(HsSimpleMode)graphDictMA.Tag=paramTag;barStruct=objBarStruct;_length=length;Caculate();protectedoverridevoidCaculate()valueDictMA.CIear();if(!IsSimpleMode)graphDictMA.Clear();averageS.SetParameters(_length);if(barDatas!=null&Count!=0)
19、for(inti=0;i=barDatas.Count)curData=GetBarData(O);elsecurData=barDatasi;doublevalue=averageS.AddValue(GetData(curData);valueDictMA.Add(value);if(HsSimpleMode)graphDictMA.AddValue(value,Color.Yellow);publicoverridevoidUpdateBarData(BarDatabar)base.UpdateBarData(bar);valueDictMA.RemoveAt(Count-1);if(HsSimpleMode)graphDictMA.RemoveLast();averageS.RemoveLast();GenerateSMA(Count-1);publicoverridevoidAddBarData(BarDatabar)base.AddBarData(bar);GenerateSMA(Count-1);privatedoubleGetData(BarDatabar)doubledata
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度产品销售与代理合同
- 2024年度建筑工程设计与施工合同标的详细描述
- 2024年度汽车修理工作室合作合同
- 2024年度工厂企业生产线扩建合同
- 2024年度城市轨道交通照明系统合同
- 2024年度家居用品市场调查与研究合同
- 空气净化制剂市场需求与消费特点分析
- 2024年度个人车库租赁合同模板
- 电动器械用电枢市场发展现状调查及供需格局分析预测报告
- 2024年度智慧城市建设项目拆迁补偿合同
- 2024-2030年中国重水市场运行态势与未来竞争力剖析报告
- DL∕T 5537-2017 火力发电厂供热首站设计规范
- 2024版月子中心合同范本
- JGJ8-2016建筑变形测量规范
- 健身器材供货方案(技术方案)
- 信息化平台管理制度
- 2024年版-生产作业指导书SOP模板
- JT-T-816-2011机动车维修服务规范
- 儿童游乐设施:物业管理手册
- 休克的诊断与鉴别诊断
- 2024年医师定期考核人文医学题库试题+答案
评论
0/150
提交评论