fbpx
ระบบการลงทุน

ผลทดสอบระบบการลงทุน Magic Formula ของ Joel Greenblatt

SiamQuant Team
ติดตามพวกเรา

หลังจากที่เราได้ สรุปผลงานวิจัยเกี่ยวกับประสิทธิภาพของระบบการลงทุน Magic Formula ทั่วโลกกันไปในโพสท์ที่แล้วนั้น ในวันนี้ก็ถึงเวลาที่เราจะมาเปิดเผยถึงผลลัพธ์ของมันจากการ Backtested เพื่อทดสอบถึงประสิทธิภาพในตลาดหุ้นไทยกันเสียที และผลที่ออกมาก็จะทำให้นักลงทุนสาย VI ถึงกับต้อง … !!

กฎการลงทุนง่ายๆ 4 ขั้นตอน จะสามารถเอาชนะตลาดหุ้นไทยได้หรือไม่?

ก่อนที่เราจะแสดงให้เห็นถึงผลทดสอบระบบ Magic Formula ย้อนหลังให้เห็นกันนั้น เราอยากขอทบทวนให้ทุกคนไม่ลืมกันเสียก่อนว่ามันเป็นเพียงแค่กฏ 4 ขั้นตอนง่ายๆเท่านั้น ซึ่งก็คือ

  1. Non-Financial Industry หรือการตัดหุ้นในกลุ่มอุตสาหรกรรมการเงินออกไป
  2. ROC & EY Ranking เรียงลำดับหุ้นที่มี Return on Capital และ Earning Yield
  3. Magic Formula Score สร้างคะแนนด้วยการนำลำดับของ ROC + EY
  4. Rotation (Yearly) การปรับพอร์ทหุ้นทุกสิ้นปีด้วยการเลือกหุ้นที่มีค่า Magic Formula Score น้อยที่สุด (ดีที่สุด) ออกมาเป็นจำนวน 30 ตัว

ซึ่งเมื่อทำการเขียนองค์ประกอบต่างๆของระบบออกมาตาม SiamQuant Strategy Canvas เราก็จะเห็นได้ว่ามันเป็นระบบการลงทุนที่แสนเรียบง่าย จนยากที่จะเชื่อว่ามันจะสามารถเอาชนะตลาดได้จริงๆหรือ?

SQ Magic Formula Canvas

ภาพที่ 1 : SiamQuant Strategy Canvas แสดงให้เห็นถึงองค์ประกอบของระบบการลงทุน Magic Formula ของ Joel Greenblatt

ซึ่งถึงแม้ว่า Magic Formula จะดูเรียบง่ายจนมันไม่น่าที่จะมีประสิทธิภาพสักเท่าไหร่นัก อย่างไรก็ตามเมื่อเราได้ทำการค้นคว้าถึงบทความและงานวิจัยต่างๆที่ได้เขียนเกี่ยวกับมันเอาไว้ มันก็ได้แสดงให้เห็นว่าระบบ Magic Formula สามารถที่จะให้ผลตอบแทนที่น่าทึ่ง โดยสามารถที่จะเอาชนะตลาดในระยะยาวได้ทั้งในตลาดหุ้นแถบอเมริกา, ยุโรป และเอเชียเลยทีเดียว และนั่นจึงทำให้เราไม่อาจที่จะละสายตาจากมันไปได้ จนทำให้เราต้องนำมันมาลองทดสอบกันดู ซึ่งผลลัพทธ์ที่ได้ก็คือสิ่งที่คุณกำลังจะเห็นในไม่ช้านี้ครับ

ถึงเวลาพิสูจน์ประสิทธิภาพของระบบ Magic Formula ในตลาดหุ้นไทยกันโดยละเอียดเสียที!

สำหรับในการทดสอบผลลัพธ์ของมันในครั้งนี้นั้น ทางทีมงาน SiamQuant ได้กำหนดเงื่อนไขให้อยู่ในรูปแบบของการทดสอบในเชิงทฤษฎีเท่านั้น เพื่อให้ผลการทดสอบที่ออกมา เป็นผลลัพธ์ที่เกิดขึ้นจากแก่นของ “ตัวแปรภายใน” ระบบจริงๆ โดยไม่มีข้อจำกัดในเรื่องของ “ตัวแปรภายนอก” อื่นเข้ามาเกี่ยวข้อง เช่น

  • ค่าคอมมิสชั่นในการซื้อขาย (Commission)
  • การกำหนดข้อจำกัดของจำนวนหุ้นที่ซื้อขายได้จริงในตลาด (Limit trade size)
  • การจำลองค่าความคลาดเคลื่อนของการจับคู่การซื้อขาย (Slippage)
  • การจำกัดจำนวนหุ้นที่ถืออยู่ในพอร์ตโฟลิโอ (Max position)

ทั้งนี้เพื่อให้ง่ายต่อการเปรียบเทียบกับระบบหรือกลยุทธ์การลงทุนอื่นๆที่กำลังจะถูกเผยแพร่ออกมาเรื่อยๆต่อจากนี้ เนื่องจากทุกระบบตั้งอยู่บนสมมติฐานของการทดสอบในเชิงทฤษฎีเหมือนๆกัน (เพื่อนสมาชิกผู้สนับสนุนสามารถที่จะนำสูตรตัวอย่างด้านล่างไปปรับแก้และกำหนดค่า Parameter ต่างๆในโปรแกรม Amibroker ได้เองครับ) อย่างไรก็ตาม เราได้ใช้ฐานข้อมูลคุณภาพสูงเข้ามาเป็นส่วนชดเชย โดยที่ข้อมูล SiamQuant Hybrid Database ที่เรานำมาใช้ทดสอบนั้นจะมีคุณลักษณะเด่นดังนี้ เช่น

  • เป็นข้อมูลราคาหุ้นแบบ Fully Dividend Adjusted ที่ถูกปรับราคาหลังแตกพาร์และปันผลมาแล้ว จึงไม่เกิดเหตุการณ์ที่ราคาหุ้นจะกระโดด จนทำให้ผลการทดสอบเปลี่ยนแปลงอย่างมีนัยยะสำคัญ
  • เป็นข้อมูลที่รวบรวมเอาหุ้น De-Listed ที่ได้ถูกถอดออกจากตลาดหุ้นไปแล้วเอาไว้ด้วย จึงไม่ทำให้ผลที่ออกมาดูดีเกินความเป็นจริงไป เพราะมีแต่หุ้นที่อยู่รอดได้จนปัจจุบัน
  • เป็นข้อมูลที่พื้นฐานซึ่งมีการ Time Stamped ระบุเวลา ณ ช่วงเวลาที่งบการเงินถูกประกาศออกมาจริง (คลาดเคลื่อนไม่เกิน 1 สัปดาห์) ซึ่งไม่เหมือนกับข้อมูลส่วนใหญ่ที่มักอ้างอิงช่วงเวลาด้วยวันประกาศปิดงบการเงิน ซึ่งทำให้ผลการทดสอบดูดีเกินจริง เนื่องจากเป็นการแอบดูข้อมูลล่วงหน้าก่อนวันประกาศจริง (Look Ahead Bias วันปิดงบมาก่อนวันประกาศ)

AFL Amibroker Open Source Trading System สูตรตัวอย่างที่ใช้ในการทดสอบระบบ Magic Formula

สำหรับเนื้อหาด้านล่างที่ถูกซ่อนอยู่ใต้ปุ่ม Spoiler คือคำอธิบายสูตรแบบภาษาเทียม (Psuedo Code) ซึ่งจะช่วยให้คุณทำความเข้าใจสูตรคอมพิวเตอร์ที่เขียนง่ายยิ่งขึ้น และ AFL Amibroker Magic Formula Code Example ที่เราได้นำมาทำการทดสอบกับโปรแกรม Amibroker ซึ่งก่อให้เกิดผลลัพธ์ตาม Interactive Bactested Performance ด้านล่าง โดยเพื่อนๆสามารถศึกษาและทดลองระบุช่วงเวลาเพื่อทำความเข้าใจกับรายละเอียดของผลการทดสอบเพิ่มเติมได้ตามอัธยาศรัยครับ

หมายเหตุ : Feature AFL Code Example นี้ต่อไปจะมีให้อ่านเฉพาะผู้ที่เป็น สมาชิกแบบสนับสนุน แต่ในช่วง Pre-Launch เราจะเปิดให้ศึกษาเป็นตัวอย่างของสิ่งที่สมาชิกผู้สนับสนุนจะได้รับ ซึ่งสามารถนำโค้ดเหล่านี้ไปใช้ศึกษาหรือดัดแปลงในโปรแกรม Amibroker เพื่อเริ่มต้นการลงทุนอย่างเป็นระบบของคุณได้เลย … แต่สำหรับท่านที่ไม่ถนัดเรื่องของการ Programming สามารถเลื่อนลงไปดูผลด้านล่างได้เลยครับ 😀

ภาพ : Simplify Flow Chart แสดงกระบวนการคัดเลือกหุ้นแต่ละตัวเข้ามาทำการลงทุน

  1. เรียกไฟล์ Include ซึ่งประกอบไปด้วย
  • Rotational Backtest Setting
  • Data Declaration
  • Data Restriction
  1. กำหนดวิธีการสั่งคำสั่ง (Order execution) และค่าความคลาดเคลื่อน (Slippage)
  • Buy Price = Open
  • Sell Price = Open
  • Trade Delay = 0
  • Slippage = 0
  1. กำหนดขนาดการลงทุน
  • Position Size = 3% ของ Total Equity
  1. กำหนดลำดับการลงทุน
  • เก็บค่า การ Rotation ทุกวันสิ้นเดือน ไว้ในตัวแปร LastDayofMonth
  • เก็บค่า การ Rotation ทุกวันสิ้นไตรมาส ไว้ในตัวแปร LastDayofQuarter
  • เก็บค่า การ Rotation ทุกวันสิ้นปี ไว้ในตัวแปร LastDayofYear

 

  • เก็บค่า Index ของ Watch List ชื่อ “ALLSTOCK” ในตัวแปร wlnum
  • เก็บค่า รายชื่อของหุ้นทุกตัว ของ Watch List ตามค่า Index ในตัวแปร wlnum

 

ก่อนการคำนวณ ( หุ้นตัวแรก )

{

  • ให้ล้างค่าตัวแปร ROCRScore ของหุ้นทุกตัว
  • ให้ล้างค่าตัวแปร EYScore ของหุ้นทุกตัว

 

FOR ( หุ้นตัวแรก ) to ( หุ้นตัวสุดท้าย )

{

  • MKC = Market Capitalization ของหุ้น
  • TA = Total Asset ของหุ้น
  • TCL = Total Current Liabilities ของหุ้น
  • TL = Total Liabilities ของหุ้น
  • TC = Total Cash ของหุ้น

 

  • ROCR = EBIT / ( TA – TCL )
  • EY = EBIT / ( MKC + TL – TC )

 

  • ให้เก็บค่า ROCR ของหุ้น ในตัวแปร ROCRScore
  • ให้เก็บค่า EY ของหุ้น ในตัวแปร EYScore

}

 

  • เรียงอันดับหุ้นทุกตัวจากน้อยไปหามากตามค่า ROCR

และเก็บค่าในตัวแปร RankROCRScore

  • เรียงอันดับหุ้นทุกตัวจากน้อยไปหามากตามค่า EY

และเก็บค่าในตัวแปร RankEYScore

}

 

  • เก็บค่าอันดับ จากการเรียงอันดับหุ้นแต่ละตัวจากน้อยไปหามาก ตามค่า ROCR

ไว้ในตัวแปร RankROCR

  • เก็บค่าอันดับ จากการเรียงอันดับหุ้นแต่ละตัวจากน้อยไปหามาก ตามค่า EY

ไว้ในตัวแปร RankEY

 

  • MFScore = RankROCR + RankEY

 

  • IF ( หุ้นผ่านเกณฑ์ DataRestriction และไม่อยู่ใน Financial Industry) THEN

Score = 1 / MFScore

ELSE

Score = 0

 

  • IF ( LastDayofYear ) THEN

Position Score = Score

ELSE

Position Score = No Rotation

/*==================================================
AFL – SQ Magic Formula
==================================================*/

/*
เนื้อหาที่ปรากฏในเอกสารจัดทำขึ้นโดยบริษัท SiamQuant เพื่อวัตถุประสงค์ในการศึกษาเท่านั้น
บริษัท SiamQuant มิได้ให้คำแนะนำหรือให้การรับรองใดๆเกี่ยวกับเนื้อหาที่ปรากฏในเอกสาร
และไม่มีส่วนเกี่ยวข้องที่ต้องรับผิดชอบต่อผู้ใช้ในความเสียหายที่เกิดขึ้นจากการตัดสินใจ
หรือการกระทำใดๆ อันเกิดจากความเชื่อถือในเนื้อหาดังกล่าวของผู้ใช้ไม่ว่าทั้งหมดหรือบางส่วน
หรือในความเสียหายใดๆทั้งทางตรงและทางอ้อม
*/

/*==================================================
#Include
==================================================*/

#include_once
#include_once
#include_once

/*==================================================
Order Execution & Slippage
==================================================*/

//Trade Delays
Buydl = 0;
Selldl = 0;
Shortdl = 0;
Coverdl = 0;
SetTradeDelays( Buydl, Selldl, Shortdl, Coverdl );

//Trade Range Proportional Slippage
EntrySlip = 0.00;
ExitSlip = 0.00;
BuyPrice = O + ( ( H – O ) * EntrySlip );
SellPrice = O + ( ( L – O ) * ExitSlip );

/*==================================================
Position Size
==================================================*/

PctSize = 3;
SetPositionSize( PctSize, spsPercentOfEquity );

/*==================================================
Position Score
==================================================*/

/* Code Concept
1. คำนวณหาค่า Return on Capital Revised ของหุ้นแต่ละตัวใน Watchlist และเก็บค่าไว้ในตัวแปร ROCR
2. คำนวณหาค่า Earning Yield ของหุ้นแต่ละตัวใน Watchlist และเก็บค่าไว้ในตัวแปร EY
3. นำหุ้นแต่ละหุ้นมาเรียงอันดับ (Ranking) ตามค่า Return on Capital Revised จากมากไปหาน้อย และเก็บค่าอันดับของหุ้นแต่ละตัวไว้ในตัวแปร RankROCR
4. นำหุ้นแต่ละหุ้นมาเรียงอันดับ (Ranking) ตามค่า Earning Yield จากมากไปหาน้อย และเก็บค่าอันดับของหุ้นแต่ละตัวไว้ในตัวแปร RankEY
5. สร้าง Magic Formula Score โดยนำค่าอันดับของหุ้นแต่ละตัวจากตัวแปร RankROCR และ RankEY มารวมกัน และเก็บไว้ในตัวแปร MFScore
6. เรียงอันดับหุ้นตาม MFScore จากน้อยไปหามาก
*/

LastDayofMonth = Day() > Ref( Day(), 1 );
LastDayofQuarter = Month() != Ref( Month(), 1 ) AND ( Month() == 3 OR Month() == 6 OR Month() == 9 OR Month() == 12 );
LastDayofYear = DayOfYear() > Ref( DayOfYear(), 1 );

wlnum = CategoryFind( “ALLSTOCK”, categoryWatchlist ); //Find watchlist number
symlist = CategoryGetSymbols( categoryWatchlist, wlnum );

if( Status(“stocknum”) == 0 )
{
//Delete static variables
StaticVarRemove( “ROCRScore*” );
StaticVarRemove( “EYScore*” );

for( i = 0; ( sym = StrExtract( symlist, i ) ) != “”; i++ )
{
MKC = Foreign( sym + “-SQ1”, “V” );
TA = Foreign( sym + “-SQ4”, “O” );
TCL = Foreign( sym + “-SQ4”, “V” );
TL = Foreign( sym + “-SQ4”, “H” );
TC = Foreign( sym + “-SQ4”, “L” );
EBIT = Foreign( sym + “-SQ5”, “H” );

ROCR = Nz( EBIT / ( TA – TCL ) ); //Return on Capital Revised
EY = Nz( EBIT / ( MKC + TL – TC ) ); //Earning Yield

StaticVarSet( “ROCRScore” + sym, ROCR );
StaticVarSet( “EYScore” + sym, EY );
}

//Perform ranking (Normal mode)
StaticVarGenerateRanks( “Rank”, “ROCRScore”, 0, 1224 );
StaticVarGenerateRanks( “Rank”, “EYScore”, 0, 1224 );
}

RankROCR = StaticVarGet( “RankROCRScore” + Name() );
RankEY = StaticVarGet( “RankEYScore” + Name() );
MFScore = RankROCR + RankEY;

Score = IIf( DataRestriction AND SQIndus != 3, ( 1 / MFScore ), 0 ); //Prefer Low MFScore
PositionScore = IIf( LastDayofYear, Score, scoreNoRotate );

/*==================================================
END
==================================================*/

ภาพรวมของผลการทดสอบระบบ Magic Formula ในประเทศไทย

ในแง่ของผลตอบแทนระบบ Magic Formula (MF) ในตลาดหุ้นไทยตั้งแต่ปี ค.ศ. 2006-2015 นั้น ระบบ MF สามารถสร้างพอร์ตโฟลิโอให้เติบโตได้ถึง 4.92 เท่า หรือคิดเป็นผลตอบแทนทบต้นต่อปี (CAGR) ที่ 17.87% เลยทีเดียว ในขณะที่ดัชนี SET Index สร้างพอร์ตโฟลิโอให้เติบโตได้เพียง 1.80 เท่า (Benchmark) หรือคิดเป็นค่า CAR เท่ากับ 6.28% เท่านั้น ซึ่งพูดได้ว่าผลตอบแทนของระบบ MF สามารถเอาชนะตลาดได้อย่างขาดลอยในช่วง 10 ปีที่ผ่านมา

สำหรับในแง่ของความเสี่ยงนั้น ระบบ MF ให้ค่า Maximum Drawdown (MDD) หรือการลดลงของมูลค่าพอร์ทโฟลิโอที่มากที่สุดขณะที่ทำการลงทุนอยู่จะเท่ากับ -52.52% ซึ่งค่อนข้างสูงและใกล้เคียงกับ MDD ของตลาดที่ -58.02% รวมถึงระยะเวลาในช่วงที่เกิด Drawdown (Longest DD) ของ MF ยาวนานที่สุด 31.95 เดือน ซึ่งไม่ต่างจาก Longest DD ของตลาดที่กินระยะเวลาประมาณ 34.5 เดือนมากนัก

อย่างไรก็ตามในช่วง 10 ปีของการทดสอบนั้น สิ่งที่น่าสนใจอีกอย่างคือระบบ MF ให้ผลการเทรดเพียง 43 ครั้งเท่านั้น ซึ่งนั่นหมายความว่ามันไม่เกิดการเปลี่ยนตัวหุ้นในแต่ละรอบปีสักเท่าไหร่ โดยมี ผลการเทรดขาดทุนติดต่อกันถึง 8 ครั้ง นอกจากนี้แล้วระบบยังมีความแม่นยำประมาณ 67.44% และมีค่าผลกำไร (ขาดทุน)โดยเฉลี่ยสูงถึง +277.44% ต่อครั้งเลยทีเดียว จึงส่งผลให้ระบบ MF มีค่า Sharpe Ratio ซึ่งเป็นตัวชี้วัดเรื่องของผลตอบแทนต่อความผันผวนเท่ากับ 0.89 ซึ่งสูงกว่าตลาดที่มีค่าเพียง 0.30 อย่างเห็นได้ชัด!

บทสรุปผลการทดสอบระบบ Magic Formula ในตลาดหุ้นไทย

แม้ว่าการทดสอบระบบ MF ในตลาดหุ้นไทยจะให้ผลลัพธ์ออกมาชนะตลาดอย่างชัดเจน ทั้งในแง่ของผลการเติบโตและผลตอบแทนต่อความเสี่ยง อย่างไรก็ตาม หากเราวิเคราะห์เจาะลึกถึงลักษณะการเติบโตของพอร์ตโฟลิโอ (Equity Curve) แล้วจะพบว่าระบบ MF มีลักษณะการเติบโตที่สอดคล้องไปในทางเดียวกับดัชนี SET Index หรือตลาดหุ้นไทยเป็นอย่างมาก (ขึ้นลงจังหวะเดียวกัน)

โดยเราสามารถวัดออกมาเป็นค่าสหสัมพันธ์ (Correalation) ที่สูงถึง 0.77 เลยทีเดียว ซึ่งเป็นผลมาจากการที่ระบบ MF มีจังหวะในการหมุนลงทุนคงที่ในทุกสิ้นปี (Yearly Rotation) ทำให้ระบบต้องแบกรับผลของ Drawdown ที่สูงในช่วงที่ตลาดเป็นขาลงหนักๆ เช่น ในปี 2008 ที่เกิดวิกฤตการเงิน ระบบ MF ให้ผลตอบแทน -38.42% และมี Drawdown ในปีนั้นมากถึง -58.02% ซึ่งมากที่สุดตลอดระยะเวลาการทดสอบ 10 ปี ดังนั้น สำหรับนักลงทุนที่แบกรับความเสี่ยงได้น้อยเราอาจจะต้องพัฒนาระบบในจุดอื่นเพิ่มเติม เพื่อควบคุมค่า Drawdown ของระบบไม่ให้สูงจนเกินไป เช่น ไอเดียในการปรับจังหวะการหมุนลงทุนของระบบให้เร็วขึ้นจากเดิมทุกสิ้นปี สามารถเปลี่ยนเป็น ทุกสิ้นเดือนหรือทุกไตรมาส เพื่อลดระยะเวลาในการถือครองหุ้น (Holding Period) และศึกษาผลลัพธ์ที่เกิดขึ้นเพื่อสร้างแนวคิดในการต่อยอด เป็นต้น อย่างไรก็ตาม สิ่งที่เป็นจุดเด่นในทางกลับกันก็คือระบบ MF มี Average Holding Period หรือช่วงเวลาในการถือครองโดยเฉลี่ยอยู่ที่ราว 59.31 เดือนหรือ 4.92 ปีเลนทีเดียว มันจึงเหมาะอย่างยิ่งสำหรับบรรดานักลงทุนที่ชื่นชอบการถือครองหุ้นยาวนานหลายปี

เป็นอย่างไรกันบ้างครับ กับบทสรุปของการทดสอบระบบ Magic Formula ในตลาดหุ้นไทย ซึ่งเป็นสิ่งที่สะท้อนให้เห็นว่าเราสามารถใช้ปัจจัยต่างๆในการวิเคราะห์ทางพื้นฐาน มาทดสอบวิจัยและสร้างให้เป็นระบบการลงทุนที่มีกฎเกณฑ์ที่ชัดเจน เรียบง่ายและสามารถเอาชนะตลาดได้อีกด้วย และนี่ก็คือตัวอย่างเนื้อหาและทรัพยากรต่างๆที่พวกเราสมาชิก SiamQuant Academy จะได้เรียนรู้กันทุกคนในช่วงต่อๆไป

สำหรับเพื่อนๆที่สนใจเริ่มต้นการลงทุนอย่างเป็นระบบอย่าลืม Share และสมัครสมาชิกกันเข้ามาได้เลยโดยคลิ้กที่ภาพด้านล่าง พวกเรายังคงต้องการเพื่อนร่วมทางและผู้สนับสนุนโปรเจคอีกเป็นจำนวนมากเพื่อร่วมกัน Kickstarting The Quant Era ในเมืองไทยกันอยู่นะครับ ขอบคุณครับ

ทีมงาน SiamQuant

SiamQuant Academy จุดเริ่มต้นของการลงทุนอย่างเป็นระบบ

SQA Ads for Video Post 1-3 Ratio