fbpx

Magic formula

  • ผู้สร้าง
    กระทู้
  • #11075
    VIVID
    Participant

    สวัสดีครับ ผมเพิ่งได้ลองนำโค้ดเรื่อง Magic Formula จาก http://www.siamquant.com/lab/magic-formula-backtested-performance-in-thai-stock-market/ มาลองเทสโดยแก้ไขส่วน Include ดังนี้

    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.1.0\SQ Include\SQ – Include Data Declaration.afl” #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.1.0\SQ Include\SQ – Include Data Restriction.afl”
    สามารถกด Backtest ได้นะครับ แต่ผลที่ออกออกมา ค่าเป็น 0 หมด ไม่แน่ใจว่าทำอะไรผิดไปครับ
    รบกวนผู้รู้ด้วยนะครับ ขอบคุณครับ
กำลังดู 18 ข้อความตอบกลับ - 1 ผ่านทาง 18 (ของทั้งหมด 18)
  • ผู้เขียน
    ข้อความตอบกลับ
  • #11078
    Amibroker Platform
    Participant

    ลองกด Scan ดูซัก 10 ปี คับ ว่ามีซื้อขายอะไรมั้ยคับ

    หรือดู Code ตรง ไฟล์ #inclued_one ว่ามีเขียนหรือวรรคผิดมั้ยคับ

    #11079
    VIVID
    Participant

    คุณ Amibroker Platform ครับ ผมลองBacktest จาก 1990-2000 ก็ได้ค่าเป็น 0 เช่นเดียวกับ 1995-2005 ครับ ส่วนเรื่องของไฟล์ #Include นั้นผมแก้เป็นอย่างที่แคปมาเลยครับ

    ไฟล์ส่วนที่เหลือผมก็ก๊อปมาโดยไม่ได้ปรับแต่งอะไร แปลกใจจริงๆครับ

    #11081
    Amibroker Platform
    Participant

    ลอง #inclued_one 1.0.1.0 ไฟล์เดียว เเล้ว Backtest ดูคับ ได้มั้ยคับ

    #11083
    VIVID
    Participant

    หลังจากที่แก้เป็นแบบนี้

    ไฟล์ก็ได้ผลออกมาแล้วครับ แต่ว่า ปัญหาใหม่คือ ไม่ว่าผมจะเลือกช่วงเวลาเป็นตั้งแต่ปี 1980 – 2016 หรือ 1990 – 2016 ค่าที่ออกมาจะเริ่มเทรดที่ปี 2010 ตลอดเลยครับ

    #11085
    Amibroker Platform
    Participant

    ลองเปลี่ยนไฟล์ #inclued_one อันที่ 2 กับ 3 เป็น 1.0.2.0 ว่าได้มั้ยคับ

    #11086
    VIVID
    Participant

    ผมลอง #Include_once ทั้งแบบ 1.0.1.0 และ 1.0.2.0 ได้ผลไม่ต่างกันครับ เลยมาลองปรับที่ Apply to จากเดิมผมเลือก Filter เฉพาะ ALLSTOCK ผลออกเริ่มที่ปี 2010 พอเปลี่ยนเป็น all symbol ผลเริ่มจากปีที่ผมเลือกเทสครับ

    ตอนนี้ยังไม่ค่อยแน่ใจว่า all symbol ต่างกับ ALLSTOCK ยังไงถึงให้ผลต่างกันขนาดนี้ ครับ

    ขอบคุณสำหรับคำแนะนำมากๆครับ

    #11089
    Amibroker Platform
    Participant

    ALLSTOCK คือ Watchlist ของ SQ ทำให้ คือรวมหุ้นทุกตัวในตลาดคับ

    เเต่ all symbol ตรง Filter คือรวมทุกตัวของ Symbol ใน Data

    เวลา Backtest ต้องใช้ ALLSTOCK คับ

    #11090
    VIVID
    Participant

    ขอบคุณครับ ผมลองกลับไปใช้ Filter –> ALLSTOCK

    แล้วทดสอบช่วง 1980-2000  ปรากฏว่าผลไม่ขึ้นเช่นเคย

    แต่ถ้าทดสอบ 1980-2015 จะเริ่มเทรดตั้งแต่ 2010

    เท่าที่เดาปัญหาน่าจะอยู่ที่ Watchlist แต่ผมก็ยังหาทางแก้ไม่เจอครับ

    #11092
    Amibroker Platform
    Participant

    ลองลบหุ้น 2s ออกจาก Watchlist เเล้ว Backtest ใหม่คับ

    #11093
    VIVID
    Participant

    ลองเอา 2s ออกแล้วครับ ค่าดีขึ้นเริ่ม เทรดจาก 2005 แต่ก็ยังไม่ถูกทั้งที่ควรจะเริ่มจากปี 1980 นะครับ

    #11095
    Amibroker Platform
    Participant

    ปัญหาน่าจะมาจาก Watchlist จริงๆคับ ผมรู้สึกว่าเหมือนมีปัญหากับหุ้นที่เป็นตัวเลขนำหน้าคับ

    #11097
    VIVID
    Participant

    ครับ ลองไล่ลบชื่อหุ้นที่แปลกๆ ออกผลก็ไม่ต่างจากเดิม เดี๋ยวผมคงต้องลองสร้าง watchlist ใหม่เอง เพื่อมาเทสอีกที …

    #11098
    chaipod
    Participant

    ให้ copy หุ้นที่มี data สมบูรณ์ เช่น SET, PTT, SCC,…

    จากนั้นเปลี่ยนชื่อโดยมี 0 หรือ 1 นำหน้า เช่น 0SET, 1PTT, 00SCC

    เพื่อให้ชื่อหุ้นขึ้นเป็นลำดับแรก ก่อน 2S  เพิ่มเข้าไปใน watchlist ที่จะทำการ backtest

    แล้วแก้ code ไม่ให้ backtest ชื่อหุ้นที่เพิ่มเข้ามาใหม่

    แล้วลอง backtest ดูใหม่นะครับ…

     

    #11099
    chaipod
    Participant

    หรือลองแบบง่ายๆก่อน โดยลบชื่อหุ้นที่อยู่ก่อน ADNANC ใน watchlist ออกให้หมด

    ให้เหลือ ADVANC  เป็นรายชื่อหุ้นตัวแรก แล้ว แล้วลอง backtest ดูครับ

     

    #11100
    Benz
    Keymaster

    ผมลองแนะนำให้ลองเปลี่ยน ใช้วิธีนี้ดูก่อนครับ

    1. ไปที่ File-> Database Setting -> Configure

    2. Retrieve Symbols 1 ครั้ง

    3 ตรวจสอบดูว่า มี Symbol “0SET” ขึ้นมาหรือยังครับ

     

    ถ้ามีแล้วหลังจากนั้นให้ลองกด Backtest อีกครั้งหนึ่งครับ

    หากยังไม่ได้ช่วยแจ้งให้ทีมงานทราบอีกครั้งนะครับ

     

    ขอบคุณครับ

    #11101
    BlueStepz
    Participant

    สมมติอันนี้เป็นโครงสร้างคร่าวๆของสูตรนะครับ

    symlist = CategoryGetSymbols( … );

    if( Status(“stocknum”) == 0 )
    {
        for( i = 0; ( sym = StrExtract( symlist, i ) ) != “”; i++ )
       {

    ปัญหาจริงๆเกิดจากคำสั่งบรรทัดนี้ครับ

    if( Status( “stocknum” ) == 0 )

    คือมันเป็นคำสั่งที่บอกให้ Amibroker เก็บค่า Ranking ของหุ้นทุกตัว (for-loop) ใน Watchlist ที่เราใช้
    เฉพาะตอนที่โปรแกรมอ่านค่า แล้วเจอข้อมูลของหุ้นตัวแรกใน Watchlist นั้นๆครับ
    (ไม่อย่างนั้นมันจะ for-loop ทุกครั้งที่อ่านค่าหุ้นตัวใหม่ ซึ่งทำให้ช้าและเปลืองทรัพยากรมากครับ)
    หรือก็คือ หุ้นตัวแรกใน Watchlist ที่เราใช้จะมีค่า Status( “stocknum” ) เท่ากับศูนย์ครับ
    มันจึงเป็นสาเหตุว่าทำไมผลการ Backtest จึงถูกเก็บค่าตามช่วงเวลาของ “หุ้นตัวแรก” ครับ
    ซึ่ง Watchlist ส่วนใหญ่จะมีหุ้น 2S เป็น Symbol ตัวแรก
    ดังนั้นผลทดสอบจึงเริ่มประมาณปี 2009 เพราะ 2S เริ่มเทรด 2009-09-02 (YMD) นั่นเองครับ

     

    วิธีแก้ปัญหาอย่างง่ายก็คือ

    การใช้ข้อมูล SET Index (เพราะถือเป็น Symbol ที่มีการซื้อขายครบทุกวัน และมีช่วงเวลายาวที่สุด)

    ในการสร้าง Symbol ใหม่ขึ้นมาแต่เปลี่ยนชื่อเป็นอะไรก็ได้เรียงตามตัวอักษร

    แต่ต้องให้ชื่อที่เปลี่ยนเป็นหุ้นตัวแรกใน Watchlist ที่ใช้นะครับ

    อย่างของทาง SiamQuant จะใช้ชื่อว่า “0SET” ครับ (ตอนนั้นคิดอะไรไม่ออก ก็เติมศูนย์ไว้ข้างหน้ามันไปเลย 55+)

    แล้วเวลา Backtest ตอนเขียน Entry อย่าลืมเอา Symbol “0SET” ออกไปด้วยนะครับ เด๋วมันจะติดเข้าไปอยู่ในผลทดสอบ เช่น

    No0SET = Name() != “0SET”;
    Buy = No0SET AND …
    ถ้ายังไงลองเปลี่ยน Symbol เป็น 0SET ดูก่อนครับ ถ้าไม่ได้หรือติดปัญหาอะไรเด๋วมาช่วยครับ (ถ้าพอช่วยได้นะครับ ^^”)
    #11105
    VIVID
    Participant

    @คุณchaipod ครับ ผมลองใช้เฉพาะ advanc ผมออกมาเริ่มเทรดตามที่ ควรจะเป็นครับ ส่วนเรื่องที่ให้ลองแก้ Code ไม่ให้ Backtestตัวที่เพิ่มเข้ามาใหม่ อันนี้ผมทำไม่เป็นครับ จากการลองอันนี้ทำให้ผมสงสัยขึ้นมาอีกอย่างหนึ่งครับ เนื่องจากเป็นการ Rotation Trade ทำไมผลเทสถึงออกมาเป็นการซื้อขายแค่ครั้งเดียวไม่มีการขายออกแล้วเปลี่ยนตัวใหม่ครับ

    @คุณBenz ผมลองทำตามที่แนะนำแล้วปรากฏว่าผลเหมือนเดิมครับ เลยลองใส่ “0Set” เข้าใน Watchlist ตามที่คุณ BlueStepz แนะนำ ผลออกมาดังรูปนี้ครับ

    ผมเลือกช่วงเวลาเป็น 1990-2016 แต่ระบบเริ่มเทรดเมื่อ 1993 มันก็แปลกๆอยู่นะครับ เพราะตัว set เองมีข้อมูลมาตั้งแต่ปี 1975 แล้ว ผลเทสก็น่าจะเริ่มตั้งแต่ตอนนั้นแล้ว

    มีอีกประเด็นที่ผมสงสัยคือ ค่า TA, TC, TCL .. (ตามรูปด้านล่างนะครับ) ที่นำมาคำนวน Return on Capital Revised และ Earning Yield เพื่อทำ  Rank นั้นข้อมูลเริ่มมีปี 1997 แสดงว่าก่อนหน้าปี 1997 นั้นค่าที่คำนวนได้สำหรับหุ้นทุกตัวจะเป็นศูนย์ ระบบจึงเลือกซื้อหุ้นโดยเรียงจากชื่อใช่ไหมครับ

     

    ขอบคุณครับ 🙂

    #11107
    chaipod
    Participant

    น่าจะเข้าใจผิดครับ คืออยากให้ลองลบเฉพาะรายชื่อหุ้นก่อน advanc ออก  ส่วนรายชื่อหุ้นหลัง advanc ไม่ต้องลบ

    เพราะต้องการหุ้นที่มีข้อมูลสมบูรณ์ที่สุด อยู่เป็นอันดับแรกของ watchlist

    แต่ถ้าทำตามคุณ Benz กับ คุณ ฺBlueStepz ก็ครอบคลุมที่ผมอยากให้ลองแล้วทั้งหมด

    เพราะจะทำให้ 0SET ขึ้นมาเป็นอันดับแรกของ watchlist แทน 2S

    (เพิ่งรู้ว่ามี 0SET ซ่อนอยู่ ใน SQ Data ด้วย)

    ส่วนทำไมผล backtest ถึงเริ่มปี 1993 อาจต้องเช็คดูข้อมูล fundamental ด้วยว่าเริ่มตั้งแต่เมื่อไหร่ครับ

    เพราะอาจไม่มีข้อมูล fundamental สำหรับใช้ backtest ครับ

     

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