小娃 發表於 09-12-15 13:02

Amibroker客制化回朔測試,使用者能精細控制回朔測試引擎。參照Code 3, AFL於Pass1進行信號和數值陣列收集,AFL函式Applystop規範的出場價格點,此時動作類為”actionBacktest” ,第二回合跑客制化程序(Pass2),此時動作類型為”actionPortfolio”
。Individual-level客製化回朔測試,每檔股票會執行一次客制化程序;Portfolio-level客製化回朔測試,僅執行一次客制化程序,舉3檔股票範例其執行流程如表格 4。Portfolio-level對每檔股票掃過pass1後,有成交的時間點依聯集方式產生一組新的時間序列,序列大小當作Barcount,每檔股票的陣列變數如價格陣列長度都一致調成Barcount,沒有成交明細的時間點其陣列值以N/A或NULL{empty}填入,如表格 5範例示意,當掃描每根K棒時,依序處理該時間點每檔股,此時正在處理的股票其價格陣列變數以SetForeign函式取得,用完後再以RestorePriceArrays回存。
將圖表 6客制化程序致能,並指定存放客制化程序的檔案,圖表 1所示AA視窗按下”Backtest”(Individual or Portfolio),AFL執行時期就會進入客制化回朔測試;另一種方式可以在AFL開啟客制化回朔測試,進入CB後,Amibroker以COM元件開放CBI客制化回朔測試介面,物件諸元backtester、trade、signal, CB下用函式GetBacktesterObject才會有意義,否則回傳Null。

小娃 發表於 09-12-15 13:03


Ticker Ticker1Ticker1Ticker2Ticker2Ticker3Ticker3 Individual CBPass1Pass2Pass1Pass2Pass1Pass2N/APortfolio CBPass1N/APass1N/APass1N/APass2
表格 4
Individual和Portfolio CB AFL執行流程


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

小娃 發表於 09-12-15 13:11


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

小娃 發表於 09-12-15 13:11

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


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

Code 3
AFL客制化回朔測試

小娃 發表於 09-12-15 13:12

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


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


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

小娃 發表於 09-12-15 13:13


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

小娃 發表於 09-12-15 13:14

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

if( Status("action") == actionPortfolio ) {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
bo = GetBacktesterObject();
bo.PreProcess();
for ( bar = 0; bar < BarCount; bar++ ) {
/* custome backtest procedure start here*/
CurrentPortfolioEquity = bo.Equity;
for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) ) {
if( CurrentPortfolioEquity > 50000 ) sig.PosSize = -20;
if( CurrentPortfolioEquity > 60000 ) sig.PosSize = -16;
if( CurrentPortfolioEquity > 80000 ) sig.PosSize = -12;
}
/* custome backtest procedure end here*/
bo.ProcessTradeSignals( bar );
}
bo.PostProcess();
}

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

if( Status("action") == actionPortfolio ) {
bo = GetBacktesterObject();
bo.PreProcess();
//encapsulate low-level method to build Order manage layer contain bellow feature
/* full control trade signal & trade price, decide your own trade conditions */
/* which signal do you want to deal with */
/* limit IOC(immediate or cancel) and pending Order */
/* slippage control */
/* Apply any type stop opened position */
for ( bar = 0; bar < BarCount; bar++ ) {
if (GetOption("ActivateStopsImmediately")==True)
bo.HandleStops(bar);
//process all signal object
for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) ) {
if (sig.IsEntry()) {
}
if (sig.IsExit()) {
}
}
if (GetOption("ActivateStopsImmediately")==True)
bo.HandleStops(bar);
bo.UpdateStats(bar, 2);
}
bo.PostProcess();
}

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


表格 6
訂單運作行為

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

小娃 發表於 09-12-15 13:21

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

l接收即時資料,更新至AB的資料庫。報價API以non-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運行於scan或filter,勾選AA視窗上”run every xxx”,AB的AT觸發架構無法與接收即時資料整合在同個流程下,而是在UI thread下設置一個timer事件,每次執行用靜態記下最新tick資料的日期時間與BarCount。
lAT連續2次AFL時間間隔,掛單、刪改單需讓本地端訂單spool與券商、交易所端訂單狀態同步,計算最新權益數。
l盤後離線時所有開倉和已平倉之交易保存匯出,投資組合管理軟體匯進報價,進行投資部位效益衡量因子分析(淨值變化、獲利期望值、勝率)。這種報告用來當作中長財務資金投資規劃,用以檢驗成效紀錄。
l系統當機或異常危機處理(含人工輔助)

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

綠茶妹 發表於 09-12-15 13:43

推!好文!
michael大大真是太厲害了!

gigi 發表於 09-12-15 14:00

好複雜看不懂
感覺michael大好像是住國外,英文強真好

ezbentley 發表於 09-12-15 14:48

michael大的程度超越我們太多了
頁: 1 [2] 3
查看完整版本: 如何用AmiBroker做績效回測(作者 michael-knight)