Quantstats

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()

VTIと特定の銘柄の比較レポート

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")

png

複数銘柄のパフォーマンス比較レポート

すべての銘柄を等しい割合で保有していた場合のリターンを、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 CloseClose...OpenVolume
AAPLAMZNGOOGMSFTTSLAAAPLAMZNGOOGMSFTTSLA...AAPLAMZNGOOGMSFTTSLAAAPLAMZNGOOGMSFTTSLA
Date
2020-12-31131.333542162.84649787.594002219.139343235.223328132.690002162.84649787.594002222.419998235.223328...134.080002163.75000086.771004221.699997233.33000299116600591440002023800020942100148949700
2021-01-04128.087051159.33149786.412003214.479111243.256668129.410004159.33149786.412003217.690002243.256668...133.520004163.50000087.876999222.529999239.820007143301900882280003803800037130100145914600
2021-01-05129.670715160.92550787.045998214.685989245.036667131.009995160.92550787.045998217.899994245.036667...128.889999158.30050786.250000217.259995241.2200019766490053110000229060002382300096735600
2021-01-06125.305786156.91900686.764503209.119339251.993332126.599998156.91900686.764503212.250000251.993332...127.720001157.32400585.131500212.169998252.830002155088000878960005204200035930700134100000
2021-01-07129.581635158.10800289.362503215.070267272.013336130.919998158.10800289.362503218.289993272.013336...128.360001157.85000687.002998214.039993259.209991109578200702900004530000027694500154496700

5 rows × 30 columns

returns_df = stock_prices_df["Adj Close"].pct_change().dropna()
returns_df.head()
AAPLAMZNGOOGMSFTTSLA
Date
2021-01-04-0.024719-0.021585-0.013494-0.0212660.034152
2021-01-050.0123640.0100040.0073370.0009650.007317
2021-01-06-0.033662-0.024897-0.003234-0.0259290.028390
2021-01-070.0341230.0075770.0299430.0284570.079447
2021-01-080.0086310.0064960.0111680.0060930.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")