COCO研究院

 找回密碼
 註冊
搜索
樓主: 小娃

[教學] 如何用AmiBroker做績效回測(作者 michael-knight)

[複製鏈接]
 樓主| 發表於 09-12-15 13:02 | 顯示全部樓層

Amibroker客制化回朔測試,使用者能精細控制回朔測試引擎。參照Code 3, AFL於Pass1進行信號和數值陣列收集,AFL函式Applystop規範的出場價格點,此時動作類為”actionBacktest” ,第二回合跑客制化程序(Pass2),此時動作類型為”actionPortfolio”
Individual-level客製化回朔測試,每檔股票會執行一次客制化程序;Portfolio-level客製化回朔測試,僅執行一次客制化程序,舉3檔股票範例其執行流程如表格 4Portfolio-level對每檔股票掃過pass1後,有成交的時間點依聯集方式產生一組新的時間序列,序列大小當作Barcount,每檔股票的陣列變數如價格陣列長度都一致調成Barcount,沒有成交明細的時間點其陣列值以N/ANULL{empty}填入,如表格 5範例示意,當掃描每根K棒時,依序處理該時間點每檔股,此時正在處理的股票其價格陣列變數以SetForeign函式取得,用完後再以RestorePriceArrays回存。


圖表 6客制化程序致能,並指定存放客制化程序的檔案,圖表 1所示AA視窗按下”Backtest”Individual or Portfolio,AFL執行時期就會進入客制化回朔測試;另一種方式可以在AFL開啟客制化回朔測試,進入CB後,AmibrokerCOM元件開放CBI客制化回朔測試介面,物件諸元backtester、trade、signal, CB下用函式GetBacktesterObject才會有意義,否則回傳Null

 樓主| 發表於 09-12-15 13:03 | 顯示全部樓層


Ticker

Ticker1

Ticker1

Ticker2

Ticker2

Ticker3

Ticker3

Individual CB

Pass1

Pass2

Pass1

Pass2

Pass1

Pass2

N/A

Portfolio CB

Pass1

N/A

Pass1

N/A

Pass1

N/A

Pass2


表格 4
Individual
Portfolio CB AFL執行流程




p8.gif

表格 5
Portfolio-level
時間序列與陣列前置處理

 樓主| 發表於 09-12-15 13:11 | 顯示全部樓層
p9.gif

圖表 5
回朔測試參數選項設置視窗

 樓主| 發表於 09-12-15 13:11 | 顯示全部樓層

最進階操作CBI我們可以利用CBI架上訂單管理層,將交易信號、交易價格、時間、訂單編號欄位加入,實現限價單(IOCPending-Order),使用者可以操作開倉、平倉、更改訂單等動作。




  1. SetOption("UseCustomBacktestProc", True ); //進入CB,CB程序直接寫在底下<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  2. SetCustomBacktestProc( "C:\\MyPath\\MyCustomBacktest.afl" ); //進入CB,指定含入的CB程序
  3. if  ( Status("action") == actionBacktest  ) {
  4. //pass1 code region,put basic backtest assignment & options setting
  5. /*2. trading position type, Buy/Sell or /Short/Cover assignment*/
  6. Buy = C < 39.00; Sell = 0; Short = 0; Cover = 0;
  7. _Trace(Name()+“Current working action: Backtest”);
  8. }
  9. else
  10. if  ( Status("action") == actionPortfolio ) {
  11. //pass2 code region
  12. printf(“Current working action: cunstom backtest”);
  13. // retrieve the COM interface to portfolio backtester
  14.        bo = GetBacktesterObject();
  15.     bo.backtest();  //run the default backtest procedure
  16. //add custom backtest procedure here
  17. }

複製代碼

Code 3
AFL
客制化回朔測試

 樓主| 發表於 09-12-15 13:12 | 顯示全部樓層

Backtester物件方法依彈性度控的制層次分成高中低,參照[1][3]裡有詳細的backtester物件詳細操作方法和屬性,若只需要簡單加入回朔測試效能因子至回朔測試報告,用高階層次和調用預設回朔測試程序即可達成




  1. /* Now custom-backtest procedure follows */<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  2. if( Status("action") == actionPortfolio )
  3. {
  4. bo = GetBacktesterObject();
  5. bo.Backtest(); // run default backtest procedure
  6. st = bo.GetPerformanceStats(0); // get stats for all trades
  7. expectancy = st.GetValue("WinnersAvgProfit")*st.GetValue("WinnersPercent")/100 +
  8. st.GetValue("LosersAvgLoss")*st.GetValue("LosersPercent")/100;
  9. // Here we add custom metric to backtest report
  10. bo.AddCustomMetric( "Expectancy ($)", expectancy );
  11. }

複製代碼


Code 4
CBI
範例一,高階使用方式

 樓主| 發表於 09-12-15 13:13 | 顯示全部樓層
p10.gif

圖表 6
回朔測試參數選項設置Portfolio tab視窗

 樓主| 發表於 09-12-15 13:14 | 顯示全部樓層

中階使用,signal、trade物件為backtester物件的成員,交易信號經處理後放至signal物件,執行迴圈處理每一根K棒,使用者完全管控該信號處理方式,是否做實際交易,根據當時淨值調整每筆交易部位大小(固定金額),管控持有倉位淨值佔總淨值水位,這些都能達成。



  1. if( Status("action") == actionPortfolio ) {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  2. bo = GetBacktesterObject();
  3. bo.PreProcess();
  4. for ( bar = 0; bar < BarCount; bar++ ) {
  5. /* custome backtest procedure start here*/
  6. CurrentPortfolioEquity = bo.Equity;
  7. for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) ) {
  8. if( CurrentPortfolioEquity > 50000 ) sig.PosSize = -20;
  9. if( CurrentPortfolioEquity > 60000 ) sig.PosSize = -16;
  10. if( CurrentPortfolioEquity > 80000 ) sig.PosSize = -12;
  11. }
  12. /* custome backtest procedure end here*/
  13. bo.ProcessTradeSignals( bar );
  14. }
  15. bo.PostProcess();
  16. }
複製代碼


Code 5
CBI
範例一,中階使用方式

 樓主| 發表於 09-12-15 13:14 | 顯示全部樓層
方法PreProcess初始化回朔測試所需用到的變數,ProcessTradeSignal結合交易信號、交易價格落在K棒範圍內則會成交,將實際交易產生倉位記錄至trade物件, 每個trade物件管理一筆交易,交易記錄是由很多trade物件組成,分成成交且已平倉之交易與未平倉之交易。方法PostProcess將未平倉之交易關閉並產生最後回朔測試報告。Backtester的方法backtest實現預設回朔測試,等效於中階操作執行一次方法PreProcess、每個bar執行ProcessTradeSignal、執行一次PostProcess這三個方法封裝而成的處理程序。

若我們希望交易的條件不再局限在交易信號、交易價格,實現分批交易,完全掌控進場與出場,則可以自行規範進場與出場策略機制,直接呼叫最低階的EnterTrade和ExitTrade方法來操作trade物件,中階方法ProcessTradeSignal內部最後即是呼叫此兩個方法實際交易,也包含低階方法UpdateStats、HandleStops ,MaxOpenPosition、可下單餘額是否足夠於方法EnterTrade內比對。HandleStops處理ApplyStop或AA-->setting-->”Stop tab”設定的出場條件,HandleSops執行的時間點以ActivateStopsImmediately選項參數區分成實際交易之前或之後,放置於實際交易之前表示當有Stop出場部位所釋放的資金可在該K棒被使用,放置於實際交易之後表示該K棒無法立即用到即將出場部位所釋放的資金。

把backtester最底層函式包裝成訂單管理功能界面,此界面方便使用者於新增、退出或修改訂單時能綁定掛單類型、滑點控制、停損停利、移動式停損停利,還能記錄訂單完整歷程。
 樓主| 發表於 09-12-15 13:17 | 顯示全部樓層
  1. if( Status("action") == actionPortfolio ) {
  2. bo = GetBacktesterObject();
  3. bo.PreProcess();
  4. //encapsulate low-level method to build Order manage layer contain bellow feature
  5. /* full control trade signal & trade price, decide your own trade conditions */
  6. /* which signal do you want to deal with */
  7. /* limit IOC(immediate or cancel) and pending Order */
  8. /* slippage control */
  9. /* Apply any type stop opened position */
  10. for ( bar = 0; bar < BarCount; bar++ ) {
  11. if (GetOption("ActivateStopsImmediately")==True)
  12. bo.HandleStops(bar);
  13. //process all signal object
  14. for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) ) {
  15. if (sig.IsEntry()) {
  16. }
  17. if (sig.IsExit()) {
  18. }
  19. }
  20. if (GetOption("ActivateStopsImmediately")==True)
  21. bo.HandleStops(bar);
  22. bo.UpdateStats(bar, 2);
  23. }
  24. bo.PostProcess();
  25. }
複製代碼

Code 6
CBI
範例,低階使用框架

 樓主| 發表於 09-12-15 13:18 | 顯示全部樓層

四、訂單管理

訂單型態分成立即成交否則取消(IOC)及等待單(Pending Order),IOC單若未能在下一盤搓合成功單子會立刻進入取消,等待單則是掛出後會一直等候成交。交易所的市價單應該歸類成等待單,依掛單時間與價格優先排隊,市價單價格以最高買價買入和以最低賣價賣出以搶得較高優先權。AB預設回朔測試執行計畫先處理完交易信號,產生交易信號物件串列,在每個交易信號上做實際交易,此實際交易一定會成交,在現實市場中我們可能會希望在交易信號發生後,掛出比現在價格更高點賣出或更低點買入,因此額外動作需要把訂單收集,然後每根K棒去檢查等待單有否可以成交。交易所或券商的掛單附加額外功能還會實作各種出場機制,常見的有最大停損點、最大獲利、移動式停利(trailing stop)。AB是以Applystop函式或AA視窗”Stop tab”裡做出場條件設定,出場條件機制以大於或小於某個價位點來呈現,回朔測試每個回合針對開倉還未平倉的訂單匹配是否符合出場條件,符合就進行平倉,操作低階的CBI是調用backtester物件的Handlestop來執行此任務。


為AB bactest架上訂單管理層目地是為了實現交易所或券商對訂單支援的功能,訂單管理實作上拆成行為層,規範操作行為規則與狀態轉移,表格 6
描述每筆訂單包含等待、已成交、關閉三種狀態,等待單允許被取消或改單(價格或掛單數量) ,已成交單可以允許平倉或修改出場點。訂單spool包含一些基本資訊欄位表格 7
,實作上可以串列紀錄每一筆訂單所有動作。當策略決定要下單,調用OrderSend送出一筆訂單,該訂單誕生,訂單管理層模擬交易所或券商訂單行為規則,最終再調用AB backtester的EnterTrade/ExitTrade實際進出場;回測過程中有需要調整出場條件,或者直接呼叫OrderDelete、OrderClose結束訂單。

 樓主| 發表於 09-12-15 13:20 | 顯示全部樓層
p11.gif

表格 6
訂單運作行為


p12.gif

表格 7
訂單基本資料結構欄位

 樓主| 發表於 09-12-15 13:21 | 顯示全部樓層

五、回朔測試與真實交易系統


回朔測試模擬真實市場交易情境,整合了交易策略、計算指標運算、交易所與券商訂單管理功能、投資組合管理(portfolio-manage) 、即時部位權益數狀態分析(可動用資金、淨值、損益分析),這樣的即時系統需把歷史資料一筆筆掃瞄,更新訂單spool狀態,投資組合管理最新統計資訊,運算策略產生交易信號AB的環境之下發展真實AT交易系統模組整合接收最新報價、運行交易策略、處理訂單,說明群益報價、下單及成交回報API建置此系統



l接收即時資料,更新至AB的資料庫。報價APInon-blocking方式監看伺服器,有資料到達時,callback方式至使用者函式,callback函式註冊是保存函式進入點至指標變數供回調呼叫,API那端回調時可以經由working thread直接跳至或訊息通知UI thread進入,群益所有的回調都是佔用main UI thread


l下單應該在成交回報連線狀態正常之下才允許進行,足以監看由AFL操作訂單之後的訂單狀態改變。成交回報也由單一支working thread監看連線,有新成交回報產生,跳入Callback函式更新本地端訂單spool,同樣地成交回報的回調函式執行緒角色亦為UI thread


l報價、下單、成交回報均運行於main UI thread,已經避免掉multi-thread帶來的變數資料讀寫存取同步問題,但相對來說這三大動作佔用的執行時間配置就變得相當重要。


l手動啟動AT,以AFL運行於scanfilter,勾選AA視窗上”run every xxx,AB的AT觸發架構無法與接收即時資料整合在同個流程下,而是在UI thread下設置一個timer事件,每次執行用靜態記下最新tick資料的日期時間與BarCount。


lAT連續2次AFL時間間隔,掛單、刪改單需讓本地端訂單spool與券商、交易所端訂單狀態同步,計算最新權益數。


l盤後離線時所有開倉和已平倉之交易保存匯出,投資組合管理軟體匯進報價,進行投資部位效益衡量因子分析(淨值變化、獲利期望值、勝率)。這種報告用來當作中長財務資金投資規劃,用以檢驗成效紀錄。


l系統當機或異常危機處理(含人工輔助)



Reference:
[1]        Porfolio Backtester Interface Reference Guide
[2]        http://www.amibroker.com/kb/category/afl/custom-backtest/
[3]        http://www.amibroker.com/docs/Houston2.pdf
[4]        Portfolio-level backtesting
[5]        Back-testing your trading ideas
[6]        Backtesting systems for futures contracts

發表於 09-12-15 13:43 | 顯示全部樓層
推!好文!
michael大大真是太厲害了!
發表於 09-12-15 14:00 | 顯示全部樓層
好複雜看不懂
感覺michael大好像是住國外,英文強真好
發表於 09-12-15 14:48 | 顯示全部樓層
michael大的程度超越我們太多了
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-11-23 12:30

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |