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
../_images/tutorial_my_portfolio_4_2.png
../_images/tutorial_my_portfolio_4_3.png

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
../_images/tutorial_my_portfolio_6_2.png
../_images/tutorial_my_portfolio_6_3.png

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
../_images/tutorial_my_portfolio_8_2.png
../_images/tutorial_my_portfolio_8_3.png

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
../_images/tutorial_my_portfolio_10_2.png
../_images/tutorial_my_portfolio_10_3.png
[ ]: