




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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-2025學年湖北省十堰市鄖西縣
- 超市安全管理
- 2025年四川省安全員《A證》考試題庫
- 2024年山東省夏季普通高中學業水平合格考試歷史試卷
- 月子中心員工手冊管理制度
- 2025中考數學專項復習:最值問題之瓜豆原理模型(含答案)
- 醫藥制造與流通行業2024年信用回顧與2025年展望-新世紀評級
- 2025年浙江麗水景寧畬族自治縣交通發展集團有限公司招聘筆試參考題庫附帶答案詳解
- 《設備找正找平》課件
- 快消品行業市場調研與銷售策略制定
- 2024年度小紅書商業MCN機構經營洞察報告
- 中國嬰幼兒 科學配餐與食品制作指導手冊
評論
0/150
提交評論