Amibroker 連續月背向調整Back Adjusted實作
小弟我又來騙coco幣了{:4_663:}為什麼要做Back Adjusted?
可以先參考藍色投機客的文章
http://tw.myblog.yahoo.com/Blue-Speculator/article?mid=855&next=807&l=f&fid=7
我一直覺得很奇怪在coco上找不到類似實作的文章
難道大家做波段時都完全不考慮換月的影響嗎?
直接就用連續月的資料來跑交易?
這是我實作出來的比較圖,圖中上面紅色K棒為調整過的資料,下面為原始資料,使用同樣的策略。可以看到同樣的策略在進出的時間點就不一樣了,沒有調整其實在回測時是會得到不同的結果。
解決其中一個方式是在讀入歷史資料之前,就事先做資料的調整,讀入後自然就得到調整後的資料。
但小弟我比較懶,不想以後每次換月都重新轉檔,所以我想到的方法是先準備一個文字檔當作換月的資料庫。
感謝牛哥的網站有幫忙整理好的檔案可以下載
http://www.insight2it.com/appTW/main/free_backadjust.php
或是下載這份
所以我寫的AFL將會根據這個文字檔來做連續月背向調整,
就可以畫出類似我上面的圖。
這樣的作法有個缺點就是會反覆的去讀取硬碟中的文字檔,也可以考慮把它放入RamDisk中減輕負擔。
而好處是以後只要換月記得來更新一下這個文字檔就好了。
希望可以抛磚引玉有更多實作的討論{:4_208:} 記得要修改參數DataPath符合你放文字檔的路徑function GetBackAdjustedData( DataPath )
{
DateData=DateNum();
AdjustedDiff=0;
//for(i=0; i<BarCount; i++)
//_TRACE(NumToStr(DateData,1.0));
fh=fopen(DataPath, "r");
if(fh)
{
while( !feof(fh) )
{
string=fgets(fh);
//_TRACE("#"+string);
GetDate=StrExtract(string, 0);// the date to Transfer
GetDiff=StrExtract(string, 5);// Diff between two month
//_TRACE("#"+GetDate+": "+GetDiff);
GetYear=StrLeft(GetDate,4);
GetMonthDay=StrRight(GetDate,4);
GetDate=NumToStr( StrToNum(GetYear)-1900,1.0)+GetMonthDay;
//_TRACE("#"+GetDate);
GetDateNum=StrToNum(GetDate);
GetDiffNum=StrToNum(GetDiff)*-1;
for(i=0; i<BarCount; i++)
{
//_TRACE("#"+GetDate+" : "+NumToStr(DateData,1.0)+" : " + GetDiff);
if(DateData<=GetDateNum)
AdjustedDiff+=GetDiffNum;
else
break;
}
}
fclose(fh);
}
else
{
_TRACE("ERROR, File does not exist!!");
}
return AdjustedDiff;
}
DataPath=ParamStr("Data Path","C:\\Program Files (x86)\\AmiBroker\\Formulas\\Custom\\BackAdjusted.txt");
BackAdjustedDiff=GetBackAdjustedData(DataPath);
newOpen=O+BackAdjustedDiff;
newHigh=H+BackAdjustedDiff;
newClose=C+BackAdjustedDiff;
newLow=L+BackAdjustedDiff;
PlotOHLC(newOpen, newHigh, newLow, newClose, "BackAdjusted", colorRed, styleCandle);
_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(); 我一直覺得很奇怪在coco上找不到類似實作的文章
難道大家做波段時都完全不考慮換月的影響嗎?
直接就用連續月的資料來跑交易?
小弟真的是沒有在考慮這個 {:9_582:}{:9_580:}
--- 小弟我又來騙coco幣了
為什麼要做Back Adjusted?
可以先參考藍色投機客的文章
我一直覺得很奇怪 ...
GnuHomot 發表於 11-8-30 08:15 PM http://www.coco-in.net/images/common/back.gif
大大的波段程式看起來不錯唷~~ {:5_221:} 繼續來騙co幣
回測的時候Amibroker還是參考原來的OHLC,所以回測的結果當然不能參考。
那怎麼辦呢?
Amibroker其實有強打一個功能,但是在coco上居然都還沒看過有人使用相關的範例
也就是AddToComposite這個功能,可以利用計算出來的資料產生新的Symbol
我應該是首發{:4_663:}
所以修改過後的程式碼我會貼在下一篇回文。
程式碼的使用方法,由於AddToComposite在一般情況下只限定Scan時使用,所以在Automatic Analysis介面Scan後
你會發現左邊的Symbol List產生一個新的Symbol
而這就是調整完的資料
來比較一下有無做Back Adjusted的結果
這是未調整的回測結果,看起來績效似乎不佳,但注意綠線劃起來6/15那筆交易,有跨日到6/16,虧損-304。
但其實6/15是換倉日!!
這是使用上述動作所產生新的,做過Back Adjusted調整的資料所回測的結果,6/15那天其實沒有那麼大的虧損。
調整過的資料回測其實績效還可以。
當然也有可能出現完全相反的情況,你以為在未調整資料下回測很好的策略,但是在調整後的資料下就穿幫的可能性。
要不要做換月的調整其實應該跟策略有關係,如果是日內當沖的話其實就不用考慮這個問題,但如果持倉有跨日的話,就不得不考慮這個影響的程度了。 function GetBackAdjustedData( DataPath )
{
DateData=DateNum();
AdjustedDiff=0;
//for(i=0; i<BarCount; i++)
//_TRACE(NumToStr(DateData,1.0));
fh=fopen(DataPath, "r");
if(fh)
{
while( !feof(fh) )
{
string=fgets(fh);
//_TRACE("#"+string);
GetDate=StrExtract(string, 0);// the date to Transfer
GetDiff=StrExtract(string, 5);// Diff between two month
//_TRACE("#"+GetDate+": "+GetDiff);
GetYear=StrLeft(GetDate,4);
GetMonthDay=StrRight(GetDate,4);
GetDate=NumToStr( StrToNum(GetYear)-1900,1.0)+GetMonthDay;
//_TRACE("#"+GetDate);
GetDateNum=StrToNum(GetDate);
GetDiffNum=StrToNum(GetDiff)*-1;
for(i=0; i<BarCount; i++)
{
//_TRACE("#"+GetDate+" : "+NumToStr(DateData,1.0)+" : " + GetDiff);
if(DateData<=GetDateNum)
AdjustedDiff+=GetDiffNum;
else
break;
}
}
fclose(fh);
}
else
{
_TRACE("ERROR, File does not exist!!");
}
return AdjustedDiff;
}
DataPath=ParamStr("Data Path","C:\\Program Files (x86)\\AmiBroker\\Formulas\\Custom\\BackAdjusted.txt");
BackAdjustedDiff=GetBackAdjustedData(DataPath);
newOpen=O+BackAdjustedDiff;
newHigh=H+BackAdjustedDiff;
newClose=C+BackAdjustedDiff;
newLow=L+BackAdjustedDiff;
//PlotOHLC(newOpen, newHigh, newLow, newClose, "BackAdjusted", colorRed, styleCandle);
Buy=Sell=Short=Cover=0;
GenName="~Adjusted"+Name();
if( Status("action") == actionScan)
{
AddToComposite(newOpen,GenName,"O");
AddToComposite(newHigh,GenName,"H");
AddToComposite(newLow,GenName,"L");
AddToComposite(newClose,GenName,"C");
AddToComposite(V,GenName,"V");
}
PlotOHLC(Foreign(GenName,"O"), Foreign(GenName,"H"), Foreign(GenName,"L"), Foreign(GenName,"C"), "Foreign", colorRed, styleCandle);
_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(); 版大 可以在 coco 開課嗎 ? 回復 7# oneman001
開課的話不可能啦{:4_186:},我其實很菜。
我倒是可以提供我學習的路徑 本帖最後由 tedwang 於 11-8-31 12:27 AM 編輯
記得要修改參數DataPath符合你放文字檔的路徑
GnuHomot 發表於 11-8-30 08:16 PM http://coco-in.net/images/common/back.gif
Gnu大不好意思, 我沒有在用AB, 但想了解一下是如何調整換倉點差.
這裡得到的 AdjustedDiff 是要去加減到前面所有舊月份K棒的OHLC?
謝謝. 又是AB的程式,小弟不能用。{:4_154:}
考慮換月時,小弟都是只直接在結算日平倉掉!因為這樣做起來比較簡單!{:4_120:} 本帖最後由 GnuHomot 於 11-8-31 06:00 AM 編輯
回復 9# tedwang
我的做法可以參考這個連結http://www.insight2it.com/appTW/main/faq_adjust.php
算術式換倉調整 (Arithmetic Back-Adjusted) Amibroker其實有強打一個功能,但是在coco上居然都還沒看過有人使用相關的範例
也就是AddToComposite這個功能,可以利用計算出來的資料產生新的Symbol
我應該是首發{:4_663:}
GnuHomot 發表於 11-8-30 10:16 PM http://www.coco-in.net/images/common/back.gif
願意分享是很好啦
不過用 "居然都還沒看過有人..." 這個有點奇怪 XD
---
這是使用上述動作所產生新的,做過Back Adjusted調整的資料所回測的結果,6/15那天其實沒有那麼大的虧損。
調整過的資料回測其實績效還可以。
當然也有可能出現完全相反的情況,你以為在未調整資料下回測很好的策略,但是在調整後的資料下就穿幫的可能性。
要不要做換月的調整其實應該跟策略有關係,如果是日內當沖的話其實就不用考慮這個問題,但如果持倉有跨日的話,就不得不考慮這個影響的程度了。
GnuHomot 發表於 11-8-30 10:16 PM http://www.coco-in.net/images/common/back.gif
版大現在往波段程式的方向去開發程式交易
小弟覺得很讚,不過實際上,有些東西是比這個還重要的 XDXDXD
期待後續版大的分享唷 回復 12# kilroy
K大你要說清楚什麼東西更重要啊{:4_208:}
我發文的用意本來就只是想把這個版累積Amibroker經驗再進前推 回復tedwang
我的做法可以參考這個連結
算術式換倉調整 (Arithmetic Back-Adjusted) ...
GnuHomot 發表於 11-8-31 05:59 AM http://coco-in.net/images/common/back.gif
謝謝.
以台指期過去歷史來看, 應該還不會發生 "累計調整下去,它可能會造成負數的成交價"吧? 回復 14# tedwang
應該是不會,不過不代表以後不會,使用上要留意就是了
頁:
[1]
2