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

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

Pythonに不慣れでjupyter notebookを取得していない方は、[jupyter notebookのインストール](https://qiita.com/innovation1005/items/2f433d6d859f075033a7)を参照してください。また、長期投資自体に興味のある方は[Python3ではじめるシステムトレード：長期投資](https://qiita.com/innovation1005/items/024a8ea59109894d0e66)を、そして米国株に興味のある方は[Yahoo Finance USから株価をダウンロードしてみた](https://qiita.com/innovation1005/items/5be026cf7e1d459e9562)を見てみてください。

初期化

```Python
%matplotlib inline
import pandas_datareader.data as web
import numpy as np
from datetime import date
import pandas as pd
```
ドローダウン関数の構築

```Python
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
```

実行

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/db799223-1af8-35d3-7d9c-ee0e44ebaf06.png)

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

アップル株の株価の推移

```Python
tsd.loc[:,'Adj Close'].plot()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/f57d21ea-ff5f-f66f-27ca-837f6063ad99.png)


```Python
np.log(tsd.loc[:,'Adj Close']).plot()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/1b82f556-7dd8-bce5-45b6-aa3f61259967.png)
長期のグラフは対数を取ってください。アップルのような優良な株価でもこの程度のドローダウンがあります。このような場合、下落したからといって損を切ることは適切ではありません。優良銘柄であれば、長期投資が基本です。損切などは要りません。非効率なだけです。株価が半分になるのを平気で傍観できることが重要です。その際に破綻しないように、十分な分散投資をしておくことが重要です。

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

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/db27cee4-f4c0-f61b-a71a-8011307c485e.png)

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/ea587a77-1dc8-c224-e958-dee0eb1ef914.png)

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/11ed1673-e06b-455a-3413-1f8f081529ce.png)

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/0e862fdb-980b-4b40-28f7-d8e97b916e01.png)



<A HREF="http://www.tradersshop.com/bin/showprod?c=9784775991855
">Python3ではじめるシステムトレード【第2版】環境構築と売買戦略</A>

<A HREF="http://www.tradersshop.com/bin/showprod?c=9784775991855">
     <IMG SRC="http://www.tradersshop.com/images/prod/9784775991855.jpg"BORDER=1 WIDTH=70 HEIGHT=100  </A>

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



<A HREF="http://www.tradersshop.com/bin/showprod?a=17600&b=1&c=9784775970270">
     <IMG SRC="http://www.tradersshop.com/images/prod/9784775970270.jpg"BORDER=1 WIDTH=70 HEIGHT=100 </A>

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