My Portfolio¶
[13]:
# If you would like to refresh your data, please execute the bellow codes.
import pandas as pd
import numpy as np
from datetime import datetime
from tqdm import tqdm
import matplotlib.pyplot as plt
from mypo import Loader
DOWNLOAD = False
if DOWNLOAD:
tickers = pd.read_csv("/app/docs/tutorial/tickers.csv")
loader = Loader()
for row in tqdm(tickers.to_dict('record')):
loader.get(row['Ticker'], expense_ratio=row['ExpenseRatio'] * 0.01)
loader.save('/app/docs/tutorial/all.bin')
loader = Loader.load('/app/docs/tutorial/all.bin')
loader = loader.since(datetime(2013, 1, 1))
market = loader.get_market()
selected_tickers = ['SPY', 'QQQ', 'IEF', 'TLT', 'GLD']
[20]:
from mypo import split_k_folds, select_by_regression
from mypo.optimizer import MaximumDiversificationOptimizer, MeanVarianceOptimizer, NoOptimizer, RiskParityOptimizer
from mypo.rebalancer import MonthlyRebalancer
from mypo import Runner
folds = split_k_folds(market, 1, 200)
fold = folds[0].filter(selected_tickers)
[20]:
['SPY', 'QQQ', 'IEF', 'TLT', 'GLD']
Reference Performance (SPY)¶
[15]:
optimizer = NoOptimizer([1, 0, 0, 0, 0])
runner = Runner(
rebalancer=MonthlyRebalancer(optimizer=optimizer),
)
runner.run(
fold=fold,
verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history().plot()
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_weights().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
100%|██████████| 1943/1943 [00:23<00:00, 81.77it/s]
tickers yearly total return sharpe ratio \
0 [GLD, QQQ, TLT, IEF, SPY] 1.135155 0.716741
max draw down max draw down span
0 0.684511 256


MeanVarianceOptimizer with cost tolerance¶
[6]:
optimizer = MeanVarianceOptimizer(risk_tolerance=0.1, cost_tolerance=10, do_re_optimize=True)
runner = Runner(
rebalancer=MonthlyRebalancer(optimizer=optimizer),
)
runner.run(
fold=fold,
verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history().plot()
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_weights().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
100%|██████████| 3416/3416 [00:49<00:00, 68.54it/s]
tickers yearly total return sharpe ratio max draw down \
0 [QQQ, GLD, SPY, TLT] 1.090436 0.714468 0.814318
max draw down span
0 482


MeanVarianceOptimizer with static weight.¶
[13]:
optimizer = MeanVarianceOptimizer(risk_tolerance=0.1)
runner = Runner(
rebalancer=MonthlyRebalancer(optimizer=optimizer),
)
runner.run(
fold=fold,
verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history().plot()
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_weights().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
100%|██████████| 3416/3416 [00:43<00:00, 78.59it/s]
tickers yearly total return sharpe ratio \
0 [IEF, QQQ, SPY, GLD, TLT] 1.098042 0.738705
max draw down max draw down span
0 0.72948 333


RiskParityOptimizer with static weight.¶
[3]:
optimizer = RiskParityOptimizer(risk_target=[0.2, 0.25, 0.2, 0.25, 0.1])
runner = Runner(
rebalancer=MonthlyRebalancer(optimizer=optimizer),
)
runner.run(
fold=fold,
verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history().plot()
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_weights().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
100%|██████████| 1943/1943 [00:24<00:00, 80.26it/s]
tickers yearly total return sharpe ratio \
0 [GLD, QQQ, TLT, IEF, SPY] 1.093135 1.076224
max draw down max draw down span
0 0.892061 215


[ ]: