การหา Max Drawdown ด้วย Python
การทำ portfolio optimization ด้วย google colab III
มาตรวัดความเสี่ยงที่นักลงทุนมักใช้กันคือค่าความผันผวนหรือส่วนเบี่ยงเบนมาตรฐาน แต่ข้อจำกัดหนึ่งคือ ค่าความผันผวนหรือส่วนเบี่ยงเบนมาตรฐานนั้นไม่จำเป็นต้องเป็นเรื่องเลวร้าย เพราะมันคือส่วนที่เบี่ยงเบนไปจากค่าเฉลี่ย แต่ถ้าเราบอกว่าความเสี่ยงคือความน่าจะเป็นที่จะเสียเงินค่าความผันผวนหรือส่วนเบี่ยงเบนมาตรฐานอาจไม่ใช่ตัวชี้วัดที่ดี
ถ้าเราบอกว่าการลงทุนนี้กรณีเลวร้ายสุดจะเสียเงินเท่าใหร่นั้นแหละคือความเสี่ยง กรณีเลวร้ายสุดจะเสียเงินเท่าใหร่เราเรียกมันว่า 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;
อ่านตอนอื่นๆได้ที่
- การคำนวณผลตอบแทนการลงทุนด้วย Python
- การหาความผันผวนของพอร์ตการลงทุนด้วย Python
- การหา Max Drawdown ด้วย Python
- การวัด การเบี่ยงเบนของผลตอบแทนด้วย Python
- การวัด SemiDeviation ด้วย Python
- การวัด VaR. และ CVaR. ด้วย Python
- รีวิวการใช้ ffn. ใน Python
- การหา Top Drawdown ด้วย Python
- การหาค่า Sharpe ratio ด้วย Python
- การหากลุ่มหลักรัพย์ที่เส้นประสิทธิภาพ Efficient Frontier ด้วย Python
- การหา shape ratio สูงสุดและเส้น CML ด้วย Python
- การสร้างมูลค่าตลาดแบบถ่วงน้ำหนักด้วย PYTHON
- ข้อจำกัดของการกระจายความเสี่ยงและการทำประกันพอร์ตการลงทุน
- การจำลอง ผลตอบแทนด้วย RANDOM WALK Generation และ Montecarlo simulation
- Sharpe Style Analysis
- Factor Investing ด้วย Python
- วิเคราะห์ ประเภทกองทุนรวมด้วย Python
- การทำ Portfolio optimization
- สร้างแนวรับแนวต้านวิเคราะห์หุ้นด้วย Python