想請問AB有辦法查累積損益下不同口數的寫法嗎?
各位大大 小弟想請問比如說用某一策略下一口單(當沖)
持續賺到累積損益+30萬
之後每次就下兩口單
以此類推 +60萬 下3口單
想了好久 還是不知道AB要怎麼查詢過去累積績效來改變部位大小
主要是想看看策略複利的效果
謝謝 本帖最後由 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:05 AM 編輯
Hello, ZHACK 大
參考看看小弟的實作方式是否符合的的需求,
------
下面參數設定效果如下,
* 初始資 ...
enochyu 發表於 11-9-17 11:34 PM http://coco-in.net/images/common/back.gif
感謝enochyu大大,我被SetPositionSize這個函數搞死了@_@
原來要在buy short之前先做一次初始的動作,難怪怎麼寫都跑不出來正確的結果 To GnuHomot 大
歡迎取用,不用客氣啦!
------
To eclife 大
感恩啦。 回復 4# enochyu
請問程式碼最後為什麼要SetPositionSize兩次呢?還是是筆誤? 回復 5# GnuHomot
Hi, G大
不知目前這寫法,回測結果與你預期相同嗎?
這部分不是筆誤,小弟測試後這部分必須這樣的寫法,才能得到獲利再投資的績效,至於為什麼 ~ 哈哈,小弟還不清楚原因。 回復 6# enochyu
很抱歉,我懷疑這樣子的寫法還是沒辦法正確的回測。
我猜測equity()會被SetPositionSize()影響,所以用Equity()計算出來當下的盈餘還是依據之前的SetPositionSize,雖然你連續設了兩次Equity()和SetPositionSize(),但是這有點像雞生蛋蛋生雞的問題,會永遠得不到正確的Equity。
我把呼叫Equity()每根K棒的值_trace出來看,跟AA中的結果是不一樣的。
我在想是不是要動用到CustomBacktest{:4_144:} 回復 7# GnuHomot
呵呵,交學相長啦 {:4_186:}
這方法回測是否精準可能也很難定義,僅因 "個人認為方便" 加上此方法與小弟自己產出的回測報表(*.scv)比對之獲利結果算是接近,所以小弟暫時都使用這方法在進行手邊策略 "獲利再投資想法" 之回測啦 ~ 希望小弟自認方便之想法不會造成各位大大的困擾,所以若合用請不用可氣,也歡迎各位高手分享更好的方法造福大夥,感恩啦 {:5_260:}
CustomBackTest 我想應該可以,也期待 G大 分享喔 {:4_151:} http://www.amibroker.com/docs/Houston2.pdf
原來官網已經有範例了{:4_186:}
在midium-level的範例部份有類似的寫法,先貼上來。
晚點來實作看看。 本帖最後由 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(); 謝謝大大的分享.... 本帖最後由 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,是我自己鬼遮眼,是正常的
只是我找不到刪帖的選項,只有補充選項 GnuHomot 發表於 11-9-19 21:37
實作完應該是沒問題了,其實還蠻興奮的,因為這個問題困擾我很久了。結果就直接回覆在這篇。菜鳥 ...
請問在實際交易時, 這樣的需求要怎麼寫?
amibroker回測和實際交易策略的寫法真的差異很大...努力學習中
頁:
[1]