michael-knight 發表於 09-10-22 11:34

可否每根K棒單獨設定ositionSize

假設有10根k棒,第0、1、2根產生買進訊號,單獨對這三根k棒設定positionsize參數為0%、10%、20%可用資金做投資,這樣一來我應該預期輸出交易應該有3筆交易,但是AB的backtest結果無任何成交,為何會這樣呢?

buy = 0;
buy = 1;
buy = 1;
buy = 1;

positionsize = 0;
positionsize = -10;
positionsize = -20;

sell = 0;

ezbentley 發表於 09-11-4 12:38

這應該要用到Custom Backtester
Custom Backtester才是AB強大的地方
可是不是那麼容易
我隨便寫寫的 不一定會動
你參考看看

SetCustomBacktestProc("");
SetTradeDelays(0, 0, 0, 0);

// Money Management
if (Status("action") == actionPortfolio) {
        bo = GetBacktesterObject();
        bo.PreProcess();
        for (bar = 0; bar < BarCount; bar++) {
                CurrentEquity = bo.Equity;
                for (sig = bo.GetFirstSignal(bar); sig; sig = bo.GetNextSignal(bar)) {
                        SetForeign(sig.Symbol);
                        if (bar == 2) {
                                sig.PosSize = CurrentEquity * 0.2;
                        }
                        RestorePriceArrays();
                }
                bo.ProcessTradeSignals(bar);
        }
        bo.PostProcess();
}

Buy = ..........;

綠茶妹 發表於 09-11-4 12:43

推推!
好文!

生猛海鮮 發表於 09-11-4 12:47

{:4_120:}

michael-knight 發表於 09-11-9 09:40

本帖最後由 michael-knight 於 09-11-9 09:45 AM 編輯

非常感謝ezbentley大大的解惑

花點時間把AB回測執行框架說明一下,像蓋房子一樣,基礎要打好。跑回測寫回測若能對內部發生的故事情節有所了解,一切都會變得簡單許多,有助於判斷執行結果合理與否,客制化回測更讓使用者不會只把回測器當黑盒子來用。底下是AB文件backteste簡略的重點整理

1.使用預設回測:使用者無法變更其回測執行框架

SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
指定交易信號/buy/sell/short/cover
}

2.使用客制化回測,高階層

SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();
bo.backtest(false);
}

3.使用客制化回測,中階層客制化框架實際就是把backtest()進一步拆解preprocess()/postprocess()/ProcessTradeSignals(bar)

SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();

preprocess();
for (bar =0; bar < barcount; bar++) {
    for( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
   {
//使用者可以在這裡變更sig物件的成員變數
   }
   ProcessTradeSignals(bar);
}
postprocess();
}

4.使用客制化回測,低層客制化框架進一步把ProcessTradeSignals(bar)拆解成EnterTrade()/ExitTrade()/ScaleTrade()/UpdateStats()/HandleStops()

SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();

preprocess();
for (bar =0; bar < barcount; bar++) {
    for( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
   {
//使用者可以在這裡變更signal物件的成員變數,直接以EnterTrade()/ExitTrade()操作trade物件
   }
//不管有沒有交易信號物件在這能用客制化新增進出場機制或條件EnterTrade()/ExitTrade()
//trade物件分別放在已開倉或平倉兩個spool,可透過bo成員函式操作它
}
postprocess();
}

綠茶妹 發表於 09-11-9 09:50

回復 5# michael-knight


    謝謝分享!好專業啊!幫忙推一下。

ezbentley 發表於 09-11-9 15:46

Michael 才是真正高手啊
我都看不懂了{:4_144:}

teck01 發表於 09-11-14 14:19

原作者都看不懂,那我們不就......{:9_606:}

綠茶妹 發表於 09-11-14 14:23

只能幫忙推文。
希望能有更多熟悉AB的人來討論。
頁: [1]
查看完整版本: 可否每根K棒單獨設定ositionSize