fbpx

***CODE สำหรับหา EPS แบบ Qauterly / QoQ / YoY ครับ***

SiamQuant Minimal Home – White Webboard ห้องโปร : Professional Membership Support ***CODE สำหรับหา EPS แบบ Qauterly / QoQ / YoY ครับ***

  • ผู้สร้าง
    กระทู้
  • #10462
    chaipod
    Participant

    จาก code ที่ทดลองเขียนเพื่อหา EPS แบบ QoQ และ YoY

    http://www.siamquant.com/webboard/topic/eps-yoy-q-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%a5%e0%b8%9a%e0%b9%81%e0%b8%81%e0%b9%89%e0%b8%a2%e0%b8%b1%e0%b8%87%e0%b9%84%e0%b8%87%e0%b8%84%e0%b8%a3%e0%b8%b1%e0%b8%9a/page/2/#post-10460

    โดย code ข้างต้นยอมให้ข้อมูลแต่ละ quater คลาดเคลื่อนได้ไม่เกิน 2%
    พบว่ายังมีปัญหา spike อยู่  เนื่องจากข้อมูลมี error มากกว่า 2%
    จึงทำการแก้ไข code ให้ใหม่

    ***โดย code ใหม่นี้ จะใช้งานได้ดีเพียงใดขึ้นอยู่กับ
    1. ข้อมูล quarter(SQQE) ต้องไม่คลาดเคลื่อน
    2. เวลาบันทึกข้อมูล SQQE กับ SQEPS ต้องตรงกัน เช่น
    ถ้ามีการเปลี่ยนจาก Q1 เป็น Q2 ต้องมีการเปลี่ยนข้อมูล
    SQEPS จาก Q1 เป็น Q2 ภายในวันเดียวกันด้วยเช่นกัน
    3. ข้อมูลวันแรกของแต่ละ quarter ต้องมีค่าที่ถูกต้อง

    ซึ่งจากการทำสอบเบื้องต้นก็ใช้งานได้ดีพอสมควร
    จึงขอนำมาแปะไว้  เผื่อท่านอื่นที่สนใจจะได้นำไปใช้ต่อไป….

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Ppppppppppppppppppppppppppppppppppppppppp Sssssssssssssssssssssssssssssssssssssssssssss //

    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.2.0\SQ Include\SQ – Include Data Declaration.afl”
    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.2.0\SQ Include\SQ – Include Data Restriction.afl”

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Ppppppppppppppppppppppppppppppppppppppppp Sssssssssssssssssssssssssssssssssssssssssssss //

    for( i = 0; i < BarCount; i++ )
    {
    if( i > 0 )
    {
    if( SQQE[ i ] == 1  AND  SQQE[ i – 1 ] == 4 )        epsQ1[ i ] = SQEPS[ i ];
    else     epsQ1[ i ] = epsQ1[ i – 1 ];

    if( SQQE[ i ] == 2  AND  SQQE[ i – 1 ] == 1 )         epsQ2[ i ] = SQEPS[ i ] – SQEPS[ i – 1 ] ;
    else     epsQ2[ i ] = epsQ2[ i – 1 ];

    if( SQQE[ i ] == 3  AND  SQQE[ i – 1 ] == 2 )         epsQ3[ i ] = SQEPS[ i ] – SQEPS[ i – 1 ] ;
    else     epsQ3[ i ] = epsQ3[ i – 1 ];

    if( SQQE[ i ] == 4  AND  SQQE[ i – 1 ] == 3 )         epsQ4[ i ] = SQEPS[ i ] – SQEPS[ i – 1 ] ;
    else     epsQ4[ i ] = epsQ4[ i – 1 ];

    if( SQQE[ i ]    == 1 )        epsQ[ i ] = epsQ1[ i ];
    if( SQQE[ i ]    == 2 )        epsQ[ i ] = epsQ2[ i ];
    if( SQQE[ i ]    == 3 )        epsQ[ i ] = epsQ3[ i ];
    if( SQQE[ i ]    == 4 )        epsQ[ i ] = epsQ4[ i ];

    }

    else
    {
    epsQ1[ i ] = epsQ2[ i ] = epsQ3[ i ] = epsQ4[ i ] = epsQ[ i ] = Null;
    }
    }

    eps_ROLL    = epsQ1 + epsQ2 + epsQ3 + epsQ4;
    eps_ACC   = SQEPS;
    eps_ANN        = ValueWhen( SQQE == 4 AND ( epsQ != Ref( epsQ, -1 ) ), SQEPS );
    eps_QoQ         = ValueWhen( epsQ != Ref( epsQ, -1 ), ROC( epsQ, 1, True ) );
    eps_Q1YoY     = ValueWhen( epsQ1 != Ref( epsQ1, -1 ), ROC( epsQ1, 1, True ) );
    eps_Q2YoY     = ValueWhen( epsQ2 != Ref( epsQ2, -1 ), ROC( epsQ2, 1, True ) );
    eps_Q3YoY     = ValueWhen( epsQ3 != Ref( epsQ3, -1 ), ROC( epsQ3, 1, True ) );
    eps_Q4YoY     = ValueWhen( epsQ4 != Ref( epsQ4, -1 ), ROC( epsQ4, 1, True ) );

    for( i = 0; i < BarCount; i++ )        //Year on Year
    {
    if( i > 0 )
    {
    if( eps_Q1YoY[ i ] != eps_Q1YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q1YoY[ i ];
    else
    {
    if( eps_Q2YoY[ i ] != eps_Q2YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q2YoY[ i ];
    else
    {
    if( eps_Q3YoY[ i ] != eps_Q3YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q3YoY[ i ];
    else
    {
    if( eps_Q4YoY[ i ] != eps_Q4YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q4YoY[ i ];
    else eps_YoY[ i ] = eps_YoY[ i – 1 ];
    }
    }
    }
    }
    else eps_YoY[ i ] = Null;
    }

    _SECTION_BEGIN( “quaterlyEPS” );
    ShowEpsQ                = ParamToggle( “showquaterlyEPS”, “-|Show”, 1 );
    ColorEpsQ                = ParamColor( “colorEpsQuarter”, colorRed );
    StyleEpsQ                = ParamStyle( “styleEpsQuarter”, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_ROLL” );
    ShowEps_ROLL                = ParamToggle( “showEps_ROLL”, “-|Show”, 0 );
    ColorEps_ROLL                = ParamColor( “colorEps_ROLL”, colorViolet );
    StyleEps_ROLL                = ParamStyle( “styleEps_ROLL”, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_ANN” );
    ShowEps_ANN                = ParamToggle( “showEps_ANN”, “-|Show”, 0 );
    ColorEps_ANN                = ParamColor( “colorEps_ANN”, colorGreen );
    StyleEps_ANN                = ParamStyle( “styleEps_ANN    “, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_QoQ” );
    ShowEps_QoQ             = ParamToggle( “showEps_QoQ”, “-|Show”, 0 );
    ColorEps_QoQ                = ParamColor( “colorEps_QoQ”, colorBlue );
    StyleEps_QoQ                = ParamStyle( “styleEps_QoQ    “, styleDashed, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_YoY” );
    ShowEps_YoY             = ParamToggle( “showEps_YoY”, “-|Show”, 0 );
    ColorEps_YoY                = ParamColor( “colorEps_YoY”, colorCustom12 );
    StyleEps_YoY                = ParamStyle( “styleEps_YoY    “, styleDashed, maskAll );
    _SECTION_END();

    if( ShowEpsQ )                Plot( epsQ, “QuarterlyEPS (Baht)”, ColorEpsQ, StyleEpsQ );
    if( ShowEps_ROLL )            Plot( eps_ROLL, “Eps_ROLL (Baht)”, ColorEps_ROLL, StyleEps_ROLL );
    if( ShowEps_ANN )            Plot( eps_ANN, “Eps_ANN (Baht)”, ColorEps_ANN, StyleEps_ANN );
    if( ShowEps_QoQ )            Plot( eps_QoQ, “Eps_QoQ (%)”, ColorEps_QoQ, StyleEps_QoQ | styleOwnScale);
    if( ShowEps_YoY )            Plot( eps_YoY, “Eps_YoY (%)”, ColorEps_YoY, StyleEps_YoY | styleOwnScale);

    Title = EncodeColor( colorBlue ) +  Name() + ” – ” + Interval( 2 ) + ”  ” + Date() + StrFormat( ”  \\c16||   ” )
    +  “{{VALUES}}”;

    GraphXSpace = 10;

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Dddddddddddddddddddddddddddddddddd //

     

กำลังดู 25 ข้อความตอบกลับ - 1 ผ่านทาง 25 (ของทั้งหมด 25)
  • ผู้เขียน
    ข้อความตอบกลับ
  • #10464
    Amibroker Platform
    Participant

    เเนะนำให้เช็ค Ref เอาคับ เพื่อไปข้างหน้า 3 วัน ถ้ามีงบออกช้ากว่าตัว SQQE ในระยะ 3 วันเเล้วอยู่ที่วันไหน ให้เลือกวันนั้นเป็นวันเปลี่ยนคับ

    #10465
    chaipod
    Participant

    ขอบคุณสำหรับคำแนะนำครับ…ส่วนเหตุผลที่เขียน code แบบนี้เพราะ
    1. โดยหลักแล้วเมื่อ SQ ได้ข้อมูลจากตลาดหลักทรัพย์มาแล้ว  น่าจะบันทึกข้อมูล
    SQQE กับ SQEPS พร้อมๆกัน เพราะเป็นข้อมูลชุดเดียวกันซึ่งได้มาวันเดียวกัน
    ซึ่งจากการสังเกตุ ข้อมูลส่วนใหญ่ก็จะเปลี่ยนในวันเดียวกัน
    ส่วนที่เหลื่อมเวลากันจะมีน้อยมาก
    2. การใช้ Ref เทียบกัน จะเช็คไม่ได้ กรณีที่ EPS เท่ากัน 2 quarter ติดกัน
    3. ถ้าใช้ Ref ไปข้างหน้า เป็นห่วงเรื่อง future leaked ตอนไปทำ backtesting
    และจากที่ทดสอบเบื้องต้นมาก็สามารถใช้งานได้ดี  ส่วนถ้าต้องการปรับแก้ไขใดๆ
    code อันนี้ก็น่าจะช่วยให้ผู้ใช้สามารถนำไปปรับแก้ต่อได้ไม่ยากครับ

     

    #10466
    Amibroker Platform
    Participant

    ไม่เกี่ยวกับ future leaked คับ

    ถ้าเปลี่ยน SQEPS  วันสุดท้ายวันไหนให้ใช้วันนั้นคับ

     

    ยกตัวอย่าง

    SQQE เปลียนวันที่ 14/6/2016

    SQEPS เปลี่ยนวันที่ 16/6/2016

    ให้มองว่า SQQE เปลี่ยนวันที่ 16/6/2016 เเล้วจะตรงกันคับ เพราะถือว่ารู้ช้ากว่าความจริง ไม่ถือว่าเป็น future leaked

    #10467
    chaipod
    Participant

    กรณีที่ผู้ใช้  ต้องการแก้ไขอย่างที่คุณ Ami.P แนะนำ ก็แก้ไขเฉพาส่วนนี้ครับ

    if( SQQE[ i ] == 1  AND  SQQE[ i – 1 ] == 4 )        epsQ1[ i ] = SQEPS[ i+2 ];
    else     epsQ1[ i ] = epsQ1[ i – 1 ];

    if( SQQE[ i ] == 2  AND  SQQE[ i – 1 ] == 1 )         epsQ2[ i ] = SQEPS[ i+2 ] – SQEPS[ i – 1 ] ;
    else     epsQ2[ i ] = epsQ2[ i – 1 ];

    if( SQQE[ i ] == 3  AND  SQQE[ i – 1 ] == 2 )         epsQ3[ i ] = SQEPS[ i+2 ] – SQEPS[ i – 1 ] ;
    else     epsQ3[ i ] = epsQ3[ i – 1 ];

    if( SQQE[ i ] == 4  AND  SQQE[ i – 1 ] == 3 )         epsQ4[ i ] = SQEPS[ i+2 ] – SQEPS[ i – 1 ] ;
    else     epsQ4[ i ] = epsQ4[ i – 1 ];

    ซึ่งอาจแก้เป็น +1 / +2 / +3 ก็ได้  แล้วเลือกแบบที่ให้ผลที่ดีที่สุดครับ…ขอบคุณครัย

    #10468
    Amibroker Platform
    Participant

    เท่าที่ผมจำได้ ทีมงานบอกว่าไม่ส่วนใหญ่ 90% จะช้าไม่เกิน 2 วันคับ ส่วนที่เหลือถ้าช้ากว่านั้นเป็นเพราะบริษัทส่งงบช้าจริงๆคับ

    #10470
    chaipod
    Participant

    จัดไป…..ปรับ CODE ให้ใหม่แล้วครับ เพิ่มจำนวนวันที่ต้องการมองไปข้างหน้าให้ด้วยครับ……

    ทีนี้แล้วแต่คนใช้แล้วนะครับ…เลือกค่าที่ดีที่สุดเองเลยครับ…………ENJOY……………..

     

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Ppppppppppppppppppppppppppppppppppppppppppppp Sssssssssssssssssssssssssssssssssssssssssssssssss //

    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.2.0\SQ Include\SQ – Include Data Declaration.afl”
    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.2.0\SQ Include\SQ – Include Data Restriction.afl”

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Ppppppppppppppppppppppppppppppppppppppppppppp Sssssssssssssssssssssssssssssssssssssssssssssssss //

    forwardDate = Param(“forwardDate”, 0, 0, 5, 1);

    for( i = 0; i < BarCount; i++ )
    {
    if( i > 0 )
    {
    if( SQQE[ i ] == 1  AND  SQQE[ i – 1 ] == 4 )        epsQ1[ i ] = SQEPS[ i + forwardDate ];
    else     epsQ1[ i ] = epsQ1[ i – 1 ];

    if( SQQE[ i ] == 2  AND  SQQE[ i – 1 ] == 1 )         epsQ2[ i ] = SQEPS[ i + forwardDate ] – SQEPS[ i – 1 ] ;
    else     epsQ2[ i ] = epsQ2[ i – 1 ];

    if( SQQE[ i ] == 3  AND  SQQE[ i – 1 ] == 2 )         epsQ3[ i ] = SQEPS[ i + forwardDate ] – SQEPS[ i – 1 ] ;
    else     epsQ3[ i ] = epsQ3[ i – 1 ];

    if( SQQE[ i ] == 4  AND  SQQE[ i – 1 ] == 3 )         epsQ4[ i ] = SQEPS[ i + forwardDate ] – SQEPS[ i – 1 ] ;
    else     epsQ4[ i ] = epsQ4[ i – 1 ];

    if( SQQE[ i ]    == 1 )        epsQ[ i ] = epsQ1[ i ];
    if( SQQE[ i ]    == 2 )        epsQ[ i ] = epsQ2[ i ];
    if( SQQE[ i ]    == 3 )        epsQ[ i ] = epsQ3[ i ];
    if( SQQE[ i ]    == 4 )        epsQ[ i ] = epsQ4[ i ];

    }

    else
    {
    epsQ1[ i ] = epsQ2[ i ] = epsQ3[ i ] = epsQ4[ i ] = epsQ[ i ] = Null;
    }
    }

    eps_ROLL    = epsQ1 + epsQ2 + epsQ3 + epsQ4;
    eps_ACC   = SQEPS;
    eps_ANN        = ValueWhen( SQQE == 4 AND ( epsQ != Ref( epsQ, -1 ) ), SQEPS );
    eps_QoQ         = ValueWhen( epsQ != Ref( epsQ, -1 ), ROC( epsQ, 1, True ) );
    eps_Q1YoY     = ValueWhen( epsQ1 != Ref( epsQ1, -1 ), ROC( epsQ1, 1, True ) );
    eps_Q2YoY     = ValueWhen( epsQ2 != Ref( epsQ2, -1 ), ROC( epsQ2, 1, True ) );
    eps_Q3YoY     = ValueWhen( epsQ3 != Ref( epsQ3, -1 ), ROC( epsQ3, 1, True ) );
    eps_Q4YoY     = ValueWhen( epsQ4 != Ref( epsQ4, -1 ), ROC( epsQ4, 1, True ) );

    for( i = 0; i < BarCount; i++ )        //Year on Year
    {
    if( i > 0 )
    {
    if( eps_Q1YoY[ i ] != eps_Q1YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q1YoY[ i ];
    else
    {
    if( eps_Q2YoY[ i ] != eps_Q2YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q2YoY[ i ];
    else
    {
    if( eps_Q3YoY[ i ] != eps_Q3YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q3YoY[ i ];
    else
    {
    if( eps_Q4YoY[ i ] != eps_Q4YoY[ i – 1 ] ) eps_YoY[ i ] = eps_Q4YoY[ i ];
    else eps_YoY[ i ] = eps_YoY[ i – 1 ];
    }
    }
    }
    }
    else eps_YoY[ i ] = Null;
    }

    _SECTION_BEGIN( “quaterlyEPS” );
    ShowEpsQ                = ParamToggle( “showquaterlyEPS”, “-|Show”, 1 );
    ColorEpsQ                = ParamColor( “colorEpsQuarter”, colorRed );
    StyleEpsQ                = ParamStyle( “styleEpsQuarter”, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_ROLL” );
    ShowEps_ROLL                = ParamToggle( “showEps_ROLL”, “-|Show”, 0 );
    ColorEps_ROLL                = ParamColor( “colorEps_ROLL”, colorViolet );
    StyleEps_ROLL                = ParamStyle( “styleEps_ROLL”, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_ANN” );
    ShowEps_ANN                = ParamToggle( “showEps_ANN”, “-|Show”, 0 );
    ColorEps_ANN                = ParamColor( “colorEps_ANN”, colorGreen );
    StyleEps_ANN                = ParamStyle( “styleEps_ANN    “, styleLine, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_QoQ” );
    ShowEps_QoQ             = ParamToggle( “showEps_QoQ”, “-|Show”, 0 );
    ColorEps_QoQ                = ParamColor( “colorEps_QoQ”, colorBlue );
    StyleEps_QoQ                = ParamStyle( “styleEps_QoQ    “, styleDashed, maskAll );
    _SECTION_END();

    _SECTION_BEGIN( “Eps_YoY” );
    ShowEps_YoY             = ParamToggle( “showEps_YoY”, “-|Show”, 0 );
    ColorEps_YoY                = ParamColor( “colorEps_YoY”, colorCustom12 );
    StyleEps_YoY                = ParamStyle( “styleEps_YoY    “, styleDashed, maskAll );
    _SECTION_END();

    if( ShowEpsQ )                Plot( epsQ, “QuarterlyEPS (Baht)”, ColorEpsQ, StyleEpsQ );
    if( ShowEps_ROLL )            Plot( eps_ROLL, “Eps_ROLL (Baht)”, ColorEps_ROLL, StyleEps_ROLL );
    if( ShowEps_ANN )            Plot( eps_ANN, “Eps_ANN (Baht)”, ColorEps_ANN, StyleEps_ANN );
    if( ShowEps_QoQ )            Plot( eps_QoQ, “Eps_QoQ (%)”, ColorEps_QoQ, StyleEps_QoQ | styleOwnScale);
    if( ShowEps_YoY )            Plot( eps_YoY, “Eps_YoY (%)”, ColorEps_YoY, StyleEps_YoY | styleOwnScale);

    Title = EncodeColor( colorBlue ) +  Name() + ” – ” + Interval( 2 ) + ”  ” + Date() + StrFormat( ”  \\c16||   ” )
    +  “{{VALUES}}”;

    GraphXSpace = 10;

    // Eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Ddddddddddddddddddddddddddddddddddddddddddd //

    #10473
    Amibroker Platform
    Participant

    เยี่ยมคับ

    #10476
    BlueStepz
    Participant

    สวัสดีครับทุกๆคน

    (เข้ามาตกใจเลย เห็นในกระทู้มีโค้ดเต็มไปหมด นึกว่าบอร์ดพัง 55+)

     

    ก่อนอื่นต้องขอบอกก่อนว่าทีมงานรู้สึกดีใจมากๆครับที่เห็นเพื่อนๆช่วยเหลือกัน แบ่งปันสิ่งดีๆให้กันในบอร์ดนี้

    ไม่ว่าจะเป็นเรื่องของความรู้  การช่วยกันเขียนโค้ด ช่วยกันถามตอบตั้งข้อสงสัยต่างๆ

    หรือความรู้สึกที่อยากจะช่วยกันพัฒนาข้อมูลให้เพื่อนๆคนอื่นๆได้เข้าถึงหรือใช้งานได้ง่ายขึ้น

    ประทับใจมากครับ ขอบคุณมากๆครับ…

     

    ขออนุญาติกลับมาช่วยตอบเรื่องข้อมูล EPS นะครับ

    โดยประเด็นหลักๆที่ทางทีมงานอยากให้รายละเอียดมีอยู่ 3 เรื่องครับ

     

    1. เรื่องข้อมูล EPS มีค่าไม่เท่ากันใน Quarter เดียวกัน

    ข้อมูล EPS เป็น Field ที่ใช้ค่าตามที่ได้รับมาจากตลาดหลักทรัพย์โดยตรง ไม่ได้มีการเข้าไปปรับเปลี่ยนหรือแก้ไขใดๆครับ

    รวมถึงทีมงานที่ดูแลทางฝั่ง Database ได้ทำการ Cross Check ข้อมูลโดยละเอียดก็พบว่า

    ข้อมูลที่อยู่ใน SQ Database ถูกต้องและตรงกับข้อมูลที่ได้รับมาจากตลาดครับ

    ดังนั้นปัญหาดังกล่าวอาจจะเกิดจากการจัดส่งงบปรับปรุงของแต่ละบริษัทฯ หรือลักษณะขั้นตอนการเก็บข้อมูลของตลาดมากกว่าครับ

     

    2. เรื่องโค้ด AFL สำหรับการหา QoQ หรือ YoY

    ทีมงานขออธิบายจุดประสงค์ในการเขียนโค้ดก่อนนะครับ

    ในตอนแรกการเขียนโค้ด _ACC, _ROLL, _ANN, QoQ, YoY เป็นส่วนเสริมที่อยู่แผนพัฒนาควบคู่ไปกับฐานข้อมูลในเวอร์ชั่นถัดไป

    แต่ทางทีมงานเห็นตรงกันว่าเพื่อนๆมีความต้องการในเรื่องนี้เข้ามามาก จึงอยากช่วยเพิ่มความสะดวกให้กับเพื่อนๆทุกคน

    ในการเรียกใช้ข้อมูลให้มีประสิทธิภาพมากขึ้น จึงได้สร้างขึ้นมาเพื่อใช้กับฐานข้อมูลในเวอร์ชั่นนี้ก่อนครับ

     

    อย่างไรก็ตามโค้ดส่วนนี้ได้ถูกออกแบบมาเพื่อรองรับข้อมูล SQ4 (FBALANCE) และ SQ5 (PROFCASH) เป็นหลัก

    เนื่องจากเป้าหมายหลักของการเขียนโค้ดในส่วนนี้คือ ต้องการแก้ปัญหาในเรื่องของ ข้อมูลไตรมาส ข้อมูลงบกำไรขาดทุน

    และข้อมูลงบดุลที่มีการเปลี่ยนแปลงไม่พร้อมกัน (จากขั้นตอนการเก็บบักทึกข้อมูลของทางตลาด)

    รวมถึงปัญหาในเรื่องจำนวนวันของการ Delay จะไม่เท่ากันที่ขึ้นอยู่กับข้อมูลของหุ้นแต่ละตัวในแต่ละช่วงเวลานั้นครับ

     

    ตัวอย่างภาพแสดงลักษณะการ Delay ของข้อมูล SQ4 และ SQ5

     

    ซึ่งประเด็นนี้เองที่ทำให้เราใช้ข้อมูล Quarter เป็นจุดอ้างอิงของการเปลี่ยนแปลงของข้อมูลทุกอย่างไม่ได้

    ทางทีมงานจึงได้เขียนโค้ดเพื่อหาวิธีสร้างจุดอ้างอิงใหม่ซึ่งเป็นวิธีแก้ปัญหาในเบื้องต้น

    โดยดูจากข้อมูล Quarter ร่วมกับจุดที่มีการเปลี่ยนแปลงของข้อมูลไปพร้อมๆกันครับ

     

    ดังนั้นถ้าหากนำโค้ดส่วนนี้ไปประยุกต์ใช้กับข้อมูลอื่นก็อาจจะมีปัญหาเกิดขึ้นได้

    เช่น ในเรื่องของข้อมูล EPS ใน Quarter เดียวกันแต่มีค่าไม่เท่ากัน

    ทำให้จุดอ้างอิงใหม่ที่ร่วมกันกับการเปลี่ยนแปลงของข้อมูล EPS

    จึงอาจจะไม่ใช่จุดที่มีการเปลี่ยนแปลงของ Quarter จริงๆอย่างที่เราต้องการ

    และอาจจะทำให้วิธีการคำนวณหาค่า %QoQ มีผลลัพธ์ที่ผิดเพี้ยนไปได้ในระดับหนึ่งครับ

     

    3. แนวทางการแก้ปัญหาเรื่อง QoQ, YoY ใน EPS

    โดยปกติแล้วข้อมูล EPS และข้อมูล Quarter จะเป็นข้อมูลที่ได้รับมาจากตลาดโดยตรงด้วยกันทั้งคู่ ไม่ได้มีการปรับเปลี่ยนแก้ไขแต่อย่างใดครับ

    ดังนั้นจึงไม่มีค่อยพบปัญหาเรื่องของการ Delay ระหว่างข้อมูล EPS กับ Quarter (ถูกตลาดบันทึกและจัดเก็บมาพร้อมกัน)

    ไม่เหมือนกับข้อมูลในกลุ่ม SQ4 และ SQ5 ที่ตลาดต้องใช้เวลาในการจัดเก็บข้อมูล (หลังการจัดส่งงบฯของแต่ละบริษัท)

    ทำให้ข้อมูลที่ได้มีการบันทึกวันเวลาที่ Delay ออกไป และจะไม่ตรงกับข้อมูล Quarter ที่มีการบันทึกวันเวลาไว้แล้วก่อนหน้า

    ซึ่งโดยส่วนใหญ่ข้อมูลในกลุ่ม SQ4 และ SQ5 จะมีการเปลี่ยนแปลงที่ช้ากว่าข้อมูล Quarter ครับ

     

    ดังนั้นทีมงานจึงได้ตรวจสอบข้อมูล EPS (SQEPS) และข้อมูล Quarter (SQQE) เพิ่มเติม

    โดยมีเงื่อนไขในการตรวจสอบดังนี้

    • ใช้ของมูลหุ้นทุกตัวในฐานข้อมูล ยกเว้น หุ้นที่อยู่ในกลุ่ม PF&REITs (ไม่มีข้อมูล EPS)
    • ระยะเวลาในการทดสอบตั้งแต่วันที่ 1975-04-30 (เปิดตลาด) จนถึงวันที่ 2016-06-10
    • พิจารณาเฉพาะช่วงระยะเวลาที่หุ้นมีการเก็บค่า Quarter เท่านั้น ได้แก่ Quarter 1, 2, 3 และ 4

     

     

    ผลการตรวจสอบพบว่าข้อมูล EPS ที่มีค่าการเปลี่ยนแปลงพร้อมกันกับข้อมูล Quarter มีจำนวนทั้งสิ้น 1,974,495 ข้อมูล

    จากข้อมูลทั้งหมดจำนวน 1,978,891 ข้อมูล หรือคิดเป็น 99.7779%

    ซึ่งเรียกได้ว่าแทบจะเหมือนกันเลยทีเดียวครับ 😀

    จากผลการตรวจสอบข้างต้นเราจึงสามารถสรุปได้ว่า… ข้อมูล EPS กับข้อมูล Quarter มีการเปลี่ยนแปลงพร้อมกัน

    ดังนั้นเราจึงสามารถใช้ข้อมูล Quarter เป็นจุดอ้างอิงในการเปลี่ยนแปลงค่าในแต่ละไตรมาสของข้อมูล EPS ได้นั่นเองครับ

     

    หลังจากนั้นเราก็นำข้อสรุปดังกล่าวมาเขียนให้เป็นโค้ด AFL จะได้หน้าตาออกมาประมาณนี้ครับ

    (ทีมงานขออนุญาติหยิบโค้ดที่คุณ chaipod ได้แบ่งปันมาเขียนพัฒนาในส่วนของตัวแปรเพิ่มเติมให้สมบูณ์ยิ่งขึ้นนะครับ ^^)

    สุดท้ายแล้วทีมงานขอฝากประเด็นเรื่องข้อระวังเกี่ยวกับการใช้ข้อมูล QoQ, YoY นิดหนึ่งครับ

    เนื่องจากสูตรข้างในข้อมูล QoQ, YoY ก็คือคำสั่ง Rate of Change (ROC) ที่กำหนดให้ตัวหารเป็นค่าสัมบูรณ์ (Absolute)

    ซึ่งจะไม่มีปัญหาในกรณีที่ตัวเลขที่ใช้ในการคำนวณเป็นค่าบวกทั้งคู่ หรือเป็นค่าติดลบทั้งคู่ เช่น

    Q1 = 10 และ Q2 = 20   ดังนั้น %QoQ = (Q2 – Q1)/|Q1|*100 = (20-10)/10*100 = 100%   (ดีขึ้น)
    Q1 = -10 และ Q2 = -20 ดังนั้น %QoQ = (Q2 – Q1)/|Q1|*100 = (-20+10)/10*100 = -100%   (แย่ลง)

    แต่ในกรณีที่ตัวเลขค่าใดค่าหนึ่งเป็นค่าบวก และอีกค่าหนึ่งเป็นค่าลบ อาจจะทำให้เกิดการกระโดดของผลลัพธ์ได้ เช่น

    Q1 = -10 และ Q2 = 20   ดังนั้น %QoQ = (Q2 – Q1)/|Q1|*100 = (20+10)/10*100 = 300%   (ดีขึ้นมากๆ)
    Q1 = 10 และ Q2 = -20 ดังนั้น %QoQ = (Q2 – Q1)/|Q1|*100 = (-20-10)/10*100 = -300%   (แย่ลงมากๆ)

    อย่างไรก็ตามประเด็นดังกล่าวก็ขึ้นอยู่กับเงื่อนไขหรือวิธีการนำผลลัพธ์ไปใช้ของแต่ละคนนะครับ

    เพียงแต่ว่าอยากให้เพื่อนๆทุกคนรู้ว่ามันมีเรื่องนี้ให้เราต้องเก็บไปคิดเป็นการบ้านเพิ่มเติมด้วยหรือเปล่านะ?

    หากเราต้องการนำเงื่อนไขต่างๆไปทดสอบหรือประยุกต์ใช้งานจริงๆครับ

     

    สุดท้ายและท้ายสุดทางทีมงานได้แนบไฟล์ AFL ที่ใช้ทั้งหมดในโพสต์นี้แปะไว้ที่ลิงค์ด้านล่างนะครับ

    หากเพื่อนๆคนไหนโหลดไปลองเล่นแล้วมีข้อสงสัยก็สามารถโพสต์ถามได้เลยนะครับ

    เชื่อว่าเพื่อนๆและทีมงานทุกคนในบอร์ดพร้อมจะช่วยเหลือและแบ่งปันแน่นอนครับ

    Click: >>> Link download ALL AFL <<<

     

    ขอบคุณคุณ chaipod คุณ Amibroker Platform อีกครั้งนะครับที่ช่วยแบ่งปัน

    ขอบคุณทุกคนมากครับ

     

    ทีมงาน SiamQuant

    #10501
    Disinfect
    Participant

    นำไปใช้งานในรูปกราฟต่อยังไงครับ จากโค้ดของ SQ
    และจะมีการเพิ่มเติม code ชุดนี้ใน include เลยไหมครับ

    #10502
    Amibroker Platform
    Participant

    เอาตัวแปรที่ประกาศไปใช้ได้เลยคับ

    code ชุดนี้ Run ผ่าน include เลยคับ

    #10532
    Disinfect
    Participant

    ขอถามเพิ่มเติมนิดนะครับ สูตร EPS ดั้งเดิมมาแบบ Accumulated ถูกไหมครับ ทีนี้สูตรในกระทู้ Codeที่ทีมงานโพสต์ให้ สามารถดูเป็น QoQ YoY แล้วสามารถดูเป็น Quarterly ได้ไหมครับ ถ้าได้ต้องใช้ตัวแปรอะไรครับ เพราะ SQEPS มันเป็น Accumulated

    #10539
    Disinfect
    Participant

    ทำได้แล้วครับ ไม่เป็นไรแล้วครับ ^^

    #10967

    http://www.siamquant.com/wp-content/uploads/2016/06/SQEPS.zip

    download ไม่ได้แล้วครับ

    #10968
    Amibroker Platform
    Participant

    /*==================================================

    #SQEPS

    ==================================================*/

     

    #include_once “C:\SiamQuant\SQ Library\SQ AFL V.1.0.2.0\SQ Include\SQ – Include Data Declaration.afl”

     

    for( i = 1; i < 5; i++ )

    {

    VarSet( “SQEPS_ACCQ” + i, ValueWhen( SQQE == i, SQEPS ) );

    }

     

    SQEPS_Q1 = SQEPS_ACCQ1;

    SQEPS_Q2 = SQEPS_ACCQ2 – SQEPS_ACCQ1;

    SQEPS_Q3 = SQEPS_ACCQ3 – SQEPS_ACCQ2;

    SQEPS_Q4 = SQEPS_ACCQ4 – SQEPS_ACCQ3;

     

    SQEPS_Q1YoY = ValueWhen( SQEPS_Q1 != Ref( SQEPS_Q1, -1 ), ROC( SQEPS_Q1, 1, True ) ); //Quarter 1 Year on Year

    SQEPS_Q2YoY = ValueWhen( SQEPS_Q2 != Ref( SQEPS_Q2, -1 ), ROC( SQEPS_Q2, 1, True ) ); //Quarter 2 Year on Year

    SQEPS_Q3YoY = ValueWhen( SQEPS_Q3 != Ref( SQEPS_Q3, -1 ), ROC( SQEPS_Q3, 1, True ) ); //Quarter 3 Year on Year

    SQEPS_Q4YoY = ValueWhen( SQEPS_Q4 != Ref( SQEPS_Q4, -1 ), ROC( SQEPS_Q4, 1, True ) ); //Quarter 4 Year on Year

     

    EPS = IIf( SQQE == 1, SQEPS_Q1, //EPS Quarterly

    IIf( SQQE == 2, SQEPS_Q2,

    IIf( SQQE == 3, SQEPS_Q3,

    IIf( SQQE == 4, SQEPS_Q4, Null

    ))));

     

    SQEPS_QoQ = ValueWhen( EPS != Ref( EPS, -1 ), ROC( EPS, 1, True ) );

    SQEPS_YoY = IIf( SQQE == 1, SQEPS_Q1YoY,

    IIf( SQQE == 2, SQEPS_Q2YoY,

    IIf( SQQE == 3, SQEPS_Q3YoY,

    IIf( SQQE == 4, SQEPS_Q4YoY, Null

    ))));

     

    /*==================================================

    END

    ==================================================*/

     

    Filter = 1;

     

    AddColumn(BarIndex(),”Count”,1.0);

    AddColumn(SQQE,”SQQE”,1.0);

    AddColumn(EPS,”EPS”,1.2);

    AddColumn(SQEPS,”ACC_EPS”,1.2);

    AddColumn(SQEPS_QoQ,”EPS_QoQ”,1.2);

    AddColumn(SQEPS_YoY,”EPS_YoY”,1.2);

     

    เเต่ถ้าก็อป Code จากในนี้ให้ระวัง “” กับพวก + – * / ผิด

    ก็ให้ลบเเล้วเขียนใหม่เอาคับ

    #10991

    ขอบคุณครับ

    #11548
    kittapas
    Participant

    รบกวนสอบถามหน่อยครับ พอดีลอง copy สูตรไปใช้แล้ว EPS_YoY มันไม่ตรงอะคับ อย่างเช่น EPS_YoY  (Q3) ของ LH = 1,600 จริงๆมันควรจะเป็น (0.17-0.13)*100/0.13 = 30.77% ไม่แน่ใจว่าผิดตรงไหนอะคับ

    #11550
    Amibroker Platform
    Participant

    จริง อย่างที่คุณ kittapas  บอกคับ มันต้องเป็น 30.77 ผมกำลังดูอยู่คับผิดที่อะไรคับ

    #11551
    Amibroker Platform
    Participant

    ผมเช็คดูเเล้วตัวอื่นไม่เป็น เป็นตัว LH เเล้วไตรมาสล่าสุดด้วยคับ

    เเต่ดูจาก Data ก็ปกติ ค่าที่ Plot ออกมาก็ถูกต้องคับ กำลังสงสัยอยู่ว่าเป็นที่อะไรกันเเน่คับ

    #12412
    SiamQuant Team
    Keymaster

    Update : ขณะนี้เราได้สร้างฟังค์ชั่นตัวแปรในงบการเงินหลายๆตัวใน SiamQuant V.2.0 ให้สามารถเรียกใช้ค่า QoQ และ YoY ได้โดยสะดวกและง่ายขึ้นแล้วนะครับ โดยการเพิ่ม _QoQ หรือ YoY หลังค่าตัวแปรนั้นๆ เช่น SQEPS_QoQ() หรือ SQEPS_YoY() ยังไงลองใช้กันดูนะครับผม 😀

    #13198
    Therdpong
    Participant

    สอบถามการใช้  SQEPS_QoQ() และ SQEPS_YoY() หน่อยครับว่าผมใช้ถูกไหมครับ

    และค่าที่ Explore มาถูกต้องไหมครับ

    ขอบคุณครับ

    #13200
    Chayanant.k
    Participant

    เรียนคุณ Therdpong ทางผมได้ทำการสอบตรวจ Code และ ค่าต่างๆของหุ้นแต่ละตัวที่ทำการ Explore ออกมาแล้วนะครับ พบว่าข้อมูลมีความถูกต้องสมบูรณ์แล้วครับผม คุณ Therdpong เข้าใจได้ถูกต้องแล้วครับผม^^

    #13202
    Therdpong
    Participant

    สอบถามเพิ่มครับ ยกตัวอย่าง หุ้น ARROW

    คำนวณยังงี้ไหมครับ EPS_YoY  =( EPS59 – EPS58)*100/EPS58

    EPS_YoY =(1.04-1.03)*100/1.03  = 0.97 %

    ผมเข้าใจถูกไหมครับ

    มันไม่ตรงกับ Exploe

     

    ขอบคุณครับ

    #13203
    Chayanant.k
    Participant

    เรียนคุณ Therdpong ครับ

    ค่า EPS_YoY ในที่นี้เกิดจากการเปลี่ยนแปลงของ EPS ใน Q นั้นๆ เทียบกับ Q เดียวกันในปีก่อนหน้านะครับ โดยลักษณะการ Explore ถ้าเราอยากคำนวณเพื่อเช็คค่าออกมาจริงๆจะต้อวปรับเพิ่มเติมนิดหน่อยครับ เนื่องจากค่าที่แสดงอยู่ใน Chart จะเป็นเลขทศนิยม 2 ตำแหน่ง ดังรูปด้านล่างครับ

    ซึ่งถ้าหากเราคำนวณตามสูตรเลยคือ นำ ((0.26 -0.24)/0.24)*100 ค่าที่ได้จะมีค่าเท่ากับ 8.33% โดยค่าที่ได้จะไม่ตรงกับใน Chart ถูกไหมครับ (ตัวเลขที่แสดงใน Chart แสดงไว้ 5.47) ทั้งนี้เนื่องจากข้อมูลที่ทางตลาดส่งมาให้เรานั้นมีทศนิยมมากกว่า 2 ตำแหน่งครับ เวลาเราคำนวณค่าออกมาจึงต้องใช้จำนวนเลขทศนิยมตามที่ตลาดให้มาเพื่อความถูกต้องที่สุดครับผม (แต่ตอนที่เราออกแบบ Chart เราแสดงแค่ 2 ตำแหน่งครับ เพราะไม่งั้นเราคิดว่าเดี๋ยวมันจะเยอะเกินไป ทำให้ลายตาครับ >.<) เพราะอย่างนั้นหากเราอยากได้รายละเอียดของเลขทศนิยมที่มากขึ้น เราต้อง Explore ค่าของ EPS ออกมาดังรูปด้านล่างดังต่อไปนี้ครับ

    ในส่วนนี้หากสงสัยเกี่ยวกับ ฟังก์ชัน ValueWhen สามารถเข้าไปดูเพิ่มเติมได้ที่ลิงค์นี้นะครับ : https://www.amibroker.com/guide/afl/valuewhen.html

    ลำดับต่อมาให้ทำการ Explore ค่าออกมาครับ

    จะสังเกตว่าที่นี้หากเราคำนวณโดยนำ ((0.25625 – 0.24295)/0.24295)*100 = 5.4743774% ซึ่งใกล้เคียงกับค่า 5.47439 (ตรงนี้คลาดเคลื่อนเนื่องจากเราใช้เลขทศนิยมเพีงแค่ 5 ตำแหน่งนะครับ)

    ทั้งนี้หากมีคำถามใดๆสงสัยเพิ่มเติม ถามมาได้เลยนะครับ ทางทีมงาน SiamQuant ยินดีตอบคำถามครับผม^^

    #13206
    Therdpong
    Participant

    ขอบคุณมากเลยครับ

    #13208
    Chayanant.k
    Participant

    ยินดีมากครับผม คุณ Therdpong

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