ZHACK 發表於 11-9-16 15:02

想請問AB有辦法查累積損益下不同口數的寫法嗎?

各位大大 小弟想請問
比如說用某一策略下一口單(當沖)
持續賺到累積損益+30萬
之後每次就下兩口單
以此類推 +60萬 下3口單
想了好久 還是不知道AB要怎麼查詢過去累積績效來改變部位大小

主要是想看看策略複利的效果
謝謝

enochyu 發表於 11-9-17 23:34

本帖最後由 enochyu 於 11-9-18 12:01 AM 編輯

各位大大 小弟想請問
比如說用某一策略下一口單(當沖)
持續賺到累積損益+30萬
之後每次就下兩口單
以此類推 ...
ZHACK 發表於 11-9-16 03:02 PM http://www.coco-in.net/images/common/back.gif

Hello, ZHACK 大

參考看看小弟的實作方式是否符合的的需求,


------
下面參數設定效果如下,
* 初始資本為 400,000,最大倉位為 1 口
* 當獲利每增加 400,000 時,則最大倉位口數增加 1 口
* 最大倉位口數限制在 30 口


------
說明:
初始資本:400,000每次下 1 口單
累計資本:800,000每次下 2 口單
累計資本:1,200,000每次下 3 口單
累計資本:1,600,000每次下 4 口單
... 以此類推



// equity parameters
_eyInitialEquity = 400000;    // 設定初始資本
_eyInitialLots = 1;         // 設定初始下單口數
_eyRaiseEquity = 400000;      // 設定每當獲利多少金額後再增加一口
_eyRaiseLimitLots = 30;       // 設定下單口數上限

SetOption( "InitialEquity", _eyInitialEquity );
SetPositionSize( _eyInitialLots, spsShares );

// your trading rule
Buy = 多單邏輯;
Short = 空單邏輯;
Sell = 多平倉邏輯;
Cover = 空平倉邏輯;

BuyPrice = 多單進場價;
ShortPrice = 空單進場價;
SellPrice = 多平倉出場價;
CoverPrice = 空平倉出場價;

// equity curve
SetPositionSize( _eyInitialLots
               + IIf( floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity ) > _eyRaiseLimitLots
                        , _eyRaiseLimitLots - _eyInitialLots
                        , floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity )
                      )
               , spsShares );
SetPositionSize( _eyInitialLots
               + IIf( floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity ) > _eyRaiseLimitLots
                        , _eyRaiseLimitLots - _eyInitialLots
                        , floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity )
                      )
               , spsShares );



------
以您的需求請將變數修改如下


_eyInitialEquity = 300000;    // 設定初始資本
_eyInitialLots = 1;         // 設定初始下單口數
_eyRaiseEquity = 300000;      // 設定每當獲利多少金額後再增加一口
_eyRaiseLimitLots = 999999;   // 設定下單口數上限



------
小弟也在築夢中,同一組程式績效比較 (回測2001/01~2011/08)

Case 1:
初始資金 400,000 最大倉最 1 口

Case 2:
初始資金 400,000,當獲利每增加 400,000 時,則最大倉位口數增加 1 口,倉位口數上限 30 口

經回測後這兩個 Case 獲利相差高達 20 倍 {:4_176:}

GnuHomot 發表於 11-9-18 11:03

本帖最後由 GnuHomot 於 11-9-18 11:05 AM 編輯

Hello, ZHACK 大

參考看看小弟的實作方式是否符合的的需求,


------
下面參數設定效果如下,
* 初始資 ...
enochyu 發表於 11-9-17 11:34 PM http://coco-in.net/images/common/back.gif

感謝enochyu大大,我被SetPositionSize這個函數搞死了@_@
原來要在buy short之前先做一次初始的動作,難怪怎麼寫都跑不出來正確的結果

enochyu 發表於 11-9-18 11:42

To GnuHomot 大

歡迎取用,不用客氣啦!

------

To eclife 大

感恩啦。

GnuHomot 發表於 11-9-18 14:17

回復 4# enochyu


   請問程式碼最後為什麼要SetPositionSize兩次呢?還是是筆誤?

enochyu 發表於 11-9-18 15:06

回復 5# GnuHomot


Hi, G大

不知目前這寫法,回測結果與你預期相同嗎?

這部分不是筆誤,小弟測試後這部分必須這樣的寫法,才能得到獲利再投資的績效,至於為什麼 ~ 哈哈,小弟還不清楚原因。

GnuHomot 發表於 11-9-18 19:29

回復 6# enochyu


很抱歉,我懷疑這樣子的寫法還是沒辦法正確的回測。
我猜測equity()會被SetPositionSize()影響,所以用Equity()計算出來當下的盈餘還是依據之前的SetPositionSize,雖然你連續設了兩次Equity()和SetPositionSize(),但是這有點像雞生蛋蛋生雞的問題,會永遠得不到正確的Equity。

我把呼叫Equity()每根K棒的值_trace出來看,跟AA中的結果是不一樣的。

我在想是不是要動用到CustomBacktest{:4_144:}

enochyu 發表於 11-9-18 20:26

回復 7# GnuHomot


呵呵,交學相長啦 {:4_186:}

這方法回測是否精準可能也很難定義,僅因 "個人認為方便" 加上此方法與小弟自己產出的回測報表(*.scv)比對之獲利結果算是接近,所以小弟暫時都使用這方法在進行手邊策略 "獲利再投資想法" 之回測啦 ~ 希望小弟自認方便之想法不會造成各位大大的困擾,所以若合用請不用可氣,也歡迎各位高手分享更好的方法造福大夥,感恩啦 {:5_260:}

CustomBackTest 我想應該可以,也期待 G大 分享喔 {:4_151:}

GnuHomot 發表於 11-9-19 20:50

http://www.amibroker.com/docs/Houston2.pdf

原來官網已經有範例了{:4_186:}
在midium-level的範例部份有類似的寫法,先貼上來。
晚點來實作看看。

GnuHomot 發表於 11-9-19 21:37

本帖最後由 GnuHomot 於 11-9-19 09:39 PM 編輯

實作完應該是沒問題了,其實還蠻興奮的{:4_161:},因為這個問題困擾我很久了。結果就直接回覆在這篇。菜鳥的程式碼也沒什麼好保留的,直接貼上來了。

我試寫了幾種資金控管的模式,都是參考藍色投機客的文章,請先閱讀
http://tw.myblog.yahoo.com/Blue-Speculator/article?mid=1350&prev=1667&next=1233&l=f&fid=17

以下程式碼如果看不懂,請先把上一篇我貼文的連結PDF看懂,主要是用到mid-level的CustomBacktest
還有有些參數值只是當下測試時隨便設定的,不用太在意。


Initial=500000;
SetOption("InitialEquity", Initial);
ieq=GetOption("InitialEquity");

InitialShares=1;
SetPositionSize(InitialShares, spsShares);


HighLowPeriod=15;
//HighLowPeriod=Optimize("HighLow Period", 15, 1, 120, 1);

HighValue=Ref(HHV(H, HighLowPeriod),-1);
LowValue=Ref(LLV(L, HighLowPeriod),-1);
Plot(HighValue,"High Value", colorGreen, styleLine);
Plot(LowValue,"Low Value", colorGreen, styleLine);


Buy=Sell=Short=Cover=0;
TrendIndex=0;
for(i=0; i<BarCount; i++)
{
      if(TrendIndex<1)
      if(C>HighValue)
      {
                Buy=Cover=1;
                TrendIndex=1;
      }

      if(TrendIndex>-1)
      if(C<LowValue)
      {
                Short=Sell=1;
                TrendIndex=-1;
      }
}

FixDollar=500000;
Deposit=100000;
SetCustomBacktestProc("");
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) )
                {
                        
                              method=0;//change this value to decide which method you want to use
                              switch(method)
                              {
                                        case 0:      //Position Sizing Method: Fix Size
                                        shares=1;
                                        break;

                                        case 1:      //Position Sizing Method:Fix Dollar Amout of Equity
                                        if( floor(CurrentEquity/FixDollar)>0)
                                                sig.PosSize=Deposit*floor(CurrentEquity/FixDollar);
                                        break;

                                        case 2:      //Position Sizing Method: Kelly Formula
                                        WL=160946/65300;// win average per trade / loss average per trade
                                        Pw=0.4839;// win numbers/ trade numbers
                                        FK = ((WL + 1) * Pw - 1 ) / WL;
                                        sig.PosSize=CurrentEquity*FK;
                                        break;

                                        case 3:      //Position Sizing Method: Fixed Risk / Fixed Fractional
                                        FR=0.5;
                                        Maxdrawdown=400000;//for reference
                                        if(floor(CurrentEquity*FR/Maxdrawdown)>0)
                                                sig.PosSize=floor(CurrentEquity*FR/Maxdrawdown)*Deposit;
                                        break;

                                        case 4://Show Hand
                                        sig.PosSize=CurrentEquity;
                                        break;
                              }
               
                }
                bo.ProcessTradeSignals(bar);
      }
      bo.PostProcess();

}


SignalColor=Flip(Buy,Short);
PlotOHLC(O,H,L,C,"Trend",IIf(SignalColor, colorRed, colorGreen), styleCandle);


PlotShapes(Buy * shapeSmallUpTriangle ,colorRed, 0,Low,-50);
//PlotShapes(Sell * shapeHollowSmallDownTriangle ,colorDarkRed, 0,High,-45);
PlotShapes(Short * shapeSmallDownTriangle ,colorGreen, 0,Low,-50);
//PlotShapes(Cover * shapeHollowSmallUpTriangle ,colorDarkGreen, 0,High,-45);

dist=1.5*ATR(10);
for( i = 1; i < BarCount; i++ )
{
if( Buy ) PlotText( "Buy\n@" + BuyPrice[ i-1 ], i, Low[ i ]-dist, colorRed );

//if(NOT Short)
//if( Sell ) PlotText( "Sell\n@" + SellPrice[ i-1 ], i, High[ i ]+dist, colorDarkRed );

//if(NOT Buy)
//if( Cover ) PlotText( "Cover\n@" + CoverPrice[ i-1 ], i, Low[ i ]-dist, colorDarkGreen );

if( Short ) PlotText( "Short\n@" + ShortPrice[ i-1 ], i, High[ i ]+dist, colorGreen );

}

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

usana642 發表於 11-9-22 17:55

謝謝大大的分享....

sophieq 發表於 12-12-24 13:14

本帖最後由 sophieq 於 12-12-24 13:18 編輯

各位專家,小的是新手第一po

想請教一下10樓GnuHomot大的程式

為什麼我改了第52行的method這個參數,無論我改0,或是1,為什麼答案都是一樣的,我也試著將第39行的程式改成SetOption("UseCustomBacktestProc", True );
結果也是一樣沒變化。

我懷疑是第40行if(Status("action")==actionPortfolio)的關係,但是我找了一下網路上的範例,這一行只要用到GetBacktesterObject()就一定要加。

看了娃大的教學
4樓一連串if Status("action")的demo code,我想可能就是第40行的if沒進去的關係了。

請問我要怎麼設定讓Status("action")==actionPortfolio呢?

對了,可以順便請教actionBacktest 跟actionPortfolio有什麼不同嗎?
感謝

我的操作如下圖



補充內容 (12-12-24 22:25):
Sorry,是我自己鬼遮眼,是正常的
只是我找不到刪帖的選項,只有補充選項

distagon 發表於 16-6-15 12:07

GnuHomot 發表於 11-9-19 21:37
實作完應該是沒問題了,其實還蠻興奮的,因為這個問題困擾我很久了。結果就直接回覆在這篇。菜鳥 ...

請問在實際交易時, 這樣的需求要怎麼寫?
amibroker回測和實際交易策略的寫法真的差異很大...努力學習中

頁: [1]
查看完整版本: 想請問AB有辦法查累積損益下不同口數的寫法嗎?