Update Course 2021

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

https://algoaddict.com/p/python-for-finance

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

สิ่งที่ยังเหมือนเดิมคือ

คอร์สนี้คือ คอร์ส “Python for Finance” ไม่ใช่ “Algorithmic Trading” เราจะไม่ได้เน้นหนักทางการสร้างโมเดลเพื่อการลงทุนที่กำไรมาก ๆ ไม่มีการบอก “Magic Formula” ที่ทำให้รวยได้ แต่อย่างใด

algoaddict 2019

คอร์สสำหรับการอัพเดตครั้งแรก ณ ปี 2021 นี้ จะแบ่งออกเป็น 9 session หลักๆ ประกอบด้วยวีดีโอ 129 วีดีโอ ความยาวเกือบๆ 15 ชั่วโมง ไม่นับที่ผมยังค้างทุกคนอยู่ไม่ได้อัพเดตของเก่าและของใหม่ที่ผมจะอัพเดตมาในอนาคต และไม่ได้นับ คือ machine learning, beta, alpha และอย่างอื่นที่ยังไม่ได้เพิ่มเข้ามาในตอนนี้ อนึ่งพื้นฐานภาษา python (ส่วนนี้เราแยกเป็นคอร์สฟรีให้ทุกคนเข้าไปเรียนได้อยู่แล้ว แต่อนาคตผมอาจจะอัพเดตต่างหากไว้ในนี้ด้วยนะครับ)

ทั้ง 10 session ประกอบไปด้วยData Management

  1. Data Management
  2. Data Source
  3. Basic Statistics
  4. Value at Risk
  5. Time Series
  6. Peformance Metric
  7. Backtest – vectorization
  8. More Backtest – non-vectorization
  9. Porftfolio Allocation
  10. Monte Carlo
  1. Data Management

ส่วนแรก จะเป็นเรื่องของการจัดการข้อมูลด้วย library pandas ประกอบไปด้วย

  • การดึงข้อมูลจาก csv
  • ดูข้อมูลเบื้องต้น และการดูสรุปข้อมูลด้วยสถิติ
  • วิธีการเข้าถึงข้อมูลใน dataframe
  • วิธีการเลือกข้อมูลตามช่วงเวลา และ การใช้ loc – iloc และความแตกต่างของมัน
  • การ resample, การเปลี่ยน timeframe ของข้อมูลหุ้น เพื่ออธิบาย insight ข้อมูล
  • การทำ lagging ข้อมูล
  • การสร้างฟีเจอร์ moving average อย่างง่าย
  • การแสดงผลข้อมูลแบบ subplot เช่นการจัดวาง subplot
  • จบท้ายด้วยการ plot candlestick ด้วย mplfinance และสร้าง candlestick ตามสไตล์ของผู้ให้บริการเจ้าต่างๆเช่น yahoo, binance
  • สร้าง support-resistant line
กราฟ candlestick

2. Data Source

(ใหม่)การดึงข้อมูลจากผู้ให้บริการ Yahoo Finance ประกอบไปด้วย

  • ดึงข้อมูลหุ้นจาก yahoo finnance ดึงมาทั้งราคาและอื่นๆ
  • ดู financial statement, cashflow etc.
  • ดู recommendation ของหุ้นนั้นๆว่าเค้าแนะนำอย่างไร ให้ซื้อ ให้ขาย?
  • ดึงข้อมูลเฉพาะราคา
  • ดึงข้อมูลหุ้นหลายๆตัวในครั้งเดียว
  • ดึงข้อมูลหุ้นในกลุ่ม dow jones industrial average ด้วยการดึงข้อมูลผ่านการ read table
  • ดึงข้อมูลหุ้นในกลุ่ม set 100 ด้วยการดึงข้อมูลผ่านการ read table
ข้อมูล Financial Statement ของหลักทรัพย์

รู้จักกับ quandl ประกอบไปด้วย

  • รู้จักการ quandl และการใช้ api key
  • ดึงข้อมูลอื่นๆจาก quandl
ข้อมูล P/E ของ S&P 500

siamchart ในส่วนนี้เราจะเขียนโปรแกรมเพื่ออ่านข้อมูลจากเวปไซด์ siamchart

  • โหลดข้อมูลจาก siamchart
  • โหลดข้อมูลทั้งหมดจาก siamchart ใส่ dataframe เดียว
  • การเขียน function เพื่อสกัดหุ้นรายตัวออกมาจากข้อมูลจาก siamchart
  • การ import และ export เพื่อใช้ในอนาคต
  • เก็บฟังก์ชั่นของเราไว้เป็น utility file เพื่อสะดวกในการใช้งานต่อไป

สุดท้ายเราจะมาจัดการกับข้อมูลที่ไม่สมบูรณ์กันครับ

  • การ cleaning data ถ้าข้อมูลหุ้นมีความผิดพลาดเราจะจัดการอย่างไร ถ้าข้อมูลหุ้นในพอร์ตเริ่มเทรดไม่ตรงกันจะจัดการอย่างไร
  • normalization เพื่อการเปรียบเทียบหุ้นที่ราคาต่างกันในสเกลเดียวกัน
normalize data

3. Basic Statistics

สิ่งที่ขาดไม่ได้จริงๆ ถ้าเราจะสนใจ finance อย่างจริงจังคือ คณิตศาสตร์ครับ และสถิติก็สำคัญมาก ในส่วนนี้เราจะมาเรียนสถิติที่ผมคิดว่าจำเป็นต่อความเข้าใจของเราในการทำงานกับข้อมูลหลักทรัพย์ครับ

เริ่มด้วย return มี return กี่แบบและแบบไหนเอาไว้ใช้งานกับอะไร

  • simeple return กับ log return คืออะไร และอะไรคือคุณสมบัติที่แตกต่างกันระหว่าง simple and log return
  • ทำไมเราควรใช้ log return มากกว่า simple return เวลาทำงานที่ต้องผ่านช่วงเวลาต่างๆกันเช่น การ backtest แบบหนึง และทำไม backtest บางแบบสามารถใช้ simple return ได้
ความแตกต่างของ simple และ log return

จากนั้นมาดูข้อมูลด้วยสถิติพื้นฐาน distribution

  • อะไรคือ normal distribution และทดลองสร้างข้อมูลตาม distribution นั้น
  • เปรียบเทียบกับกับข้อมูลจริง real data ว่าเหมือนหรือต่างกันอย่างไร
  • เข้าใจ Basic statistic เช่น mean, median และ การตีความสองค่าสำหรับข้อมูลหุ้น
กราฟ histogram เปรียบเทียบระหว่าง ข้อมูลจริงและข้อมูลตามทฤษฎี

ต่อมาเรามาดูความแปรปรวน และที่มาของความเสี่ยงในการลงทุน

  • ความแปรปรวน variance คืออะไร มาทำความเข้าใจและเขียนโปรแกรมสร้างมันทั้งแบบยากทำเอง แบบง่ายใช้ฟังก์ชั่นทำ
  • รู้จักกับส่วนเบี่ยงเบนมาตราฐาน หรือ standard deviation ทำความเข้าใจความสัมพันธ์ระหว่างมันและ variance จากนั้นมาสร้างมันเองจนเกิดความเข้าใจ และมาใช้ฟังก์ชั่นสำเร็จรูปทำ
สมการความแปรปรวน

(ใหม่)ส่วนที่ 4 เป็นโปรเจ็คเล็กๆ หลังจากเรียนสถิติมาระยะหนึงแล้ว ก็จะมาลองทำโปรเจ็คหา outlier กันครับ

  • (ใหม่)สร้างฟังก์ชั่นหา outlier จากค่า z-score โดยใช้ความรู้จากบทที่ผ่านมา ทั้ง return และ standard deviation
  • (ใหม่)ทดลองใช้ฟังก์ชั่นกับดาต้าจริง
detect outlier ด้วย z-score

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

  • หาว่าสิ่งของสองสิ่งมีความสัมพันธ์กันแบบไหนด้วย co-variance ทั้งทำเองและใช้ฟังก์ชั่นเหมือนเดิม เพื่อความเข้าใจ
  • ทำให้ co-variance ที่ได้ มีมาตราฐานในการตีความ ทั้งเขียนเองและฟังก์ชั่นเช่นเดิม
  • มาดู correlation กับดาต้าจริงกันครับ
  • (ใหม่)ดู Autocorrelation ความสัมพันธ์ของหุ้นตัวนึงกับตัวมันเองบ้างครับ งงไหมครับ แต่มันคือดูกับตัวเองที่เป็น lagging ข้อมูลนั่งเอง
ตาราง correlation ของหุ้น us

เรียนมาพอสมควรแล้ว เราจะมาดูการแจกแจงแบบ fat tail ด้วย violion และ qq plot กันครับ

  • รู้จักกับ qq plot และ violin plot
  • เปรียบเทียบข้อมูลจริง และข้อมูลตามทฤษฎีว่าแตกต่างกันอย่างไร
เปรียบเทียบการแจกแจงของ normal distribution เทียบกับดาต้าจริง เพราะทฤษฎีการลงทุนหลายอย่างมากที่ใช้สมมุติฐาน normal distribution เราจึงต้องรู้พื้นฐานมันก่อนว่าทำไมสิ่งเหล่านั้นจึงไมม่แม่นยำ

4. Value at Risk

หลังจากเรียนสถิติกันไปแล้ว เรามีความเข้าใจมากพอที่จะไปประเมินความเสี่ยงของการลงทุนกันต่อแล้วครับ และการประเมินนั้นก็ไม่ได้ใช้อะไรมากไปกว่าที่เรียนมาใน session ที่ 2

  1. Value at Risk 2 แบบแตกต่างกันอย่างไร
  2. เรียนรู้การประเมินความเสี่ยง Value at Risk แบบ non-parametric ที่ไม่ต้องใช้พารามิเตอร์ใช้แค่ข้อมูลดิบมาประเมิณความเสี่ยง โค้ดกันเองทั้งหมดครับ
  3. การประเมิณความเสี่ยง Value at Risk แบบ แบบ parametric ที่ใช้พารามิเตอร์มาประเมินความเสี่ยง โดยการสร้าง distribution ที่พยายามก็อปปี้ดาต้าจริงขึ้นมาและใช้มันในการประเมินความเสี่ยง
  4. (ใหม่) เพิ่มเติมการประเมินความเสี่ยงแบบ non-parametric ด้วยการเขียน conditional Value at Risk
  5. (ใหม่) เพิ่มเติมการประเมินความเสี่ยงแบบ parametric ด้วยการเขียน cornish-fisher เพื่อสร้าง distribution ที่ไม่จำเป็นต้องดื้อแพ่งใช้ normal distribution ถ้าข้อมูลมันไม่เป็น normal(eq fat tailed เป็นต้น) อันนี้สมการเยอะนิดหนึงแต่เราจะมาทำความเข้าใจกันครั
ตัวอย่าง VaR แบบ non-parametric

5. (ใหม่)Time Series

ส่วนนี้จะเป็นส่วนเพิ่มเติมมาใหม่ทั้งหมดครับ เราจะว่ากันด้วย ทฤษฎี time series และใช้ โมเดลของมันมาพยายามโมเดลข้อมูลการลงทุนและทำนายอนาคตกันครับ

  • ดูองค์ประกอบของ time series ด้วยการแกะมันออกมา decompose ออกเป็นองค์ประกอบต่างๆเพื่อทำความเข้าใจ ดูทั้งแบบ linear และ non-linear

ริ่มมาทำนายกันครับ

  • exponentially weighted moving average (ewma) ก้าวแรกของการพยายามสร้างโมเดลในการอธิบายดาต้าทองคำและ ทำนายมันกันครับ
  • หลังจากดูโมเดลพื้นๆไปแล้ว เรามาลองเพิ่มราละเอียดด้วยการโมเดล holt และ holt-winter แล้วลองมาทำนายราคาทองคำครับ ดูว่ามันต่างกันยังไง และมันดีพอจะให้เราเอาไปใช้หรือไม่

คั่นเบรกด้วยการกลับมาดูข้อมูล

  • ดูว่าข้อมูลของเรานั้นเป็น stationarity หรือไม่ ด้วยการเทส augmented dickey–fuller test จากนั้นเขียน function on top ของ adf อีกทีหนึงเพื่อการแปลผลที่ดีขึ้น
  • ถ้าดาต้าไม่เป็น stationarity  เราต้องทำอย่างไรให้มันเป็น
  • ดู partial autocorrelation (pacf) ดูความสัมพันธ์ของข้อมูลทองคำเรากับตัวมันเองแบบแยกส่วน ผมจะอธิบายหลักการทางคณิตศาสตร์กันครับว่าต่างกันยังไงและตีความมันกันครับ

ส่วนสุดท้ายเราจะมาใช้โมเดลที่ชื่อดังตัวหนึงครับ AutoRegressive Integrated Moving Average (ARIMA) มารู้จักมันกันครับ

  • มารู้จัก ARIMA กันครับ ว่าโมเดลนี้มีใช้หลักการอะไรในการโมเดลราคาทองคำของเรากันบ้างครับ และเรามาดูกันด้วยว่าตัวแปร p d q ของARIMA หมายถึงอะไร และใส่แบบไหน โมเดลจะกลายเป็นAutoRegressive Moving Average (ARMA)
  • เรามาเลือก p d q ว่าเลือกกันยังไง และ ค่าไหนที่บอกว่ามันดี ไม่ดีกันครับ
  • โมเดลทองคำด้วย ARIMA และทำนายมันกันครับ
  • รู้จักกับ Auto ARIMA เพื่อการทำนายราคาแบบไม่ต้องสนใจเรื่องการเลือกตัวแปรมากนักกันครับ
  • ลองใช้ SARIMAX กันครับ
ประเมินทิศทางราคาทองคำด้วย ARIMA

6. Peformance Metric

เราจะมาพูดกันเรื่องการวัดผลกันครับว่าผลจากการ simulation ของเรามันดีหรือไม่ดียังไง

  • ก่อนจะมาวัดผลเรามามาสร้าง strategy ในการเทรดกันก่อนครับโดยเราจะ backtest แบบ trend following กันครับ แบบ sma crossover กันครับ โดยเราจะทำกันเป็น step 5 step และเราจะทำมันแบบ vectorization ครับ เราจะเปรียบเทียบความเร็วกันว่ามันเร็วกว่าแบบ for loop แค่ไหนอย่างไร

จากนั้นผลที่ได้ เราก็จะไม่สามารถตอบได้ว่ามันดีหรือแย่อย่างไรเราเลยจะมาเข้าเรื่องการวัดผลกันครับ

  • มารู้จัก drawdown กันครับ และมาโค้ดมันเองตั้งแต่เริ่มต้นกันเลยครับ และหา maximum drawdown เพื่อวัดผลความเสี่ยง
  • วัดความเสี่ยงด้วย volatility รู้จัก daily volatility และทำมันเป็น yearly volatility
  • วัดความเสี่ยงเทียบกับกำไรด้วย sharpe ratio และมาโค้ดดิ้งมันกันครับ และดูรายละเอียดเล็กๆน้อยอย่างประเภท return ที่จะนำมาใช้ด้วยครับ
  • Compound annual growth rate (CAGR) รู้จักและคำนวณเรตผลกำไรต่อปีกันครับ
  • วัดผลความแม่นยำของสัญญารด้วย hit rate กันครับ
  • สุดท้ายนี้เรานำทุกอย่างที่เขียนมาสร้างเป็น fuction ในการวัดผลการลงทุนที่ทำไว้ตอนแรกของ session นี้กันครับ
  • ใช้ pyfolio มาวัดผลของเรา และเปรียบเทียบกับผลลัพธ์ของเราว่าต่างกันอย่างไร ถ้าต่างเพราะอะไร มาดูเหตุผลของ industry กันครับ
ฟังก์ชั่นวัดผลการลงทุนที่เราเขียนเอง

7. Backtest

หลังจากเขียนวัดผลไปแล้วเรากลับมาทำ backtest กันต่อครับ

  • เรานำ trend following ที่เขียนไว้มา optimization เพื่อหาค่าที่ดีที่สุด หรือค่าที่ให้ return sharpe ratio ทีเราต้องการกันครับ
  • แต่ optimization อย่างเดียวมันไม่ได้ครับ เราต้องนำข้อมูลมาแยกเป็น insample และ out of sample ครับ เราจะ optimization บน insample และ เทสมันบน sample
  • เขียน mean reversal แบบใช้ฟีเจอร์ basic ที่สุดกันครับ มาเรียนกันว่า mean reversal จริงๆแล้วมันมีสมมุติฐานแบบไหน จากนั้นก็วัดผลครับ
  • optimization mean reversal ปิดท้ายกันครับ
ตาราง optimization parameter

8. (ใหม่)More Backtest – non-vectorization

เราจะมาเขียน backtest แบบช้ากันบ้างครับ อย่างที่บอกมันช้า ถ้าช้าแล้วเราเขียนทำไม มันก็ต้องมีประโยชน์อะไรเพิ่มขึ้นมาครับ เช่น การเจอเหตุการณ์แบบ point by point คล้ายๆ event based backtest กันครับ แต่เราจะทำมันแบบไม่ได้สร้าง OOP นะครับ ใช้เป็น function ธรรมดาไม่ใช่class

  • สร้าง backtest แบบเรียบง่ายที่สุดกันครับ โค้ดอาจจะเยอะกว่าแบบ vectorization เยอะ แต่เราจะทำเพื่อเป็นพื้นฐานมนการเพิ่มรายละเอียดต่อๆไปครับ
  • ใส่ stoploss ให้กับการลงทุนของเรากัน
  • ทำโค้ดวุ่นวายของเราให้สั้นลงกำจัดการทำงานซ้ำซ้อนให้เป็น fucntion
  • จัดการราคาเข้าเปิด-ปิดสัญญาซื้อ เข้าเปิด-ปิดสัญญาขาย ให้มันสมจริงกันครับ
  • เก็บ log ของการเปิดสัญญาเทรดแต่ละครั้งไว้วิเคราะห์ต่อไป
  • อันนี้เป็นเรื่องทาง assumption ทางคณิตศาสตร์ที่มันต่างกับ vectorization กันครับ และเราจะแก้ให้มันตรงเป๊ะกับ assumption ได้อย่างไร
ผลการ backtest แบบ non-vectorization
เก็บลงการเทรดแต่ละไม้เพื่อการวิเคราะห์

9. Portfolio Allocation

เราพูดถึงการลงทุนกันไปหลาย session แล้วแต่เรายังไม่พูดถึง การลงทุนแบบเป็น portfolio เลย โดยผมจะมารู้จักกับการคิดกำไรขาดทุนแบบเป็น portfolio จากนั้นมาคิดความเสี่ยงของ portfolio และจะไปปิดท้ายที่ Modern portfolio theory(MPT) เราจะตอบคำถามสำคัญข้อหนึงคือเป็นไปได้ไหมที่เราจะคาดหวังกำไรเพิ่มขึ้นโดยที่เราจะไม่ต้องเสี่ยงเพิ่มขึ้นไปด้วย เราจะไม่เอา higher risk higher return เราจะเอา higher return แต่ lower risk ได้ไหมใน session นี้ผมทำใหม่ทั้งหมดนะครับ มีการปรับโค้ดให้มันมีประสิทธิพาขึ้น เพิ่มโค้ดเพื่อสร้างความเข้าใจกับโลกการลงทุนมากขึ้นครับ

  • คำนวณ portfolio return อันนี้ง่ายครับ
  • คำนวณ portfolio variance อันนี้วุ่นวายขึ้นเยอะครับแต่ไม่เป็นไร ผมได้เพิ่มคำอธิบายมากขึ้น ทั้งทางคณิตศาสตร์และโค้ดครับ และเรามาดูว่าตัวแปรไหนที่จะเพิ่มหรือลดความเสี่ยวของ portfolio ได้บ้าง
สมการคิด Portfolio variance
  • ดูผลกระทบของ correlation ในการสร้าง portfolio กันแบบ manual
  • (ใหม่)สร้างความเข้าใจกับความสัมพันธ์ที่ว่า ด้วยการเลือกฟอร์มหนึงของการคิด portfolio variance มาสร้างเป็นฟังก์ชั่นเพื่อใช้ดูผลกระทบของ correlation กันครับ โดยฟังก์ชั่นนี้จะถูกนำมาใช้ทั้งดาต้าจริงแต่ดาต้าสมมุติครับ
Efficient frontier for 2 asset
  • (ใหม่)เราเริ่มสร้าง Modern portfolio theory เพื่อประเมินการลงทุนเพื่อ optimization การลงทุน พยายามหา portfolio ที่เพิ่มกำไรโดยไม่เพิ่มความเสี่ยงได้ไหม โดยเราจะเลือกหุ้นมาแบบไม่ได้มีหลักการมากนัก
  • (ใหม่)รู้จักกับ Efficient frontier เส่นการลงทุนที่มีประสิธิภาพที่สุด และเขียนมันในโค้ดกันครับ
  • (ใหม่)มาดึง weights ของหุ้นต่างๆใน portfolio เรากันครับ ว่าเราจะลงทุนใน porfolio แบบไหน ได้กำไรมากสุด? sharpe ratio สูงสุด หรือความเสี่ยงต่ำสุด หรือจะเอาเป็น sharpe ratio สูงสุด 10 ตัวแรก เป็นต้น
  • (ใหม่)เข้าใจกับ magnitude จากการหุ้นมนพอร์ตมีผลกับ shape ของการแจกแจงใน MPT อย่างไร
  • (ใหม่)ลองสร้าง Modern portfolio theory ที่เลือกมาด้วย correlation และดูว่าเราลดความเสี่ยงจากตัวแรกได้ไหม
modern portfolio theory

10. Monte Carlo

ราคาหุ้นหรือหลักทรัพย์ที่เราเห็นๆกันอยู่เนี่ย มันเป็นเพียงความเป็นไปได้แค่ 1 แบบ จากความน่าจะเป็นนับล้านๆแบบ ถ้าเราเชื่อ random walk theory แปลว่าอนาคตไม่มีทางแน่นอน เราต้องอาศัยการประเมินการลงทุนที่พยายามโปรเจ็คหาอนาคตให้มากที่สุดเท่าที่เราจะทำได้ แต่เราจะไม่เดาอย่างเดียว เราจะใช้ความรู้ในอดีตผสมกระบวนการ random ด้วย

  • ทำความเข้าใจ monte carlo กับ การทำ stock simulation มาดูว่าเราจะใช้ความรู้ในอดีตมาประเมินอนาคตที่ดำเนินรอยตาม random walk theory ได้อย่างไรทำไมมันจึงสมเหตุสมผล ทั้งคณิตศาสตร์และโค้ด
  • monte carlo อาจจะเกิด bias ได้อย่างไร ้เราจะมาเรียนกันแบบ สมการ ต่อ สมการ กันเลยครับ
  • การใช้ VaR มาประเมินค่าที่ได้จาก monte carlo
monte carlo simulation

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s