どのような投資も長期投資が基本です。その際に、知っておくべきことがあります。長期投資に適切な銘柄を見つけても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:]
pct_chgが最大損失の率です。startはドローダウンが始まった日、peakは底値の日、endは回復した日です。dd0がドローダウン期間です。dd5は底値を付けるまでの期間、dd9は底値を付けてから回復するまでの期間です。p0はドローダウンが始まった日の価格、p5は底値の価格、p9は回復時の価格です。
アップル株の株価の推移
tsd.loc[:,'Adj Close'].plot()
np.log(tsd.loc[:,'Adj Close']).plot()
長期のグラフは対数を取ってください。アップルのような優良な株価でもこの程度のドローダウンがあります。このような場合、下落したからといって損を切ることは適切ではありません。優良銘柄であれば、長期投資が基本です。損切などは要りません。非効率なだけです。株価が半分になるのを平気で傍観できることが重要です。その際に破綻しないように、十分な分散投資をしておくことが重要です。
他の株を見てみましょう。
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:]
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:]
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:]
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:]
Python3ではじめるシステムトレード【第2版】環境構築と売買戦略
「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。
「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。」