การหา Max Drawdown ด้วย Python

การทำ portfolio optimization ด้วย google colab III

NUTHDANAI WANGPRATHAM
3 min readApr 12, 2020

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

ถ้าเราบอกว่าการลงทุนนี้กรณีเลวร้ายสุดจะเสียเงินเท่าใหร่นั้นแหละคือความเสี่ยง กรณีเลวร้ายสุดจะเสียเงินเท่าใหร่เราเรียกมันว่า Max Drawdown

มาเริ่มกันเลย

สิ่งแรกที่เราต้องทำคือ import liberly เราใช้ numpy กับ pandas ในการจัดการข้อมูล และmatplot สำหรับสร้างกราฟ

# load packages
import pandas as pd
import numpy as np
import pandas_datareader as pdr
import seaborn as sns
from matplotlib import pyplot as plt
# not needed, only to prettify the plots.
import matplotlib
from IPython.display import set_matplotlib_formats
%matplotlib inline

ดึงข้อมูล Data

เรามาดึงข้อมูลจาก yahoo โดยใช้ pandas_datareader

from pandas_datareader import data as pdr

import fix_yahoo_finance as yf
yf.pdr_override() # <== that's all it takes :-)

ข้อมูลที่เราจะดึงในครั้งนี้คือ Vanguard Large-Cap Index Fund ETF ที่เป็นกองอิงดัชนี้ที่ใหญ่ที่สุด และprint ข้อมูลมาดู

# ===========
today = "2020-01-01" # to make static this script.
tckr = 'VV' # Vanguard Large-Cap Index Fund ETF Shares (VV)
# download data
data_1 = pdr.get_data_yahoo(tckr, "2000-01-01", today)
# add frequency needed for some pandas functionalities releated with offsets
data_1 = data_1.asfreq('B')
data_1.columns = data_1.columns.map(lambda col: col.lower())
data_1.head(5)

เราจะเลือกเฉพาะราคาปิดไปคำนวณและเปลี่ยนชื่อคอลัมเล็กน้อย

data_1 = data_1[[ 'close']]
data_1.rename(columns={'close':'large_cap'},inplace=True)
data_1.head()

คำนวณ Max Drawdown วิธีที่ 1

คำนวณหาจุดสูงสุดก่อนหน้า

previous_peeks_1 = data_1.cummax()
previous_peeks_1.plot()
data_1.plot()

เพื่อใครงจุดสูงสุดก่อนหน้าคือเราจะเอาจุดสูงสุดที่เกิดก่อนน้านี้หากค่าใหม่น้อยกว่าเดิมมันจะเลือกค่าจุดสูงสุดก่อนหน้ามาเติม

หลังจากนั้นเราสามารถคำนวณหา drowdown โดยเอาข้อมูลลบด้วยข้าสูงสุดก่อนหน้า

drowdown_1 = (data_1 - previous_peeks_1)/previous_peeks_1

drowdown_1.plot()

หา max drowdown โดยการหาค่าmax ของ drowdown

drowdown_1.min()

ล้อเล่นนะครับจริงๆแล้ว ค่า Max drowdown คือค่า drowdown ที่น้อยที่สุดจึงต้องเป็นค่า min นั้นเอง

drowdown_1.min()
drowdown_1.idxmin()

คำนวณ Max Drawdown วิธีที่ 2 โดยสร้าง ฟังชั่น

เราสามารถสร้างฟังชั่ด้วย code ดังต่อไปนี้ ซึ่งก็คล้ายกับวิธีแรก

def drawdown(series: pd.Series):
"""Takes a time series of asset price.
returns a DataFrame with columns for
the previous peaks, and
the percentage drawdown
"""
previous_peaks = series.cummax()
drawdowns = (series - previous_peaks)/previous_peaks
return pd.DataFrame({"series": series,
"Previous Peak": previous_peaks,
"Drawdown": drawdowns})

เสร็จปุ๋บก็เราก็ใช้ฟังชันตามนี้

drawdown(data_1["large_cap"]).min()

คำนวณ Max Drawdown วิธีที่ 3 วิธีที่ง่ายที่สุด ใช้ liberly ffn.

เนื่องจากใน colab ไม่มี liberly นี้ต้อง install ก่อน

!pip install ffnimport ffn#%pylab inline

เรียกใช้ liberly และหา drowdow

stats = data_1.calc_stats()
ax = stats.prices.to_drawdown_series().plot()
max_drawdown = stats.prices.to_drawdown_series().min()max_drawdown

จบครั้งหน้าเรายังอยู่ในเรื่องความเสี่ยงนะครับจะมีตัววัดความเสี่ยงอะไรอีกติดตามตอนต่อไปนะครับ

Notebook;

github;

อ่านตอนอื่นๆได้ที่

  1. การคำนวณผลตอบแทนการลงทุนด้วย Python
  2. การหาความผันผวนของพอร์ตการลงทุนด้วย Python
  3. การหา Max Drawdown ด้วย Python
  4. การวัด การเบี่ยงเบนของผลตอบแทนด้วย Python
  5. การวัด SemiDeviation ด้วย Python
  6. การวัด VaR. และ CVaR. ด้วย Python
  7. รีวิวการใช้ ffn. ใน Python
  8. การหา Top Drawdown ด้วย Python
  9. การหาค่า Sharpe ratio ด้วย Python
  10. การหากลุ่มหลักรัพย์ที่เส้นประสิทธิภาพ Efficient Frontier ด้วย Python
  11. การหา shape ratio สูงสุดและเส้น CML ด้วย Python
  12. การสร้างมูลค่าตลาดแบบถ่วงน้ำหนักด้วย PYTHON
  13. ข้อจำกัดของการกระจายความเสี่ยงและการทำประกันพอร์ตการลงทุน
  14. การจำลอง ผลตอบแทนด้วย RANDOM WALK Generation และ Montecarlo simulation
  15. Sharpe Style Analysis
  16. Factor Investing ด้วย Python
  17. วิเคราะห์ ประเภทกองทุนรวมด้วย Python
  18. การทำ Portfolio optimization
  19. สร้างแนวรับแนวต้านวิเคราะห์หุ้นด้วย Python

--

--

NUTHDANAI WANGPRATHAM
NUTHDANAI WANGPRATHAM

Written by NUTHDANAI WANGPRATHAM

I am a learner and have a multipotential life. You can contact me at nutdnuy@gmail.com

No responses yet