GnuHomot 發表於 11-8-30 20:15

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:}

GnuHomot 發表於 11-8-30 20:16

記得要修改參數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();

kilroy 發表於 11-8-30 20:27

我一直覺得很奇怪在coco上找不到類似實作的文章
難道大家做波段時都完全不考慮換月的影響嗎?
直接就用連續月的資料來跑交易?

小弟真的是沒有在考慮這個 {:9_582:}{:9_580:}


---

kilroy 發表於 11-8-30 20:32

小弟我又來騙coco幣了
為什麼要做Back Adjusted?
可以先參考藍色投機客的文章


我一直覺得很奇怪 ...
GnuHomot 發表於 11-8-30 08:15 PM http://www.coco-in.net/images/common/back.gif

   大大的波段程式看起來不錯唷~~ {:5_221:}

GnuHomot 發表於 11-8-30 22:16

繼續來騙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那天其實沒有那麼大的虧損。
調整過的資料回測其實績效還可以。

當然也有可能出現完全相反的情況,你以為在未調整資料下回測很好的策略,但是在調整後的資料下就穿幫的可能性。

要不要做換月的調整其實應該跟策略有關係,如果是日內當沖的話其實就不用考慮這個問題,但如果持倉有跨日的話,就不得不考慮這個影響的程度了。

GnuHomot 發表於 11-8-30 22:17

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();

oneman001 發表於 11-8-30 22:32

版大 可以在 coco 開課嗎 ?

GnuHomot 發表於 11-8-30 22:42

回復 7# oneman001


開課的話不可能啦{:4_186:},我其實很菜。
我倒是可以提供我學習的路徑

tedwang 發表於 11-8-30 23:58

本帖最後由 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?
謝謝.

titl 發表於 11-8-31 00:31

又是AB的程式,小弟不能用。{:4_154:}

考慮換月時,小弟都是只直接在結算日平倉掉!因為這樣做起來比較簡單!{:4_120:}

GnuHomot 發表於 11-8-31 05:59

本帖最後由 GnuHomot 於 11-8-31 06:00 AM 編輯

回復 9# tedwang


我的做法可以參考這個連結http://www.insight2it.com/appTW/main/faq_adjust.php

算術式換倉調整 (Arithmetic Back-Adjusted)

kilroy 發表於 11-8-31 07:26

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


期待後續版大的分享唷

GnuHomot 發表於 11-8-31 08:11

回復 12# kilroy


K大你要說清楚什麼東西更重要啊{:4_208:}
我發文的用意本來就只是想把這個版累積Amibroker經驗再進前推

tedwang 發表於 11-8-31 08:57

回復tedwang


我的做法可以參考這個連結

算術式換倉調整 (Arithmetic Back-Adjusted) ...
GnuHomot 發表於 11-8-31 05:59 AM http://coco-in.net/images/common/back.gif

謝謝.
以台指期過去歷史來看, 應該還不會發生 "累計調整下去,它可能會造成負數的成交價"吧?

GnuHomot 發表於 11-8-31 09:04

回復 14# tedwang


應該是不會,不過不代表以後不會,使用上要留意就是了
頁: [1] 2
查看完整版本: Amibroker 連續月背向調整Back Adjusted實作