fbpx

รบกวนถามเรื่อง Backtesting ครับ (ภาค 2)?

  • This topic has 4 ข้อความตอบกลับ, 2 เสียง, and was last updated 9 years มาแล้ว by นิรนาม.
  • ผู้สร้าง
    กระทู้
  • #5779
    นิรนาม
    ไม่เปิดใช้

    รบกวนคุณมดเยอะหน่อยนะครับช่วงนี้ แหะๆ >_<

    คือหลังจากลอง backtest แล้ว ดูตาราง trade ที่ amibroker มัน report มาแล้วสงสัย (ดูไฟล์แนบประกอบนะครับ)

    1. จาก report มันแสดงให้เห็นว่ามัน เข้าเทรด หุ้นตัวเดียวถึงสองครั้ง(2 rows) ในวันเดียวกัน ราคาเดียวกัน จำนวนเงินก็เท่ากัน ผมเลยสงสัยว่ามันเกิดจากการที่ผมเซ็ทอะไรตรงไหนผิดหรือเปล่า?
    คุณมดพอจะทราบมั้ยครับ?

    2. อีกเรื่องคือ ในคอลัม Trade นั้น Open Long กับ Long มันต่างกันยังไงครับ?
    ผมเขียนโค้ดเทสแค่ Buy กับ Sell เอง ทำไมมันถึงแยกเป็น Open Long กับ Long ครับ?
    มันควรมีแค่ Long ซึงหมายถึง Buy อย่างเดียวหรือเปล่าครับ?

    ขอบคุณล่วงหน้าครับ ^_^

กำลังดู 4 ข้อความตอบกลับ - 1 ผ่านทาง 4 (ของทั้งหมด 4)
  • ผู้เขียน
    ข้อความตอบกลับ
  • #5783
    นิรนาม
    ไม่เปิดใช้

    ถามเพิ่มอีกนิ๊สสครับ แหะๆ
    คือผมสงสัยว่า amibroker มันเลือกหุ้นที่มันจะ buy ยังไง?

    เพราะที่ผมลอง backtest แล้วดู report รายชื่อหุ้นที่มัน order buy อย่างเดียว สมมติว่าทั้งหมดที่ระบบซื้อมี 10 ตัว
    แต่พอผมเอาระบบเดียวกันนี่มา scan (กดปุ่ม scan)หุ้นดู ด้วย time frame เดียวกันกับที่ backtest มะกี้ ปรากฏว่าผมได้รายชื่อหุ้นที่มีสัญญาณซื้อถึง 90 ตัวแนะ

    ก็เลยสงสัยว่าอ่าว…ami เนี่ยมันไปหยิบ 10 ตัวนั้นมายังไง???
    ถ้าจะบอกว่า random ก็ไม่น่าใช่ เพราะทุกครั้งที่กด backtest ผมก็ได้ 10 ตัวเดิมนั้นตลอดเวลา

    #5782
    นิรนาม
    ไม่เปิดใช้

    ผมดูจากในภาพแล้วงงเหมือนกันครับไม่เคยเจอกับตัวเอง พอจะบอกได้มั้ยครับว่าเขียนสูตรยังไง ผมอยากจะลองทำแล้วเจอบ้าง 55 😛 อันนี้ตอบไม่ได้เหมือนกัน แต่คิดว่าน่าจะเป็นจากคำสั่งที่เราเขียนหรือค่าที่เราตั้งไว้นะครับ

    Long กับ Open Long ต่างกันตรงที่ Long คือการรายงานผลว่าระบบได้ซื้อหุ้นและขายออกเรียบร้อยแล้ว แต่ Open Long คือระบบเข้าซื้อหุ้นแต่ยังมีค้างอยู่จนกระทั่งวันที่เราหยุดผลการ Test ครับ

    Amibroker หรือโปรแกรมส่วนใหญ่จะทำการเลือกหุ้นในเบื้องต้นโดยเรียงไปตามตัวอักษร A,B,C… ไปเรื่อยๆครับ ถ้าจะให้เลือกตามที่เราต้องการให้ใช้คำสั่ง PositionScore ครับ รายละเอียดมีอยุ่ในคู่มือหรือ Help เขาครับ ลองอ่านดูนะครับ

    #5781
    นิรนาม
    ไม่เปิดใช้

    เจอตัวปัญหาละครับ
    พอดีผมขยันไปหน่อย ไปลองเขียน user-defined metrics ให้มันแสดง expectancy นู่นนี่เพิ่ม(จิงๆผมก็ก๊อปสูตรมาจากคู่มือของ ami เลย)
    พอลองเอาออก row ที่ซ้ำกัน 2 อัน ก็เหลือ row เด๊วละครับ

    อันนี้โค้ดที่ไปเอามาใส่ ไม่รุอะไรทำให้มันเป็นอย่างนั้น
    /*===== User-defined Metrics =======*/
    /* First we need to enable custom backtest procedure and
    ** tell AmiBroker to use current formula
    */

    SetCustomBacktestProc(“”);

    /* Now custom-backtest procedure follows */

    if( Status(“action”) == actionPortfolio )
    {
    bo = GetBacktesterObject();

    bo.Backtest(); // run default backtest procedure

    /*###### Expectancy 1 ###########*/
    st = bo.GetPerformanceStats(0); // get stats for all trades

    // Expectancy calculation (the easy way)
    // %Win * AvgProfit – %Los * AvgLos
    // note that because AvgLos is already negative
    // in AmiBroker so we are adding values instead of subtracting them
    // we could also use simpler formula NetProfit/NumberOfTrades
    // but for the purpose of illustration we are using more complex one
    expectancy = st.GetValue(“WinnersAvgProfit”)*st.GetValue(“WinnersPercent”)/100 +
    st.GetValue(“LosersAvgLoss”)*st.GetValue(“LosersPercent”)/100;

    // Here we add custom metric to backtest report
    bo.AddCustomMetric( “Expectancy ($)”, expectancy );

    /*###### Expectancy 2 ###########*/
    SumProfitPer100Inv = 0;
    NumTrades = 0;

    // iterate through closed trades first
    for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
    {
    // here we sum up profit per $100 invested
    SumProfitPer100Inv = SumProfitPer100Inv + trade.GetPercentProfit();
    NumTrades++;
    }

    // iterate through eventually still open positions
    for( trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos() )
    {
    SumProfitPer100Inv = SumProfitPer100Inv + trade.GetPercentProfit();
    NumTrades++;
    }

    expectancy2 = SumProfitPer100Inv / NumTrades;

    bo.AddCustomMetric( “Expectancy (per $100 inv.)”, expectancy2 );

    /*###### Expectancy 3 ###########*/
    MaxLossPercentStop = 10; // 10% max. loss stop
    SumProfitPerRisk = 0;
    NumTrades = 0;

    // iterate through closed trades first
    for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
    {
    // risk is calculated as the maximum value we can loose per trade
    // in this example we are using max. loss stop
    // it means we can not lose more than (MaxLoss%) of invested amount
    // hence ris

    Risk = ( MaxLossPercentStop / 100 ) * trade.GetEntryValue();
    RMultiple = trade.GetProfit()/Risk;

    trade.AddCustomMetric(“Initial risk $”, Risk );
    trade.AddCustomMetric(“R-Multiple”, RMultiple );

    SumProfitPerRisk = SumProfitPerRisk + RMultiple;
    NumTrades++;
    }

    expectancy3 = SumProfitPerRisk / NumTrades;

    bo.AddCustomMetric( “Expectancy (per risk)”, expectancy3 );

    bo.ListTrades();
    }

    #5780
    นิรนาม
    ไม่เปิดใช้

    อ้อ Code สงสัยมันซ้อนกัน ขอบคุณครับผม ^_^

กำลังดู 4 ข้อความตอบกลับ - 1 ผ่านทาง 4 (ของทั้งหมด 4)
  • คุณต้องเข้าสู่ระบบเพื่อตอบกลับกระทู้นี้