3
5

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 1 year has passed since last update.

Python3ではじめるシステムトレード:ドローダウンを知ることで長期でリターンを上げる

Last updated at Posted at 2021-12-23

どのような投資も長期投資が基本です。その際に、知っておくべきことがあります。長期投資に適切な銘柄を見つけても80%以上下落することはあり得ることです。50%以上下落することも稀ではありません。そのことを理解するにはドローダウンという概念を知っておく必要があります。ドローダウンは価格が下落を始めてから、その損失を回復するまでの期間を言います。また、そのときの最大の損失額を知っておくことも必要です。百聞は一見に如かずなので、やってみましょう。

Pythonに不慣れでjupyter notebookを取得していない方は、jupyter notebookのインストールを参照してください。また、長期投資自体に興味のある方はPython3ではじめるシステムトレード:長期投資を、そして米国株に興味のある方はYahoo Finance USから株価をダウンロードしてみたを見てみてください。

初期化

%matplotlib inline
import pandas_datareader.data as web
import numpy as np
from datetime import date
import pandas as pd

ドローダウン関数の構築

def drawdown(Close):
    price=Close
    high=0
    length=len(price)
    ddhistory=[]
    i=0
    maxdd=0
    maxddd=0
    pofdowntrend=0
    dd=0
    for row in price.itertuples():
        da=row[0]
        pc=row[6]
        if pc>high:
            high=pc
            pf1c=price["Adj Close"].iloc[i+1]
            if pf1c<pc: #Draw dwon starts------------------------------------
                low=pc
                d_start=date(da.year,da.month,da.day) #drawdown start date
                d_low=d_start
                p_start=pc
                p_low=pc
                price2=price.iloc[i+1:]
                jj=0
                j=i
                for row2 in price2.itertuples():
                    daf=row2[0]
                    pfc=row2[6]
                    if pfc<low:
                        low=pfc
                        pofdowntrend=j-i#the period of a price down
                        d_low=date(daf.year, daf.month,daf.day) #date of varry
                        p_low=pfc
                    if pfc>high: #drawdwon is finished
                        dd=(high-low)/high#the drawdown %
                        d_end=date(daf.year, daf.month,daf.day) #date of end of drawdwon
                        p_end=pfc
                        ddd=j-i#the drawdown duration
                        jj=i+pofdowntrend+1
                        break
                    j+=1
                if j<length-1:
                    recovery=ddd-pofdowntrend
                    dd0=[d_start,d_low, d_end,ddd,pofdowntrend,recovery,dd,p_start,p_low,p_end]
                    ddhistory.append(dd0)
                else:
                    jj=length-1
                    dd=(high-low)/high
                    d_end=np.NaN
                    ddd=j-i
                    p_end=np.NaN
                    #pofdowntrend=j-i
                    recovery=ddd-pofdowntrend
                    dd0=[d_start,d_low, d_end,ddd,pofdowntrend,recovery,dd,p_start,p_low,p_end]
                    #print(dd0)
                    ddhistory.append(dd0)
                if dd>maxdd:
                    maxdd=dd
                if ddd>maxddd:
                    maxddd=ddd
        i+=1
        if i>length-2:
            break
    ddhistory=pd.DataFrame(ddhistory, columns=['start','peak','end','dd0','dd5','dd9','pct_chg','p0','p5','p9'])
    return maxdd,maxddd,ddhistory

実行

import matplotlib.pyplot as plt #描画ライブラリ
import pandas_datareader.data as web #データのダウンロードライブラリ
tsd = web.DataReader("aapl","yahoo","1980/1/1").dropna()#jpy
maxdd,maxddd,ddhistory=drawdown(tsd)

a=ddhistory.sort_values('pct_chg')
a.iloc[-20:]

image.png

pct_chgが最大損失の率です。startはドローダウンが始まった日、peakは底値の日、endは回復した日です。dd0がドローダウン期間です。dd5は底値を付けるまでの期間、dd9は底値を付けてから回復するまでの期間です。p0はドローダウンが始まった日の価格、p5は底値の価格、p9は回復時の価格です。

アップル株の株価の推移

tsd.loc[:,'Adj Close'].plot()

image.png

np.log(tsd.loc[:,'Adj Close']).plot()

image.png
長期のグラフは対数を取ってください。アップルのような優良な株価でもこの程度のドローダウンがあります。このような場合、下落したからといって損を切ることは適切ではありません。優良銘柄であれば、長期投資が基本です。損切などは要りません。非効率なだけです。株価が半分になるのを平気で傍観できることが重要です。その際に破綻しないように、十分な分散投資をしておくことが重要です。

他の株を見てみましょう。

tsd = web.DataReader("tmo","yahoo","1980/1/1").dropna()#jpy
np.log(tsd.loc[:,'Adj Close']).plot()
maxdd,maxddd,ddhistory=drawdown(tsd)
a=ddhistory.sort_values('pct_chg')
a.iloc[-20:]

image.png

tsd = web.DataReader("tsla","yahoo","1980/1/1").dropna()#jpy
np.log(tsd.loc[:,'Adj Close']).plot()
maxdd,maxddd,ddhistory=drawdown(tsd)
a=ddhistory.sort_values('pct_chg')
a.iloc[-20:]

image.png

tsd = web.DataReader("qqq","yahoo","1980/1/1").dropna()#jpy
np.log(tsd.loc[:,'Adj Close']).plot()
maxdd,maxddd,ddhistory=drawdown(tsd)
a=ddhistory.sort_values('pct_chg')
a.iloc[-20:]

image.png

tsd = web.DataReader("usmv","yahoo","1980/1/1").dropna()#jpy
np.log(tsd.loc[:,'Adj Close']).plot()
maxdd,maxddd,ddhistory=drawdown(tsd)
a=ddhistory.sort_values('pct_chg')
a.iloc[-20:]

image.png

Python3ではじめるシステムトレード【第2版】環境構築と売買戦略

「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。

「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。」

3
5
3

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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?