World Balanced Portfolio

[5]:
# 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 split_k_folds, select_by_regression
from mypo.optimizer import RiskParityOptimizer
from mypo.rebalancer import MonthlyRebalancer
from mypo.evacuator import FixedEvacuator
from mypo import Runner

from mypo import Loader

DOWNLOAD = False

if DOWNLOAD:
    loader = Loader()
    loader.get('VTI', 0.05 * 10e-3) # market

    loader.get('VB', 0.08 * 10e-3) # size

    loader.get('VTX', 0.08 * 10e-3) # value

    loader.get('VBR', 0.08 * 10e-3) # size - value

    loader.get('MTUM', 0.15 * 10e-3) # momentum

    loader.get('QUAL', 0.15 * 10e-3) # quality

    loader.get('IEF', 0.15 * 10e-3)


    loader.get('DBV', 0.76 * 10e-3) # carry

    loader.get('SPY', 0.09 * 10e-3)
    loader.get('TLT', 0.15 * 10e-3)
    loader.get('GLD', 0.4 * 10e-3)
    loader.save('/app/docs/tutorial/factor_portfolio.bin')

loader = Loader.load('/app/docs/tutorial/factor_portfolio.bin')
factor_market = loader.filter(['VTI', 'VBR', 'MTUM', 'QUAL', 'TLT', 'DBV']).get_market()
us_market = loader.filter(['SPY', 'IEF', 'TLT', 'GLD']).get_market()

Factor Investement

[6]:
corr = factor_market.get_rate_of_change().corr()

plt.figure()
plt.imshow(corr,interpolation='nearest',vmin=-1,vmax=1,cmap='viridis')
plt.colorbar()
plt.show()

corr
../_images/tutorial_factor_investment_3_0.png
[6]:
VTI VBR MTUM QUAL TLT DBV
VTI 1.000000 0.899456 0.912506 0.978668 -0.369992 0.326423
VBR 0.899456 1.000000 0.725450 0.862737 -0.372436 0.359811
MTUM 0.912506 0.725450 1.000000 0.895919 -0.270928 0.258185
QUAL 0.978668 0.862737 0.895919 1.000000 -0.367195 0.307280
TLT -0.369992 -0.372436 -0.270928 -0.367195 1.000000 -0.096827
DBV 0.326423 0.359811 0.258185 0.307280 -0.096827 1.000000
[2]:
folds = split_k_folds(factor_market, 1, 200)
fold = folds[0]

optimizer = RiskParityOptimizer()
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer, evacuator=FixedEvacuator(level=0.05)),
)

runner.run(
    fold=fold,
    verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history_assets().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()
ax = report.history_cost().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_cash_vs_assets().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()

100%|██████████| 1842/1842 [00:25<00:00, 73.60it/s]
tickers yearly total return sharpe ratio max draw down max draw down span
0 [VTI, VBR, MTUM, QUAL, TLT, DBV] 1.076783 0.697602 0.815822 303
return std sharpe ratio draw down
2014-12-31 0.079350 0.051691 1.148168 0.966899
2015-12-31 -0.025128 0.075611 -0.596849 0.914493
2016-12-31 0.083227 0.064894 0.974306 0.921371
2017-12-31 0.094777 0.041735 1.791732 0.979006
2018-12-31 -0.029026 0.079609 -0.615840 0.907386
2019-12-31 0.174661 0.055071 2.808378 0.927131
2020-12-31 0.122672 0.147573 0.695735 0.815822
2021-12-31 0.074766 0.077737 0.704503 0.962382
../_images/tutorial_factor_investment_4_3.png
../_images/tutorial_factor_investment_4_4.png
../_images/tutorial_factor_investment_4_5.png
../_images/tutorial_factor_investment_4_6.png

Traditonal Asset Class

[7]:
corr = us_market.get_rate_of_change().corr()

plt.figure()
plt.imshow(corr,interpolation='nearest',vmin=-1,vmax=1,cmap='viridis')
plt.colorbar()
plt.show()

corr
../_images/tutorial_factor_investment_6_0.png
[7]:
SPY IEF TLT GLD
SPY 1.000000 -0.401425 -0.412393 0.042148
IEF -0.401425 1.000000 0.910479 0.171212
TLT -0.412393 0.910479 1.000000 0.137708
GLD 0.042148 0.171212 0.137708 1.000000
[3]:
folds = split_k_folds(us_market, 1, 200)
fold = folds[0]

optimizer = RiskParityOptimizer(risk_target=[0.85, 0.05, 0.05, 0.05])
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer, evacuator=FixedEvacuator(level=0.05)),
)

runner.run(
    fold=fold,
    verbose=True
)
report = runner.report()
display(report.summary())
display(report.annual_summary())
ax = report.history_assets().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()
ax = report.history_cost().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()
ax = report.history_cash_vs_assets().plot.area(stacked=True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.show()


100%|██████████| 4021/4021 [00:49<00:00, 80.49it/s]
tickers yearly total return sharpe ratio max draw down max draw down span
0 [SPY, IEF, TLT, GLD] 1.08535 0.612311 0.690173 725
return std sharpe ratio draw down
2005-12-31 0.038527 0.065600 0.282424 0.967056
2006-12-31 0.099910 0.069779 1.145188 0.934181
2007-12-31 0.091324 0.093349 0.764063 0.951485
2008-12-31 -0.166027 0.210794 -0.882507 0.708218
2009-12-31 0.143934 0.148219 0.836153 0.690173
2010-12-31 0.134603 0.096308 1.189962 0.907491
2011-12-31 0.085352 0.112998 0.578347 0.927817
2012-12-31 0.110067 0.070698 1.273962 0.957250
2013-12-31 0.080048 0.073903 0.812523 0.943075
2014-12-31 0.114662 0.059627 1.587555 0.960703
2015-12-31 -0.014895 0.085806 -0.406674 0.927119
2016-12-31 0.092692 0.068092 1.067567 0.928556
2017-12-31 0.146133 0.039275 3.211535 0.982981
2018-12-31 -0.033733 0.094302 -0.569793 0.895115
2019-12-31 0.235172 0.066241 3.248323 0.922280
2020-12-31 0.165120 0.181476 0.799664 0.809834
2021-12-31 0.100322 0.085622 0.938092 0.957415
../_images/tutorial_factor_investment_7_3.png
../_images/tutorial_factor_investment_7_4.png
../_images/tutorial_factor_investment_7_5.png
../_images/tutorial_factor_investment_7_6.png