QuantStatsは特定の銘柄や複数銘柄のポートフォリオに対し種々のリスクメトリクスやパフォーマンスの分析を簡単に実行できるpythonライブラリです。以下のコードでは、GOOGとVTIの比較、そして複数銘柄のポートフォリオとVTIの比較をするレポートをQuantStatsを使って作成します。
import numpy as np
import pandas as pd
import quantstats as qs
import yfinance as yf
qs.extend_pandas()
GOOG_returns = qs.utils.download_returns("GOOG", period="2y")
GOOG_returns.head(10)
qs.stats.sharpe(GOOG_returns)
qs.plots.snapshot(GOOG_returns, title="GOOG Performance")
qs.reports.html(GOOG_returns, "VTI", download_filename="GOOGとVTIの比較.html")
すべての銘柄を等しい割合で保有していた場合のリターンを、SP500と比較して見ます。
銘柄のオアフォーマンスを計算するには株価の変化率の系列が必要なので、pandas.DataFrame.pct_change
を用いて変化率の系列を求めています。
# ポートフォリオ内での各銘柄の比重
stock_dict = {
"MSFT": 0.3,
"AAPL": 0.3,
"AMZN": 0.2,
"GOOG": 0.1,
"TSLA": 0.1,
}
# 株価の系列
stock_prices_df = yf.download(
list(stock_dict.keys()), start="2021-01-01", end="2022-01-01", adjusted=True
).dropna()
stock_prices_df.head()
Adj Close | Close | ... | Open | Volume | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AAPL | AMZN | GOOG | MSFT | TSLA | AAPL | AMZN | GOOG | MSFT | TSLA | ... | AAPL | AMZN | GOOG | MSFT | TSLA | AAPL | AMZN | GOOG | MSFT | TSLA | |
Date | |||||||||||||||||||||
2020-12-31 | 131.333542 | 162.846497 | 87.594002 | 219.139343 | 235.223328 | 132.690002 | 162.846497 | 87.594002 | 222.419998 | 235.223328 | ... | 134.080002 | 163.750000 | 86.771004 | 221.699997 | 233.330002 | 99116600 | 59144000 | 20238000 | 20942100 | 148949700 |
2021-01-04 | 128.087051 | 159.331497 | 86.412003 | 214.479111 | 243.256668 | 129.410004 | 159.331497 | 86.412003 | 217.690002 | 243.256668 | ... | 133.520004 | 163.500000 | 87.876999 | 222.529999 | 239.820007 | 143301900 | 88228000 | 38038000 | 37130100 | 145914600 |
2021-01-05 | 129.670715 | 160.925507 | 87.045998 | 214.685989 | 245.036667 | 131.009995 | 160.925507 | 87.045998 | 217.899994 | 245.036667 | ... | 128.889999 | 158.300507 | 86.250000 | 217.259995 | 241.220001 | 97664900 | 53110000 | 22906000 | 23823000 | 96735600 |
2021-01-06 | 125.305786 | 156.919006 | 86.764503 | 209.119339 | 251.993332 | 126.599998 | 156.919006 | 86.764503 | 212.250000 | 251.993332 | ... | 127.720001 | 157.324005 | 85.131500 | 212.169998 | 252.830002 | 155088000 | 87896000 | 52042000 | 35930700 | 134100000 |
2021-01-07 | 129.581635 | 158.108002 | 89.362503 | 215.070267 | 272.013336 | 130.919998 | 158.108002 | 89.362503 | 218.289993 | 272.013336 | ... | 128.360001 | 157.850006 | 87.002998 | 214.039993 | 259.209991 | 109578200 | 70290000 | 45300000 | 27694500 | 154496700 |
5 rows × 30 columns
returns_df = stock_prices_df["Adj Close"].pct_change().dropna()
returns_df.head()
AAPL | AMZN | GOOG | MSFT | TSLA | |
---|---|---|---|---|---|
Date | |||||
2021-01-04 | -0.024719 | -0.021585 | -0.013494 | -0.021266 | 0.034152 |
2021-01-05 | 0.012364 | 0.010004 | 0.007337 | 0.000965 | 0.007317 |
2021-01-06 | -0.033662 | -0.024897 | -0.003234 | -0.025929 | 0.028390 |
2021-01-07 | 0.034123 | 0.007577 | 0.029943 | 0.028457 | 0.079447 |
2021-01-08 | 0.008631 | 0.006496 | 0.011168 | 0.006093 | 0.078403 |
5 rows × 5 columns
pf_returns = np.dot(list(stock_dict.values()), returns_df.T)
print(pf_returns[:10])
[-0.01530147 0.00900607 -0.01796814 0.02928912 0.0152212 -0.02670266
0.00147395 0.01133958 -0.01243583 -0.00920841]
pf_returns_series = pd.Series(pf_returns, index=returns_df.index)
pf_returns_series.head(10)
Date
2021-01-04 -0.015301
2021-01-05 0.009006
2021-01-06 -0.017968
2021-01-07 0.029289
2021-01-08 0.015221
2021-01-11 -0.026703
2021-01-12 0.001474
2021-01-13 0.011340
2021-01-14 -0.012436
2021-01-15 -0.009208
dtype: float64
qs.reports.html(pf_returns_series, "VTI", download_filename="ポートフォリオのパフォーマンス.html")