COCO研究院

 找回密碼
 註冊
搜索
查看: 10017|回復: 18

Amibroker 連續月背向調整Back Adjusted實作

[複製鏈接]
發表於 11-8-30 20:15 | 顯示全部樓層 |閱讀模式
小弟我又來騙coco幣了
為什麼要做Back Adjusted?
可以先參考藍色投機客的文章
http://tw.myblog.yahoo.com/Blue-Speculator/article?mid=855&next=807&l=f&fid=7

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

這是我實作出來的比較圖,圖中上面紅色K棒為調整過的資料,下面為原始資料,使用同樣的策略。可以看到同樣的策略在進出的時間點就不一樣了,沒有調整其實在回測時是會得到不同的結果。
擷取.PNG


解決其中一個方式是在讀入歷史資料之前,就事先做資料的調整,讀入後自然就得到調整後的資料。

但小弟我比較懶,不想以後每次換月都重新轉檔,所以我想到的方法是先準備一個文字檔當作換月的資料庫。
感謝牛哥的網站有幫忙整理好的檔案可以下載
http://www.insight2it.com/appTW/main/free_backadjust.php

或是下載這份
BackAdjusted.zip (2.09 KB, 下載次數: 1272)


所以我寫的AFL將會根據這個文字檔來做連續月背向調整,
就可以畫出類似我上面的圖。

這樣的作法有個缺點就是會反覆的去讀取硬碟中的文字檔,也可以考慮把它放入RamDisk中減輕負擔。

而好處是以後只要換月記得來更新一下這個文字檔就好了。

希望可以抛磚引玉有更多實作的討論

評分

參與人數 2金錢 +7 收起 理由
kilroy + 5 小弟五分推一下 XD
oneman001 + 2 可以從頭教嗎 AB好難

查看全部評分

 樓主| 發表於 11-8-30 20:16 | 顯示全部樓層
記得要修改參數DataPath符合你放文字檔的路徑
  1. function GetBackAdjustedData( DataPath )
  2. {

  3. DateData=DateNum();
  4. AdjustedDiff=0;

  5. //for(i=0; i<BarCount; i++)
  6. //_TRACE(NumToStr(DateData[i],1.0));

  7. fh=fopen(DataPath, "r");
  8. if(fh)
  9. {
  10.         while( !feof(fh) )
  11.         {
  12.                 string=fgets(fh);
  13.                 //_TRACE("#"+string);

  14.                 GetDate=StrExtract(string, 0);// the date to Transfer
  15.                 GetDiff=StrExtract(string, 5);// Diff between two month
  16.                
  17.                 //_TRACE("#"+GetDate+": "+GetDiff);
  18.                 GetYear=StrLeft(GetDate,4);
  19.                 GetMonthDay=StrRight(GetDate,4);

  20.                 GetDate=NumToStr( StrToNum(GetYear)-1900,1.0)+GetMonthDay;
  21.                 //_TRACE("#"+GetDate);

  22.                 GetDateNum=StrToNum(GetDate);
  23.                 GetDiffNum=StrToNum(GetDiff)*-1;
  24.                 for(i=0; i<BarCount; i++)
  25.                 {
  26.                         //_TRACE("#"+GetDate+" : "+NumToStr(DateData[i],1.0)+" : " + GetDiff);
  27.                        
  28.                         if(DateData[i]<=GetDateNum)
  29.                                 AdjustedDiff[i]+=GetDiffNum;
  30.                         else
  31.                                 break;
  32.                 }
  33.                
  34.         }
  35.         fclose(fh);
  36. }
  37. else
  38. {
  39.         _TRACE("ERROR, File does not exist!!");
  40. }


  41. return AdjustedDiff;
  42. }

  43. DataPath=ParamStr("Data Path","C:\\Program Files (x86)\\AmiBroker\\Formulas\\Custom\\BackAdjusted.txt");
  44. BackAdjustedDiff=GetBackAdjustedData(DataPath);

  45. newOpen=O+BackAdjustedDiff;
  46. newHigh=H+BackAdjustedDiff;
  47. newClose=C+BackAdjustedDiff;
  48. newLow=L+BackAdjustedDiff;

  49. PlotOHLC(newOpen, newHigh, newLow, newClose, "BackAdjusted", colorRed, styleCandle);

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

評分

參與人數 1金錢 +2 收起 理由
oneman001 + 2

查看全部評分

發表於 11-8-30 20:27 | 顯示全部樓層
我一直覺得很奇怪在coco上找不到類似實作的文章
難道大家做波段時都完全不考慮換月的影響嗎?
直接就用連續月的資料來跑交易?


小弟真的是沒有在考慮這個


---
發表於 11-8-30 20:32 | 顯示全部樓層
小弟我又來騙coco幣了
為什麼要做Back Adjusted?
可以先參考藍色投機客的文章


我一直覺得很奇怪 ...
GnuHomot 發表於 11-8-30 08:15 PM


   大大的波段程式看起來不錯唷~~
 樓主| 發表於 11-8-30 22:16 | 顯示全部樓層
繼續來騙co幣
回測的時候Amibroker還是參考原來的OHLC,所以回測的結果當然不能參考。
那怎麼辦呢?

Amibroker其實有強打一個功能,但是在coco上居然都還沒看過有人使用相關的範例
也就是AddToComposite這個功能,可以利用計算出來的資料產生新的Symbol
我應該是首發

所以修改過後的程式碼我會貼在下一篇回文。

程式碼的使用方法,由於AddToComposite在一般情況下只限定Scan時使用,所以在Automatic Analysis介面Scan後
你會發現左邊的Symbol List產生一個新的Symbol
而這就是調整完的資料

來比較一下有無做Back Adjusted的結果

1.PNG


這是未調整的回測結果,看起來績效似乎不佳,但注意綠線劃起來6/15那筆交易,有跨日到6/16,虧損-304。
但其實6/15是換倉日!!

2.PNG


這是使用上述動作所產生新的,做過Back Adjusted調整的資料所回測的結果,6/15那天其實沒有那麼大的虧損。
調整過的資料回測其實績效還可以。

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

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

評分

參與人數 2金錢 +4 收起 理由
joey0415 + 2
oneman001 + 2

查看全部評分

 樓主| 發表於 11-8-30 22:17 | 顯示全部樓層
  1. function GetBackAdjustedData( DataPath )
  2. {

  3. DateData=DateNum();
  4. AdjustedDiff=0;

  5. //for(i=0; i<BarCount; i++)
  6. //_TRACE(NumToStr(DateData[i],1.0));

  7. fh=fopen(DataPath, "r");
  8. if(fh)
  9. {
  10.         while( !feof(fh) )
  11.         {
  12.                 string=fgets(fh);
  13.                 //_TRACE("#"+string);

  14.                 GetDate=StrExtract(string, 0);// the date to Transfer
  15.                 GetDiff=StrExtract(string, 5);// Diff between two month
  16.                
  17.                 //_TRACE("#"+GetDate+": "+GetDiff);
  18.                 GetYear=StrLeft(GetDate,4);
  19.                 GetMonthDay=StrRight(GetDate,4);

  20.                 GetDate=NumToStr( StrToNum(GetYear)-1900,1.0)+GetMonthDay;
  21.                 //_TRACE("#"+GetDate);

  22.                 GetDateNum=StrToNum(GetDate);
  23.                 GetDiffNum=StrToNum(GetDiff)*-1;
  24.                 for(i=0; i<BarCount; i++)
  25.                 {
  26.                         //_TRACE("#"+GetDate+" : "+NumToStr(DateData[i],1.0)+" : " + GetDiff);
  27.                        
  28.                         if(DateData[i]<=GetDateNum)
  29.                                 AdjustedDiff[i]+=GetDiffNum;
  30.                         else
  31.                                 break;
  32.                 }
  33.                
  34.         }
  35.         fclose(fh);
  36. }
  37. else
  38. {
  39.         _TRACE("ERROR, File does not exist!!");
  40. }


  41. return AdjustedDiff;
  42. }

  43. DataPath=ParamStr("Data Path","C:\\Program Files (x86)\\AmiBroker\\Formulas\\Custom\\BackAdjusted.txt");
  44. BackAdjustedDiff=GetBackAdjustedData(DataPath);

  45. newOpen=O+BackAdjustedDiff;
  46. newHigh=H+BackAdjustedDiff;
  47. newClose=C+BackAdjustedDiff;
  48. newLow=L+BackAdjustedDiff;

  49. //PlotOHLC(newOpen, newHigh, newLow, newClose, "BackAdjusted", colorRed, styleCandle);
  50. Buy=Sell=Short=Cover=0;
  51. GenName="~Adjusted"+Name();
  52. if  ( Status("action") == actionScan  )
  53. {
  54. AddToComposite(newOpen,GenName,"O");
  55. AddToComposite(newHigh,GenName,"H");
  56. AddToComposite(newLow,GenName,"L");
  57. AddToComposite(newClose,GenName,"C");
  58. AddToComposite(V,GenName,"V");
  59. }

  60. PlotOHLC(Foreign(GenName,"O"), Foreign(GenName,"H"), Foreign(GenName,"L"), Foreign(GenName,"C"), "Foreign", colorRed, styleCandle);

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

評分

參與人數 1金錢 +2 收起 理由
oneman001 + 2

查看全部評分

發表於 11-8-30 22:32 | 顯示全部樓層
版大 可以在 coco 開課嗎 ?
 樓主| 發表於 11-8-30 22:42 | 顯示全部樓層
回復 7# oneman001


開課的話不可能啦,我其實很菜。
我倒是可以提供我學習的路徑
發表於 11-8-30 23:58 | 顯示全部樓層
本帖最後由 tedwang 於 11-8-31 12:27 AM 編輯
記得要修改參數DataPath符合你放文字檔的路徑
GnuHomot 發表於 11-8-30 08:16 PM


Gnu大不好意思, 我沒有在用AB, 但想了解一下是如何調整換倉點差.
這裡得到的 AdjustedDiff 是要去加減到前面所有舊月份K棒的OHLC?
謝謝.
發表於 11-8-31 00:31 | 顯示全部樓層
又是AB的程式,小弟不能用。

考慮換月時,小弟都是只直接在結算日平倉掉!因為這樣做起來比較簡單!
 樓主| 發表於 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)
發表於 11-8-31 07:26 | 顯示全部樓層
Amibroker其實有強打一個功能,但是在coco上居然都還沒看過有人使用相關的範例
也就是AddToComposite這個功能,可以利用計算出來的資料產生新的Symbol
我應該是首發
GnuHomot 發表於 11-8-30 10:16 PM



  願意分享是很好啦

  不過用 "居然都還沒看過有人..." 這個有點奇怪 XD

---

這是使用上述動作所產生新的,做過Back Adjusted調整的資料所回測的結果,6/15那天其實沒有那麼大的虧損。
調整過的資料回測其實績效還可以。

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

要不要做換月的調整其實應該跟策略有關係,如果是日內當沖的話其實就不用考慮這個問題,但如果持倉有跨日的話,就不得不考慮這個影響的程度了。
GnuHomot 發表於 11-8-30 10:16 PM



  版大現在往波段程式的方向去開發程式交易


  小弟覺得很讚,不過實際上,有些東西是比這個還重要的 XDXDXD


  期待後續版大的分享唷
 樓主| 發表於 11-8-31 08:11 | 顯示全部樓層
回復 12# kilroy


K大你要說清楚什麼東西更重要啊
我發文的用意本來就只是想把這個版累積Amibroker經驗再進前推
發表於 11-8-31 08:57 | 顯示全部樓層
回復  tedwang


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

算術式換倉調整 (Arithmetic Back-Adjusted) ...
GnuHomot 發表於 11-8-31 05:59 AM


謝謝.
以台指期過去歷史來看, 應該還不會發生 "累計調整下去,它可能會造成負數的成交價"吧?
 樓主| 發表於 11-8-31 09:04 | 顯示全部樓層
回復 14# tedwang


應該是不會,不過不代表以後不會,使用上要留意就是了
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-11-25 04:10

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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