Pythonの数理統計関数などの資料をまとめます。また、実際にどのように自分が使っているかを示したいと思います。
この記事でできる事
この記事で行えることは銘柄を
ダウンロードし、
チャートを表示し、
数理統計関数で特性を調べ(mean, std, median など)、
株価分布を調べ(ヒストグラムと箱ひげ図)、
ドローダウンを調べることとなります。
以下のようにツイートを拝見しました。
Webサービスで入手できるものなのか、できないとしたら、Pythonで簡単に調べることができるのか、確認したいと思います。
下準備
いつも通りGoogle Colaboratoryのpythonを使うことにより、無料で、簡単に調査します。
Google Colaboratory については以下の記事を参考にして下さい。
検証対象と検証期間
以下のコードにより、データを取得します。今回データを取得するのは
QYLD (Nasdaq 100 Covered Call ETF),
QQQ (Invesco QQQ Trust),
SPY (SPDR S&P 500 ETF Trust)
とし、検証期間は 2014-12-31 から 2021-08-20 までとします。
ETFreplay.com でのデータは以下のようになっています。

Pythonでのデータ取得とWebサービスとの比較
上記チャートと同じものを得るには以下のコードとなります。
!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()

QYLDはナスダック100のカバードコールを行うETFのようですが、おそらく近すぎる位置のCallを売っているのか、ナスダック100の上昇分をあまり取り切れていないようにも思いますが、この部分は本題ではありませんので、ここでは割愛します。
分布、数理統計値を調べる
Pythonにはよく使う数理統計関数は多数あります。基本的なものを使い方も含めご紹介します。
plt.figure(figsize=(10,6))
plt.hist(df_pct.values, label=df_pct.columns,align='mid',bins=25)
plt.legend()
print(df_pct.std())
print(df_pct.mean())
print(df_pct.median())

今回は全区間の分散、算術平均、中央値を出してみました。
基本統計量の算出について、どのような関数があるかは以下のサイトが参考になります。

調査区間を区切りたい場合
もし、年ごと、月ごとなど期間を区切りたい場合は以下のようなgroup関数を使う手もあります。
analyse=df_pct.groupby([lambda x: x.year,lambda x: x.month])
display(analyse.std())

箱ひげ図
全区間の箱ひげ図は以下のようになります。
df_box=df_pct.dropna()
plt.figure(figsize=(10,6))
plt.boxplot(df_box.values,labels=df_box.columns)
plt.show()

pyfolioを使いたいのですが、、、
以前、pyfolioというモジュールを紹介したりしたのですが、残念ながら現在その更新が行われておらず、一部エラーが起こっているようです。

ですが、一部の機能は動くようなので、紹介します。
!pip install pyfolio
import pyfolio as pf
plt.figure(figsize=(10,5))
pf.plot_return_quantiles(0.01*df_pct["QYLD"]);

日次、週次、月次の変化の分布が簡単に出せるようです。
pf.plot_drawdown_underwater(0.01*df_pct["QYLD"]);

また、高値からのドローダウンも簡単に出すことができます。
駆け足ではありますが、株価の分布、銘柄の比較など、Pythonの数理統計関数による分析方法についてご紹介しました。
---
関連動画
なお、箱ヒゲ図をトレードで使う方法やオプションの減価について、片岡先生の説明動画を紹介しておきます。
日経225株価指数の時間変化
2017年の動画ですが、価格の時間変化で平方根を使う理由やオプション価格の減価について簡単に説明されていらっしゃいます。今でも有効です。
片岡先生の紹介&一番わかりやすい オプション売り戦略(カレンダースプレッドショート戦略)について。
日経225先物・オプション マーケットスピードRSS活用術(講師:片岡俊博氏)
---
関連記事を紹介します。
Pytho,投資関係に関する記事をご紹介します。
コメント
ドローダウンの部分が非常に参考になりました。
ありがとうございます。
ドローダウンの部分をグラフでなく、データフレーム型で表示させたいときは、どのようにコードを打てばいいのですか?
python便利 様
コメントをいただき大変ありがとうございます。
ドローダウンの部分をpythonのデータフレーム型で表示という事でしたので、以前書いたコードが手元にありましたので、こちらの記事でご紹介させていただきます。
https://worth2know.com/dd/
python便利様のお役に立つようなものであれば幸いです。
ご参考にしていただければと思います。
今後もよろしくお願いします。
TF