- This topic has 0 ข้อความตอบกลับ, 1 เสียง, and was last updated 3 years มาแล้ว by .
-
กระทู้
-
สวัสดีครับ
โมเดลผมคือ
1. rank หุ้นก่อนด้วย criteria1 (ใน ตย จะใช้ ROC 100 วัน) (ใช้ function : staticvargeneraterank)
2. คัด ค่าสูงสุดมา 60 ตัว (ใช้ buyConRank = rank < topn)
3. เลือกมาลงทุน 20 ตัว ด้วย criteria2 (ใน ตย จะใช้ ADX) (ใช้MaxOpenPositions และ SetPositionSize ในการกำหนดจำนวนหุ้น)
4. ถือไปจนครบ 20 วัน (ใช้ ApplyStop(stopTypeNBar)) แล้วขายออก แล้วเลือกหุ้นชุดใหม่อีก 20 ตัว
rebalance แบบนี้ไปเรื่อยๆผมได้โค้ดมาดังนี้ครับ
————————
{//Option
SetOption(“InitialEquity” , 1000000);
SetOption(“MaxOpenPositions”, 20);
SetOption(“MinShares”, 100);
RoundLotSize = 100;
SetOption(“CommissionMode”, 1);
SetOption(“CommissionAmount”, 0.16);SetTradeDelays(1, 1, 0, 0);
BuyPrice = Open;
SellPrice = Open;
}Mainlistnum = GetOption( “FilterIncludeWatchlist” );
Mainlist = CategoryGetSymbols( categoryWatchlist, Mainlistnum );topn = 60;
// Rank at start (if first symbol)
if( Status( “stocknum” ) == 0 )
{
StaticVarRemove( “ValuesToSort*” );
StaticVarRemove( “rank*” );
StaticVarRemove( “top*” );// Fill input value (for ranking) into Static arrays
for( i = 0; ( sym = StrExtract( Mainlist, i ) ) != “”; i++ )
{
SetForeign(sym );
Value = ROC(C, 100);
RestorePriceArrays();
StaticVarSet( “ValuesToSort” + sym, Value );
}// Perform Ranking
StaticVarGenerateRanks( “rank”, “ValuesToSort”, 0, 1224 ); // normal ranking
StaticVarGenerateRanks( “top”, “ValuesToSort”, topn, 1224); // Top rank mode
}rank = StaticVarGet(“rankValuesToSort” + Name() );
buyConRank = rank < topn;
noPenny = C > 3;
highLiquid = C * Ref(MA(V,5), -1) > 5000000;Buy = buyConRank AND noPenny AND highLiquid; //buyConMK +
Sell = 0;
Short = Cover = 0;{//Position
SetPositionSize(5, spsPercentOfEquity);
PositionScore = ADX(14);
}{//Stop
ApplyStop(stopTypeNBar, stopModeBars, 20);//20 means 20 trading day equal to 1 month holding period.
}// comma separated list of top ranked (number defined in StaticVarGenerateRanks( “top”, “ValuesToSort”, topn, 1224); )
topranked = StaticVarGetRankedSymbols( “top”, “ValuesToSort”, LastValue (DateTime()) );
// ranked values
values = StaticVarGet(“ValuesToSort” + Name() );// Exploration
// %s requires AmiBroker 6.20
//AddRow( StrFormat( “Top ranked at last bar (%s): %s”, DateTimeToStr(LastValue (DateTime())), topranked ) );
AddColumn( values, “Rank Values” );
AddColumn( rank, “Rank” );Filter = buyConRank;
————————ผลการ backtest แรกๆก็เข้าหุ้น 20 ตัว ถือไปจนครบ 20 วัน แล้วขายออกหมด แล่วซื้อเข้าใหม่อีก 20 ตัว ดีตามที่ตั้งใจให้เป็นนะครับ
(ตามที่ตั้งใจไว้ คือ rebalance ทั้งหมด แต่ละครั้งคือ 20 ตัวเป๊ะ)
แต่หลังๆเริ่มเพี้ยนๆ ดังภาพที่ผมส่งให้ คือมันเริ่ม เข้าไม่ถึง 20 ตัว
โปรดดูรูปประกอบ และรูปที่แนบตามมาครับบางท่าน(ซึ่งอาจจะอยู่ที่ siamquant หรือวนเวียนใน forumนี้) แนะนำมาว่า
“สาเหตุเป็นเพราะว่า หุ้นมันออกไม่พร้อมกันครับ ลอง track จำนวน bar ดู
จาก code คือระบุว่า ให้ออกเมื่อครบ 20 Bars แต่ถ้าหุ้นตัวนั้น มันมีบางวันที่ไม่มีการเทรด
หรือว่าหยุดการเทรดไป ทำให้มันจะยังไม่ออก เมื่อครบ 1 เดือน จะไปทำการออกก็ต่อเมื่อ
มันมีการเทรดครบ 20 bars ตั้งแต่วันที่ซื้อครับ
ลองเอาตัวที่น่าสงสัย แล้วเช็คกราฟ นับ bars ดูครับ”ซึ่งผมก็คิดว่าน่าจะมีมูลและ make sense มากครับ
แต่ที่ผมสงสัยคือ ผมมีอีกโค้ดนึงที่ ถือหุ้นครั้งละ 20 ตัว และถือนานไป 20 วัน คล้ายๆกัน ดังนี้
——————————
{//Option
SetOption(“InitialEquity” , 1000000);
SetOption(“MaxOpenPositions”, 20);
SetOption(“MinShares”, 100);
RoundLotSize = 100;
SetOption(“CommissionMode”, 1);
SetOption(“CommissionAmount”, 0.16);SetTradeDelays(1, 1, 0, 0);
BuyPrice = Open;
SellPrice = Open;
}{//Signal
SetForeign(“SET”);
buyConMK = MA(C,20) > MA(C,100);
RestorePriceArrays();NOT_too_penny = C > 0.01;
//Liquidity check
Liquidity = MA(V, 5) * C;
HiLiq = Liquidity > 5000000;Buy = buyConMK AND NOT_too_penny AND HiLiq;
Sell = 0;
}{//Position
SetPositionSize(5, spsPercentOfEquity);
PositionScore = 1000 + ROC(C,100);
}{//Stop
ApplyStop(stopTypeNBar, stopModeBars, 20);//20 means 20 trading day equal to 1 month holding period.
}
——————————
ซึ่งผลการ backtest โค้ดที่2นี้ คือ ไม่ว่าจะยาวๆกี่ปี ก็เข้าหุ้น 20 ตัว ออก 20 ตัวพร้อมกันเป๊ะครับ
ตามที่ผมต้องการให้เป็นเลยครับ ทดสอบบนฐานข้อมูลเดียวกันด้วย (CDC data)
ทำให้เหตุผลที่มีบางท่านแนะนำมา อาจจะยังไม่ตรง รึป่าวครับ ??ไม่ทราบว่า เกี่ยวกับ code แรก
1. ทุกท่านลองเอาโค้ดอันแรกไปรัน แล้วเจอปัญหาเดียวกันไหมครับ (ที่เริ่ม simulate ไปเรื่อยๆแล้ว เริ่มเข้าออกหุ้นแต่ละรอบ ไม่ครบตามที่ระบุ)
2. พอจะมีคำแนะนำ/แนวทางปรับแก้ หรือไปควรเช็คเรื่องอะไรไหมครับ
ผมได้ลองปรับนู่นนั่นนี้ที่ setting ของ backtest แล้วก็ยังไม่ช่วยครับขอบคุณครับ
- คุณต้องเข้าสู่ระบบเพื่อตอบกลับกระทู้นี้