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

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

NUTHDANAI WANGPRATHAM
3 min readApr 28, 2020

เราได้พูดถึงการหา Max Drawdown ด้วย Python ในครั้งที่แล้ว สามารถอ่านได้ที่นี้เลยนะครับ

หากในการทำ portfoliovisualization เรามักไม่ดูค่า max DD. เพียงค่าเดียวแต่เราดู Drawdown หลายค่า ประกอบกับระยะเวลาของช่วงเวลานั้นว่ายาวนานขนาดไหนเราจึงจะมาดูกันว่าเรามีวิธีดูค่าสถิติเหล่านี้อย่างไร

เรามาเริ่มต้นกันที่การ import liberly เหมือนเช่นเคย

# 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

ต่อมาก็โหลดข้อมูล

from pandas_datareader import data as pdr

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

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

เรามาดูข้อมูลกันเล็กน้อย

df = df[[ 'close']]
df.rename(columns={'close':'price'},inplace=True)
df.plot()

หาจดสูงสุดก่อนหน้า

df['previous_peeks'] = df.price.cummax()
df.plot()

หาค่าdrowdown

df['drowdown'] = (df.price - df.previous_peeks)/df.previous_peeks
df.drowdown.plot()

ทำให้ค่าแต่ละช่วงมารวมกันโดยการจัดกลุ่ม previous_peeks

groups = df.groupby(df['previous_peeks'])drowdown = groups['previous_peeks','drowdown'].apply(lambda g: g[g['drowdown'] == g['drowdown'].min()])

เรียงจากติดลบมากไปหาน้อย

topdrowdown = drowdown.sort_values(‘drowdown’, ascending=True)topdrowdown

สร้างฟังชั่นหาค่าต่างๆ

todef drawdown_group(df,index_list):group_max,dd_date = index_listddGroup = df[df['previous_peeks'] == group_max]def drawdown_group(df,index_list):group_max,dd_date = index_listddGroup = df[df['previous_peeks'] == group_max]group_length = len(ddGroup)
group_dd = ddGroup['drowdown'].min()
group_dd_length = len(ddGroup[ddGroup.index <= dd_date])
group_start = ddGroup[0:1].index[0]
group_end = ddGroup.tail(1).index[0]
group_rec = group_length - group_dd_length
return group_start,group_end,group_max,group_dd,dd_date,group_dd_length,group_rec,group_length

สร้างตารางรายละเอียดของ drowdown

dd_col = ('start_date','end_date','previous_peeks', 'drowdown','drowdown_date','drowdown_length','recovery_length','total_length')df_dd = pd.DataFrame(columns = dd_col)for i in range(1,300):index_list = topdrowdown[i-1:i].index.tolist()[0]start,end,peak,dd,dd_date,dd_length,dd_rec,total_length = drawdown_group(df,index_list)df_dd.loc[i-1] = drawdown_group(df,index_list)

เท่านี้เราก็ได้ตารางค่า drawdown พร้อมรายละเอียดต่างๆเรียบร้อยแล้ว

df_dd.head(10)

แถมให้เราอยากดูระยะเวลาที่ติดลบนานที่สุดของพอร์ตการลงทุนเป็นกี่วันสามารถ sort_values ได้ง่ายๆ

df_dd.sort_values('total_length', ascending=False).head(10)

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

  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