自動構建主力合約--自動實現歷史測試之前的數據選取工作 [開拓者 TB]
- 咨詢內容:
筆者踏入期貨市場多年,學習了不少技術分析方法,也接觸了一些前沿理念,而期貨市場日益興起的程序化交易方法就是其中重要的一種。
程序化交易,即是指將人的操作理念和風險控制原則等編制為計算機的某種特定軟件可執行的代碼,由計算機代為執行。從而減少因為人性的弱點而執行起來產生偏差的情況。同時,使用程序化交易系統也可以對人的操作起到有益的輔助作用,減輕人的負擔。
愿望是美好的,程序化交易理念的產生應該也是基于以上的美好目標。可是要編制出一套完整有效和穩定的程序化交易系統出來,卻并非易事。先不說前期的量化和代碼轉化等問題,即使是這些問題都已經解決了,那也只能說是我們的程序化交易系統才完成一小半。為什么呢?因為我們還有更重要的測試工作要做。一個沒有經過測試并優化改進的系統,是萬萬不可貿貿然投入實戰的。
由于我們是立足于對過去已經發生的事件和行情所編制的系統,所以第一步我們應該測試在歷史行情上的表現如何,如果在歷史測試中都表現平平,那大概就是我們總結歸納出來的方法有問題,是沒有任何實際使用價值的。在此基礎上,如果測試效果不錯,我們再將系統應用于實盤上跟蹤觀測一段時間。在確保沒有新的問題和不穩定因素出現的情況下,我們才可以投入真金白銀進去。
可見第一步的歷史測試相當重要,它的結果幾乎就決定了后續工作的開展與否。了解程序化交易的朋友們都知道,目前國內普遍使用的可支持程序化交易的交易軟件也就那么2-3家,他們分別是文華財經、金狐交易師和交易開拓者。其中最為普遍的還是文華財經的WebStock,目前最新版本是2008版。可是筆者卻不怎么喜歡該軟件:函數少,自定義擴展功能也不怎么樣,數據還經常變來變去不真實。而金狐交易師是由鼎鼎大名的飛狐交易師演變而來,由于其本身固有的特點以及營銷模式的問題,目前國內似乎只有中國國際期貨公司才為客戶提供該軟件,一般客戶難以享受到該軟件的強大功能。那么,就剩下最后一款軟件了:交易開拓者,又稱TB。事實上,筆者該次的試驗就是建立在該軟件之上的,沒有該軟件,就不會有本文的產生。
為什么要選擇交易開拓者做為我們本次分析研究的平臺,這要歸因于歷史數據的選取上。很多步入程序化交易領域的交易員——有些甚至已經堪稱“元老”級人物,卻還是不知道該如何來進行歷史測試。常見的就是看到有人說自己研發出一套系統,宣稱盈利和各方面表現都非常可觀,再一看他的測試周期——直接跨度幾年。我們都知道,期貨市場不同于股票,是存在換月和主力合約與非主力合約一說的。我很懷疑他們的方法難道在一天成交量不足1手的情況下也能發揮出系統本人宣稱的“奇效”。所以我比較贊同的,是程序化交易中一直存在的另一種理性的聲音:分段截取主力合約數據來檢驗系統的有效性。
數據收集工作,看似簡單。如果歷史測試回溯時間不長,那我們大可以人工選擇并截取,但是如果測試時間跨度長達幾年呢?如果能夠用電腦程序來自動篩選提取那是最好不過了。而要實現編程自動實現這一目的,目前來看,只有運用TB強大的合約疊加功能才能實現。
附完成圖:
1.JPG (126.11 KB, 下載次數: 9) 2009-3-9 14:10:30 上傳
- TB技術人員:
- //------------------------------------------------------------------------
- // 簡稱: ZLHY
- // 名稱: 主力合約
- // 類別: 技術指標
- // 類型: 其它類
- // 輸出:
- //------------------------------------------------------------------------
- Vars
- Numeric Major(0);
- Numeric Con0;
- Numeric Con1;
- Numeric Con2;
- Numeric Con3;
- Numeric Con4;
- Numeric Con5;
- Numeric Con6;
- Numeric Con7;
- Numeric Con8;
- Numeric Con9;
- Numeric Con10;
- Numeric Con11;
- Numeric MyOpen;
- Numeric MyHigh;
- Numeric MyLow;
- Numeric MyClose;
- Begin
- CON0=AverageFC(DATA0.OPENINT(),5);
- CON1=AVERAGEFC(DATA1.OPENINT(),5);
- CON2=AVERAGEFC(DATA2.OPENINT(),5);
- CON3=AVERAGEFC(DATA3.OPENINT(),5);
- CON4=AVERAGEFC(DATA4.OPENINT(),5);
- CON5=AVERAGEFC(DATA5.OPENINT(),5);
- CON6=AVERAGEFC(DATA6.OPENINT(),5);
- CON7=AVERAGEFC(DATA7.OPENINT(),5);
- CON8=AVERAGEFC(DATA8.OPENINT(),5);
- CON9=AVERAGEFC(DATA9.OPENINT(),5);
- CON10=AVERAGEFC(DATA10.OPENINT(),5);
- CON11=AVERAGEFC(DATA11.OPENINT(),5);
- If(Con0 > Major)
- {
- Major = Con0;
- MyOpen = Data0.Open;
- MyHigh = Data0.High;
- MyLow = Data0.Low;
- MyClose = Data0.Close;
- }
- If(Con1 > Major)
- {
- Major = Con1;
- MyOpen = Data1.Open;
- MyHigh = Data1.High;
- MyLow = Data1.Low;
- MyClose = Data1.Close;
- }
- If(Con2 > Major)
- {
- Major = Con2;
- MyOpen = Data2.Open;
- MyHigh = Data2.High;
- MyLow = Data2.Low;
- MyClose = Data2.Close;
- }
- If(Con3 > Major)
- {
- Major = Con3;
- MyOpen = Data3.Open;
- MyHigh = Data3.High;
- MyLow = Data3.Low;
- MyClose = Data3.Close;
- }
- If(Con4 > Major)
- {
- Major = Con4;
- MyOpen = Data4.Open;
- MyHigh = Data4.High;
- MyLow = Data4.Low;
- MyClose = Data4.Close;
- }
- If(Con5 > Major)
- {
- Major = Con5;
- MyOpen = Data5.Open;
- MyHigh = Data5.High;
- MyLow = Data5.Low;
- MyClose = Data5.Close;
- }
- If(Con6 > Major)
- {
- Major = Con6;
- MyOpen = Data6.Open;
- MyHigh = Data6.High;
- MyLow = Data6.Low;
- MyClose = Data6.Close;
- }
- If(Con7 > Major)
- {
- Major = Con7;
- MyOpen = Data7.Open;
- MyHigh = Data7.High;
- MyLow = Data7.Low;
- MyClose = Data7.Close;
- }
- If(Con8 > Major)
- {
- Major = Con8;
- MyOpen = Data8.Open;
- MyHigh = Data8.High;
- MyLow = Data8.Low;
- MyClose = Data8.Close;
- }
- If(Con9 > Major)
- {
- Major = Con9;
- MyOpen = Data9.Open;
- MyHigh = Data9.High;
- MyLow = Data9.Low;
- MyClose = Data9.Close;
- }
- If(Con10 > Major)
- {
- Major = Con10;
- MyOpen = Data10.Open;
- MyHigh = Data10.High;
- MyLow = Data10.Low;
- MyClose = Data10.Close;
- }
- If(Con11 > Major)
- {
- Major = Con11;
- MyOpen = Data11.Open;
- MyHigh = Data11.High;
- MyLow = Data11.Low;
- MyClose = Data11.Close;
- }
- PlotNumeric("High",MyHigh);
- PlotNumeric("Open",MyOpen);
- PlotNumeric("Low",MyLow);
- PlotNumeric("Close",MyClose);
- End
- //------------------------------------------------------------------------
- // 編譯版本 GS2004.06.12
- // 用戶版本 2008/08/21 16:15
- // 版權所有 hedgehog
- // 更改聲明 TradeBlazer Software保留對TradeBlazer平臺
- // 每一版本的TrabeBlazer公式修改和重寫的權利
- //------------------------------------------------------------------------
- //------------------------------------------------------------------------
- TB客服:
已經附上指標代碼
有需要的可自行稍作修改,加入文字提示,這樣就可以大大方便系統歷史測試之前的數據選取工作了。
明眼人一眼就可以看出來,我的構建依據是持倉量的5日平均,以最大的那個合約作為主力合約
實際中發現 把OPENINT()換成VOL()可能更好,因為在主力合約的變換上面,成交量的變化更先于持倉量。
本文僅做拋磚引玉只用,歡迎斧正
[ 本帖最后由 hedgehog 于 2009-3-9 14:26 編輯 ] - 網友回復:
很不錯.謝謝hedgehog 分享.
- 網友回復:
不錯,加精
如果以上指標公式不適用于您常用的行情軟件
或者您想改編成選股公式,以便快速選出某種形態個股的話,
- 上一篇:加倉問題
- 下一篇:咨詢一些CTP的問題 - TradeBlazer公式
相關文章
-
指定的模型還沒有相關內容!