COCO研究院

 找回密碼
 註冊
搜索
查看: 6088|回復: 12

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

[複製鏈接]
發表於 11-9-16 15:02 | 顯示全部樓層 |閱讀模式
各位大大 小弟想請問
比如說用某一策略下一口單(當沖)
持續賺到累積損益+30萬
之後每次就下兩口單
以此類推 +60萬 下3口單
想了好久 還是不知道AB要怎麼查詢過去累積績效來改變部位大小

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

評分

參與人數 1金錢 +2 收起 理由
lwhuang + 2 太強了

查看全部評分

發表於 11-9-17 23:34 | 顯示全部樓層
本帖最後由 enochyu 於 11-9-18 12:01 AM 編輯
各位大大 小弟想請問
比如說用某一策略下一口單(當沖)
持續賺到累積損益+30萬
之後每次就下兩口單
以此類推 ...
ZHACK 發表於 11-9-16 03:02 PM


Hello, ZHACK 大

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


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


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



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

  6. SetOption( "InitialEquity", _eyInitialEquity );
  7. SetPositionSize( _eyInitialLots, spsShares );

  8. // your trading rule
  9. Buy = 多單邏輯;
  10. Short = 空單邏輯;
  11. Sell = 多平倉邏輯;
  12. Cover = 空平倉邏輯;

  13. BuyPrice = 多單進場價;
  14. ShortPrice = 空單進場價;
  15. SellPrice = 多平倉出場價;
  16. CoverPrice = 空平倉出場價;

  17. // equity curve
  18. SetPositionSize( _eyInitialLots
  19.                  + IIf( floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity ) > _eyRaiseLimitLots
  20.                         , _eyRaiseLimitLots - _eyInitialLots
  21.                         , floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity )
  22.                       )
  23.                  , spsShares );
  24. SetPositionSize( _eyInitialLots
  25.                  + IIf( floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity ) > _eyRaiseLimitLots
  26.                         , _eyRaiseLimitLots - _eyInitialLots
  27.                         , floor( ( Equity( 1, 0 ) - _eyInitialEquity ) / _eyRaiseEquity )
  28.                       )
  29.                  , spsShares );
複製代碼



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


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



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

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

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

經回測後這兩個 Case 獲利相差高達 20 倍

評分

參與人數 5金錢 +13 收起 理由
lwhuang + 2 太強了
usana642 + 2 太強了!
joey0415 + 2 讚!
kilroy + 5 讚喔~~五分奉上 XD
eclife + 2 熱心分享

查看全部評分

回復 支持 1 反對 0

使用道具 舉報

發表於 11-9-18 11:03 | 顯示全部樓層
本帖最後由 GnuHomot 於 11-9-18 11:05 AM 編輯
Hello, ZHACK 大

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


------
下面參數設定效果如下,
* 初始資 ...
enochyu 發表於 11-9-17 11:34 PM


感謝enochyu大大,我被SetPositionSize這個函數搞死了@_@
原來要在buy short之前先做一次初始的動作,難怪怎麼寫都跑不出來正確的結果
發表於 11-9-18 11:42 | 顯示全部樓層
To GnuHomot 大

歡迎取用,不用客氣啦!

------

To eclife 大

感恩啦。
發表於 11-9-18 14:17 | 顯示全部樓層
回復 4# enochyu


   請問程式碼最後為什麼要SetPositionSize兩次呢?還是是筆誤?
發表於 11-9-18 15:06 | 顯示全部樓層
回復 5# GnuHomot


Hi, G大

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

這部分不是筆誤,小弟測試後這部分必須這樣的寫法,才能得到獲利再投資的績效,至於為什麼 ~ 哈哈,小弟還不清楚原因。
發表於 11-9-18 19:29 | 顯示全部樓層
回復 6# enochyu


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

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

我在想是不是要動用到CustomBacktest
發表於 11-9-18 20:26 | 顯示全部樓層
回復 7# GnuHomot


呵呵,交學相長啦

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

CustomBackTest 我想應該可以,也期待 G大 分享喔

評分

參與人數 2金錢 +4 收起 理由
joey0415 + 2 不加不行啦!
GnuHomot + 2 無論如何,還是感謝分享^^

查看全部評分

發表於 11-9-19 20:50 | 顯示全部樓層
http://www.amibroker.com/docs/Houston2.pdf

原來官網已經有範例了
在midium-level的範例部份有類似的寫法,先貼上來。
晚點來實作看看。
發表於 11-9-19 21:37 | 顯示全部樓層
本帖最後由 GnuHomot 於 11-9-19 09:39 PM 編輯

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

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

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


  1. Initial=500000;
  2. SetOption("InitialEquity", Initial);
  3. ieq=GetOption("InitialEquity");

  4. InitialShares=1;
  5. SetPositionSize(InitialShares, spsShares);


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

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


  12. Buy=Sell=Short=Cover=0;
  13. TrendIndex=0;
  14. for(i=0; i<BarCount; i++)
  15. {
  16.         if(TrendIndex<1)
  17.         if(C[i]>HighValue[i])
  18.         {
  19.                 Buy[i]=Cover[i]=1;
  20.                 TrendIndex=1;
  21.         }

  22.         if(TrendIndex>-1)
  23.         if(C[i]<LowValue[i])
  24.         {
  25.                 Short[i]=Sell[i]=1;
  26.                 TrendIndex=-1;
  27.         }
  28. }

  29. FixDollar=500000;
  30. Deposit=100000;
  31. SetCustomBacktestProc("");
  32. if(Status("action")==actionPortfolio)
  33. {
  34.         

  35.         bo=GetBacktesterObject();
  36.         bo.Preprocess();
  37.         for(bar=0; bar<BarCount; bar++)
  38.         {
  39.                 CurrentEquity=bo.Equity;
  40.                 for(sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar) )
  41.                 {
  42.                         
  43.                                 method=0;//change this value to decide which method you want to use
  44.                                 switch(method)
  45.                                 {
  46.                                         case 0:        //Position Sizing Method: Fix Size
  47.                                         shares=1;
  48.                                         break;

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

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

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

  65.                                         case 4://Show Hand
  66.                                         sig.PosSize=CurrentEquity;
  67.                                         break;
  68.                                 }
  69.                
  70.                 }
  71.                 bo.ProcessTradeSignals(bar);
  72.         }
  73.         bo.PostProcess();

  74. }


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


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

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

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

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

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

  90. }

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

評分

參與人數 3金錢 +6 收起 理由
lwhuang + 2 太強了
joey0415 + 2 很棒的文章,感恩!
enochyu + 2 推先

查看全部評分

發表於 11-9-22 17:55 | 顯示全部樓層
謝謝大大的分享....
發表於 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有什麼不同嗎?
感謝

我的操作如下圖
部位加碼.JPG


補充內容 (12-12-24 22:25):
Sorry,是我自己鬼遮眼,是正常的
只是我找不到刪帖的選項,只有補充選項
發表於 16-6-15 12:07 | 顯示全部樓層
GnuHomot 發表於 11-9-19 21:37
實作完應該是沒問題了,其實還蠻興奮的,因為這個問題困擾我很久了。結果就直接回覆在這篇。菜鳥 ...

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

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-11-22 11:05

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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