洞悉AmiBroker的backtester框架(作者 michael-knight)
這篇文章是michael-knight寫的好文,小娃徵求michael-knight的同意後,
排版後貼上。
感謝michael-knight提供這麼棒的好文。
{:4_127:}
michael-knight大大表示,
希望有更多有志於AB的同好一起研究,
這樣子能節省許多時間。
AB的文件真的很豐富,尤其是預設回測和客制化回測是精華重點,我看過隨手順便整理一下成簡略word檔,你可以看看,希望能有助於洞悉AB的backtester框架
還有利用AB的backtester底層方法包一層訂單管理spool,這樣回測器可以處理pending Oder,更符合實際市場情境
AB的backtester框架層次切割分明,依彈性度需求幾乎沒有不可能做到的客制化功能
Backtester operationEquity levelSignal processingMethodUIBacktestIndividual6種AA->S->P不勾選portfolioAA->B_IPortfolioAA->B_PCustom Backtester interfaceIndividual6種AA->S->P勾選portfolio並指定客制化回朔測試操作AA->B_IPortfolioAA->B_P
如何用Amibroker進行回朔測試,了解預設的回策引擎詳細方塊功能,進一步能做客制化參數控制買賣交易,可達到單筆交易大小、投資部位管控,讓回朔測試能更貼近實際交易情境。
1.AA:Automatic Analysis window
2.BS:Backtest Setting Window,除了在此設定回朔測試時的參數與選項外,AFL下直接呼叫函式SetOption將覆蓋BS內的設置。
3.AT:自動交易,auto trading
4.交易信號種類:進場信號buy/short、出場信號sell/cover,此四個均為陣列變數,buy用來建立多頭倉位,sell信號做多頭部位平倉,short用於建立空頭部位,cover則是將空頭部位做平倉動作。每種交易信號對應實際交易價格,BS視窗下Trades裡指定交易價格。回朔測試有六種處理交易信號模式,經處理後每個交易信號在回朔測試引擎內對應一個signal物件。
5.訂單型態:實際處理交易信號時,掛出訂單包含交易價格、訂單型態。支援限價單IOC(Immediate or cancel)和pending Order嗎
6.除錯訊息:ViewàLog,在此視窗下子選單”Trace Output”包含internal和external選項,選用external時,內建函式_TRACE及printf將把訊息輸出至作業系統內的訊息spool,需安裝DebugView來看;選用internal,內建函式_TRACE及printf將把訊息顯示於Amibroker的log視窗。如下
本文有更新版。
http://www.coco-in.net/viewthread.php?tid=1446&extra=
新增「如何用AB做自動交易、訂單行為管理說明。」
所以本帖關閉。(關閉就是不可再回覆的意思) michael-knight大花了很多時間研究AmiBroker的回測,
及自動下單API的做法,
國內對這些方法熟悉的人極為稀少。
小娃看到michael-knight的文章相當佩服,
他說他是"順手整理"給我,
寫的洋洋灑灑,圖文並茂。
最後附上reference,和論文格式一樣。
真是高手。
我說想要貼上來,
他說他要再看我排版的稿件有沒有錯。
(嚴謹,有做學問的精神)
大家多研究討論,
能夠為彼此省下不少時間。
{:4_209:} 7.Initial Equity:做回朔測試時之初始參數之一,帳戶初始淨值,即原始可下單金額,AA視窗下按下Setting進入”Backtest setting”對話盒,於”Genaral tab”下可設置此參數,或於AFL下直接呼叫函式SetOption。AA視窗下按下”Individual Backtest” ,多檔股票此參數將被視作每檔股票初始淨值;AA視窗下按下”Portfolio Backtest” ,多檔股票此參數被視為所有股票共同的初始淨值。
8.每筆交易部位大小:Positionsize,此變數為陣列,管控回朔測試時每筆交易部位大小(金額或淨值百分比,表示法請參閱函式SetPositionSize)。
9.最大開倉筆數:呼叫函式SetOption。當有交易信號,而且當前總開倉筆數小於最大開倉筆數且可下單資金大於Positionsize,則新增一筆成交,否則無法成交。
10.Individual-level or Portfolio-level Backtest:AA視窗”Backtest”,此兩者都會進入AFL執行預設或客制化回朔測試,”Individual” 意指每檔股票的回朔測試參數是獨立存放互不影響,”Portfolio”(整體或一籃子)意指所有股票的共用同一份回朔測試參數。
11.PositionScore:陣列變數,每一根K棒對應一個ranking,於Portfolio-level回朔測試,於第n根K棒,多檔股票存在交易信號,ranking數值愈高的股票優先成交。
一、Amibroker Formula language:
有六種時機會執行AFL,分別為Indicator、Commentary、Scan、Explore、Backtest、PortfolioBacktest動作類型,習慣上AFL並有些函式只於某種動作類型下呼叫是有意義的,我們會呼叫函式Status取得當前動作類型。
1.Indicator:當指標圖表需作更新或視窗重繪事件時,會執行該圖表對應的AFL。
2.Commentary:選單AnalysisCommentary,Formula tab視窗下以writeif、writeval、printf函式將訊息打印至Commentary tab,主要用於以文字敘述方式提供當前投資策略建議。
3.Scan:如圖表 1按下”Scan”扭,可搭配左方選項設定AFL執行週期,因此可結合AT。至少需設置buy/sell/ short/cover四種交易信號之一,AB分析AFL裡交易信號陣列變數之運算式,buy/sell/ short/cover交易信號陣列變數為真的bar其結果打印至分析輸出視窗。
4.Explore:如圖表 1按下”Explore”扭,可搭配左方選項設定AFL執行週期,因此可結合AT。AB分析AFL裡Filter陣列變數運算式,將Filter為真的bar打印至分析輸出視窗。
5.Backtest:執行預設回朔測試分析,如圖表 1按下”Backtest”扭選用回朔測試參數選項可區分成個別設定與一籃子集體設定(”Individual”或”Portfolio”)。拆成三個大步驟來看backtester內部運作
I.參數始化:從原始可用淨值、每筆交易部位大小、最大開倉數目
II.處理交易信號與實際交易:回朔測試引擎有六種處理交易信號的方式,分別為Regular、RegularRaw、RegularRawMulti、RegularRaw2、RegularRawMulti2、rotation,預設為Regular,函式SetBacktestMode設置處理方式。
III.輸出模擬結果
6.Portfolio Backtester Interface:此動作類型主要用於客制化回朔測試,AB採2-pass來實現回朔測試,第一回合收集處理交易信號,第二回合使用者能客制化操作backtester、trade、signal、stat這些物件的屬性及方法,如圖表 2所示,backtester於AFL內以COM元件方式呈現其界面給使用者,其它物件都須透過backtester物件來間接操作。客制化回朔測試應用情境例如在回朔測試報表添加輸出參數,管控每一根K棒當下的狀況調整每筆交易部位大小,總投資額佔總淨值比例,使用者精細操作回朔測試引擎動作,往下我們將探討backtester運作流程細部框架。
有兩種進入客制化回朔測試的方法,AA”Setting””Portfolio tab”對話盒,勾選啟用客制化回朔測試處理,並把客制化回朔測試處理寫在一支獨立的*.AFL,選定該檔案;或者使用函式SetOption、SetCustomBacktestProc兩者之一來進入客制化回朔測試。 // only for custom backtest,choose one of follow 2 lines
//SetOption("UseCustomBacktestProc", True );
//SetCustomBacktestProc("");
If ( Status("action") == actionIndicator ) {
printf(“Current working action: Indicator”);
}
else
if ( Status("action") == actionCommentary ) {
printf(“Current working action: Commentary”);
}
else
if ( Status("action") == actionScan ) {
printf(“Current working action: Scan”);
Filter = <expression>
}
else
if ( Status("action") == actionExplore ) {
printf(“Current working action: Explore”);
}
else
if ( Status("action") == actionBacktest ) {
printf(“Current working action: Backtest”);
}
else
if ( Status("action") == actionPortfolio ) {
printf(“Current working action: cunstom backtest”);
//add custom backtest here
}
Code 1AFL動作類型
圖表 2回朔測試引擎內部主要物件關係 二、信號處理方式:
1.Regular模式:此回朔測試模式每檔股票僅持有一筆部位,假設選擇只交易多頭部位,回朔測試引擎將針對buy/sell信號做處理,消除多餘的進場和出場信號。每一檔股票處理信號可以狀態圖來描述行為如圖表 3,B/S是輸入,S0表示未持有多頭部位,S1代表持有一筆多頭部位,表格 1為狀態轉移表,因為只有兩種狀態,只需一個D型flip-flop就能表示當前狀態值,輸出以下列式子表示
圖表 3Regular模式持有部位變化之狀態圖(最多持有一筆未平倉) InuputOutputPI(present input)PSNSPO(present output)B(buy)S(sell)qq+B_newS_new00S0S0(hold clear)0001S0S0(hold clear)0010S0S1(setup)1011S0S1(setup)1000S1S1(hold setup)0001S1S0(clear)0110S1S1(hold setup)0011S1S0(clear)01
表格 1regular mode trade state transition table
表格 2多檔股票以regular模式進行portfolio和individual回朔測試 Regular模式下,執行多檔股票回朔測試,我們詳細列出信號處理的每個步驟如表格 2
,條列說明回朔測試引擎動作l
決定此時AFL動作類型是預設或客制化回朔測試。l
Individual-level或Portfolio-level回朔測試參數選項:初始淨值、每筆交易部位大小、最大開倉筆數,所有股票個別還是共用設定。l
交易倉位類型:只交易多倉、只交易空倉、空倉和多倉。此範例只交易多倉,所以僅處理buy/sell信號,交易信號可設定延遲週期l
如表格 1
所述,由S0轉成S1產生B_new信號,S1轉成S0產生S_new信號,一個B_new之後再配上一個S_new稱為一筆完整交易。Regular模式將連續相同的進場或出場信號簡化成一次,最終以B_new和S_new當作正式的交易信號。l
Portfolio-level backtest,掃描每一根K棒,按照PositionScore排序股票,ranking高者優先處理交易,若下單可用淨值小於每筆交易部位大小或開倉總數達到最大開倉筆數,則無法再建立新倉。處理交易僅依照交易信號、匹配交易價格來決定是否成交。Individual-level backtest,每檔股票擁有獨立的回朔測試參數選項,每檔個股交易處理並不互相干涉,因此不需以PositionScore/Ranking來排序。 2.RegularRaw模式:Raw故名思義就是最原始,所有進場信號都會被保留,每檔股票僅持有一筆部位,連續2次進場信號間的所有出場信號則只保留一個,意即碰到出場信號則平倉所有部位,詳列6檔股票原始交易信號,Portfolio-level交易回朔測試如上述以PositionScore高低做為交易優權依據;Individual-level交易回朔測試,其結果與Regular模式一樣,此乃因為每檔股票至多建立一筆單,連續的相同信號只能發生一次交易。
3.RegularRawMulti模式:與RegularRaw比較,此模式一樣以未經處理的進場信號來做建倉,Multi意指每檔股票可持有多筆部位,連續相同進場信號允許分批建多筆倉位;但一連串出場信號則視作一次平倉出場。以只建立多頭倉位看,部位變化狀態圖如圖表 4為MaxOpenPositions=3時,有買進信號則部位增加,賣出時部位則減少。
圖表 4部位變化狀態圖
表格 3多檔股票以RegularRaw模式進行portfolio和individual回朔測試 4.RegularRaw2&RegularRaw2Multi:Raw2與前述Raw兩者主要差異在於出場信號處理,當使用預設回朔測試時出場信號一發生則立即將該股票的部位全數出清;Raw2則是不消除任何連串出場信號,每一筆出場信號都會保留在backtester物件裡的signal物件,當執行操作最低階的客制化回朔測試,可以根據限定的條件決定交易信號是否要做處理,能充份控制平倉數目,就如同分批調節部位,因此RegularRaw2Multi能實現分批進場和出場,很適合一般實際交易情境。
三、回朔測試引擎框架
圖表 1所示AA視窗按下”Backtest”(Individual or Portfolio),AFL動作進入”actionBacktest” ,此時執行預設回朔測試,AFL內設定回朔測試參數選項會覆蓋圖表 5視窗內對應的設定,交易部位類型僅交易多倉、僅交易空倉、多空倉均交易,於AFL內需指定多單交易信號Buy/Sell、空單交易信號Short/Cover,若無指定回朔測試處理交易信號方式,預設為Regular模式。Portfolio回朔測試使用PositionScore為多檔個股交易優先權排序。接著回朔測試引擎將逐筆掃描K棒,處理實際交易(開倉或平倉),記錄部位資訊、淨值陣列。 if( Status("action") == actionBacktest) {//1. AA視窗Backtest(Individual or Portfolio)
Buy = C < 39.00; Sell = 0; Short = 0; Cover = 0;/*2. trading position type, Buy/Sell or /Short/Cover assignment*/
SetBacktestMode(Regular);//set backtest mode,default is Regular
SetPositionSize(…);//assign PositionSize
SetOption(“Initial Equity”, 100000);/*3. initial equity*/
SetOption(“MaxOpenPositions”, 3);/*4. allowed max open positions */
BuyPrice/SellPrice/ShortPrice/CoverPrice;/* 5. assign trade price */
printf(“Current working action: Backtest”);
}
Code 2AFL預設回朔測試 Amibroker客制化回朔測試,使用者能精細控制回朔測試引擎。第一回合進行信號和數值陣列收集,AFL函式Applystop規範的出場價格點,AFL於Pass1時動作類型為”actionBacktest” ,第二回合跑客制化程序,Pass2時動作類型為”actionPortfolio” 。Individual-level客製化回朔測試,每檔股票會執行一次客制化程序;Portfolio-level客製化回朔測試,僅執行一次客制化程序,舉3檔股票範例如表格 4。
將圖表 6客制化程序致能,並指定存放客制化程序的檔案,圖表 1所示AA視窗按下”Backtest”(Individual or Portfolio),AFL執行時期就會進入客制化回朔測試;另一種方式可以在AFL開啟客制化回朔測試,進入CB後,Amibroker以COM元件開放CBI客制化回朔測試介面,物件諸元backtester、trade、signal, CB下用函式GetBacktesterObject才會有意義,否則回傳Null。