0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

資産のドローダウン率・ドローダウン期間を出す[Python]

Posted at

はじめに

トレーディングシステムのバックテストで、資産のドローダウン期間の平均を求めたくなりました。

いろいろ調べてみたところ、最大ドローダウン率を出すプログラムはあるけれど、個々のドローダウン期間を出すプログラムって案外見つからないんですよね。

そこで自分で実装してみました。

環境

  • 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%は、ちょっと耐えられそうにありませんね。。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?