はじめに
トレーディングシステムのバックテストで、資産のドローダウン期間の平均を求めたくなりました。
いろいろ調べてみたところ、最大ドローダウン率を出すプログラムはあるけれど、個々のドローダウン期間を出すプログラムって案外見つからないんですよね。
そこで自分で実装してみました。
環境
- Python 3.9.5
コード
sum_model.py
def calc_drawdown(input):
"""calc drawdown list
Args:
input [list]: 資産推移
Returns:
[list]: [(ドローダウン率, ドローダウン期間, ドローダウンが始まった箇所のインデックス), ...]
"""
hist = input + [float("inf")]
dd = [] # 結果
down_start_price = 0 # ドローダウン開始時の資産&ドローダウン突入のフラグ
down_strat_day = 0 # ドローダウン開始時のインデックス
tmp_min = float("inf") # ドローダウン後の最小値
for day, price in enumerate(hist):
if day == 0: continue
# dd期間外
if not down_start_price:
# dd突入
if hist[day] < hist[day-1]:
down_start_price = hist[day-1]
down_strat_day = day-1
tmp_min = min(tmp_min, price)
# dd期間中
if down_start_price:
tmp_min = min(tmp_min, price)
# dd脱出
if price >= down_start_price:
dd.append(((down_start_price-tmp_min)/down_start_price, day - down_strat_day, down_strat_day))
down_start_price = 0
tmp_min = float("inf")
return dd
実行例
資産を時系列順に格納した配列を入力します。
input
assethist = [350, 370, 400, 200, 100, 400, 350, 800, 400]
calc_drawdown(assethist)
結果
(ドローダウン率, ドローダウン期間, ドローダウンが始まった箇所のインデックス)
をリストで返します。
output
[(0.75, 3, 2), (0.125, 2, 5), (0.5, 2, 7)]
最大ドローダウン75%は、ちょっと耐えられそうにありませんね。。