fbpx

ช่วยวิเคราะห์ปัญหาและแนวทางแก้ไขให้ทีครับ กับผล backtest

ติดป้ายกำกับ: , ,

  • ผู้สร้าง
    กระทู้
  • #16527
    PatchawatPatchawat
    Participant

    สวัสดีครับ

    โมเดลผมคือ
    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 แล้วก็ยังไม่ช่วยครับ

    ขอบคุณครับ

    Attachments:
    You must be logged in to view attached files.
  • คุณต้องเข้าสู่ระบบเพื่อตอบกลับกระทู้นี้