การหา Top Drawdown ด้วย Python
การทำ portfolio optimization ด้วย google colab VII
เราได้พูดถึงการหา 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_lengthreturn 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)
อ่านตอนอื่นๆได้ที่
- การคำนวณผลตอบแทนการลงทุนด้วย 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