2022/04/08 追記
Webアプリで18種類のETFの一年間のドローダウンが見れるようにしました。
基準として
・S&P500連動ETF
・米国国債 7-10年 ETF
・米国国債 20年超 ETF
・金地金との連動ETF
と以下の14銘柄から一つを選べるようになります。
基本の4つはレイ・ダリオ推奨「オール・ウェザー戦略」をETFで構築で扱った銘柄です。
その他14銘柄を含む合計18銘柄の詳細はこちらの記事で紹介しています。
結果は以下のようになります。
興味ある人は是非使ってみてください。また、追加してほしい銘柄などあるようであれば、コメントなどいただければ場合によっては対応できるかもしれません。
—
以下のような株式投資におけるドローダウン時のデータをPythonのデータフレームで出力する方法についての質問をいただきました。
python便利 より:
2022-02-11 05:29
ドローダウンの部分が非常に参考になりました。
ありがとうございます。
ドローダウンの部分をグラフでなく、データフレーム型で表示させたいときは、どのようにコードを打てばいいのですか?
https://worth2know.com/python-statistical/#comment-33
以前書いたコードなどがありますので、疑問や問題の解決にご協力したいと思います。
2022/03/06 追記
Google Colaboratoryでは動いていたのですが、一部Windowsの環境では動いていないとの連絡を行けましたので、修正を行いました。
また過去データを取得してのWebアプリにしてみました。過去データについては需要によっては更新していきたいと思ています。
株式トレード的な視点や、Pythonの関数的な視点、数学的な統計的な視点など、”分からない・難しい”と感じる部分をきちんと切り分けて対応できれば、何か新しいことを見つける機会になるのではないでしょうか。
Webアプリにについてはこちらをご参照ください。
すべての質問に答えられるわけではないですが、依然調べたこともあったように記憶してますので、それをもとに python便利様 のご質問にお応えできればと思います。
この記事でできる事
Yahoo-USから米国株のETFデータをダウンロードし、そのドローダウンについて考察します。
下準備
いつも通りGoogle Colaboratoryのpythonを使うことにより、無料で、簡単に調査します。
Google Colaboratory については以下の記事を参考にして下さい
また、今回は以下の記事に対して、ご質問をいただきました。
Pythonでのデータ取得
まずは、データを取得します。
!pip install yfinance --upgrade --no-cache-dir
import datetime
import yfinance as yf
import matplotlib.pyplot as plt
%matplotlib inline
start = datetime.date(2014,12,31)
end = datetime.date.today()
codelist = ["QYLD","QQQ","SPY"]
data2 = yf.download(codelist, start=start, end=end)["Adj Close"]
display(data2.head(2).append(data2.tail(2)))
df_pct=100*data2.pct_change().dropna()
display(df_pct[codelist].head(2).append(df_pct[codelist].tail(2)))
df=(1+data2.pct_change()).cumprod()
df.plot(figsize=(8,6),fontsize=18)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
plt.grid(True)
plt.show()
ここからドローダウンの解析なのですが、以前 Stack overflow(熱狂的でプロフェッショナルなプログラマーのためのQ&A)あたりで見つけて自分なりにチューニングしたコードがありますので、それを紹介しておきます。
2022/03/06 追記
Google Colaboratoryでは動いていたのですが、一部Windowsの環境では動いていないとの連絡を行けましたので、修正を行いました。
修正箇所は5行目の(以下に
index=data2.index,
を追記しています。
スクリーンキャプチャは以前のまま、コードは修正後となっています。
import pandas as pd
import matplotlib.dates as mdates
output_df=pd.DataFrame(index=data2[codelist].columns,columns=["MAXDD","STD","RETURN"])
input_sheet_df=pd.DataFrame(index=data2.index,columns=["close","Roll Max","Daily_Drawdown","Max_Daily_Drawdown"])
code=["SPY"]
df3=data2[code].copy()
window = 252
plt.rcParams["font.size"] = 18
fig, ax = plt.subplots(figsize=(12, 7))
input_sheet_df["close"]=df3[code].dropna().copy()
input_sheet_df["Roll_Max"] = input_sheet_df["close"].rolling(window, min_periods=1).max()
input_sheet_df["Daily_Drawdown"] = input_sheet_df["close"]/input_sheet_df["Roll_Max"] - 1.0
input_sheet_df["Max_Daily_Drawdown"] = input_sheet_df["Daily_Drawdown"].rolling(window, min_periods=1).min()
output_df.at[code,"MAXDD"]=input_sheet_df["Max_Daily_Drawdown"].min()
input_sheet_df["HV"]=100*input_sheet_df["close"].pct_change().std()
output_df.at[code,"STD"]= input_sheet_df["HV"][-1]
output_df.at[code,"RETURN"]=100*(input_sheet_df["close"][-1]-input_sheet_df["close"][0])/input_sheet_df["close"][0]
plt.plot(input_sheet_df.index,input_sheet_df["Daily_Drawdown"],label=code,linewidth=4)
plt.plot(input_sheet_df.index,input_sheet_df["Max_Daily_Drawdown"],label=code,linewidth=4)
plt.grid(True)
Dateform=mdates.DateFormatter('%y/%m')
ax.xaxis.set_major_formatter(Dateform)
display(output_df.T[code])
display(input_sheet_df)
今となってはなんで、これやっていたんだっけ、、という部分もないわけではないですが、いまだに動いているようで、なんかすごいな、、という感じではあります。
オレンジ色の線は252日営業日前(約一年)の最大ドローダウンとなります。監視期間をロールして言っている状態になります。
自己流で書いている部分や、以前に書いたものですが、ご参考になればと思います。
私自身分からないことや、記事として書く時間が取れない場合もありますが、わかる範囲内では今後も質問やコメントなどいただければ、おこたえしていきたいと思います。
また、現在のところコメント入力でのメールアドレスの認証は外してありますので、お気軽にコメント等いただければ幸いです。
ディスクレーマー
投資に関する免責事項情報の提供・作業代行を目的としており、投資勧誘を目的とするものではありません。
まとめ
参考にさせていただいた記事を紹介します。
---
関連記事を紹介します。
Pytho,投資関係に関する記事をご紹介します。
コメント