Optimize the portfolio.

[1]:
from mypo import Runner, Loader
from mypo.rebalancer import MonthlyRebalancer
from mypo.optimizer import NoOptimizer, MinimumVarianceOptimizer, SharpeRatioOptimizer, MaximumDiversificationOptimizer, RiskParityOptimizer
import matplotlib.pyplot as plt
[2]:
loader = Loader()
loader.get('VOO', 0.0003)
loader.get('EDV', 0.0007)
market = loader.get_market()
[3]:
optimizer = NoOptimizer(weights=[1, 0])
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)
)

runner.run(
    assets=[2.0, 0.0],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:25<00:00, 98.36it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]             1.122167      0.721441       0.711339

   max draw down span
0                 229
              return       std  sharpe ratio  draw down
2011-12-31  0.004281  0.232639     -0.067568   0.849871
2012-12-31  0.130682  0.103948      1.064780   0.922067
2013-12-31  0.219247  0.090754      2.195472   0.950295
2014-12-31  0.111791  0.092767      0.989482   0.938500
2015-12-31 -0.004456  0.128868     -0.189776   0.899746
2016-12-31  0.114280  0.107353      0.878225   0.890167
2017-12-31  0.174764  0.056116      2.757924   0.977677
2018-12-31 -0.045491  0.141795     -0.461866   0.834678
2019-12-31  0.258997  0.103284      2.313967   0.864255
2020-12-31  0.126400  0.280770      0.378958   0.711339
2021-12-31  0.186071  0.108099      1.536287   0.965026
../_images/tutorial_optimizer_3_2.png
../_images/tutorial_optimizer_3_3.png
[4]:
optimizer = MinimumVarianceOptimizer(do_re_optimize=True)
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)
)

runner.run(
    assets=[1.2, 0.8],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:28<00:00, 90.02it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]              1.09361       0.91739       0.858171

   max draw down span
0                 267
              return       std  sharpe ratio  draw down
2011-12-31  0.119474  0.106308      0.935716   0.944688
2012-12-31  0.093541  0.056119      1.310445   0.975900
2013-12-31  0.076363  0.070766      0.796479   0.936778
2014-12-31  0.183538  0.056310      2.904265   0.973047
2015-12-31 -0.020865  0.084095     -0.485935   0.918111
2016-12-31  0.061899  0.073751      0.568117   0.927127
2017-12-31  0.140918  0.042325      2.856932   0.949114
2018-12-31 -0.009143  0.079969     -0.364434   0.928295
2019-12-31  0.199236  0.065628      2.731094   0.954914
2020-12-31  0.090131  0.136301      0.514529   0.858171
2021-12-31  0.034581  0.085731      0.170081   0.904548
../_images/tutorial_optimizer_4_2.png
../_images/tutorial_optimizer_4_3.png
[5]:
optimizer = MinimumVarianceOptimizer(with_semi_covariance=True, do_re_optimize=True)
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)

)

runner.run(
    assets=[1.2, 0.8],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:28<00:00, 90.02it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]             1.087929      0.831618       0.860487

   max draw down span
0                 303
              return       std  sharpe ratio  draw down
2011-12-31  0.101935  0.109344      0.749331   0.934334
2012-12-31  0.096459  0.056511      1.353001   0.973694
2013-12-31  0.099814  0.070021      1.139858   0.938941
2014-12-31  0.174823  0.058746      2.635467   0.972519
2015-12-31 -0.024099  0.085342     -0.516729   0.913604
2016-12-31  0.054996  0.075220      0.465251   0.923940
2017-12-31  0.145810  0.043428      2.896978   0.945268
2018-12-31 -0.002676  0.080995     -0.279969   0.925272
2019-12-31  0.194977  0.072129      2.425907   0.955537
2020-12-31  0.058338  0.135502      0.282933   0.860487
2021-12-31  0.012397  0.089967     -0.084505   0.871236
../_images/tutorial_optimizer_5_2.png
../_images/tutorial_optimizer_5_3.png
[6]:
optimizer = SharpeRatioOptimizer(do_re_optimize=True)
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)
)

runner.run(
    assets=[1.2, 0.8],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:28<00:00, 89.49it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]             1.076261      0.543769       0.834547

   max draw down span
0                 356
              return       std  sharpe ratio  draw down
2011-12-31 -0.011870  0.174851     -0.182269   0.862750
2012-12-31  0.079848  0.059955      0.998218   0.938292
2013-12-31  0.157443  0.076727      1.791321   0.942330
2014-12-31  0.152063  0.074682      1.768329   0.954497
2015-12-31 -0.085150  0.106522     -0.987119   0.878547
2016-12-31  0.087099  0.110932      0.604870   0.876337
2017-12-31  0.168898  0.055917      2.662851   0.931631
2018-12-31 -0.065389  0.132801     -0.642984   0.834547
2019-12-31  0.227804  0.091586      2.268946   0.864147
2020-12-31  0.047596  0.139036      0.198478   0.857005
2021-12-31  0.060129  0.095735      0.419163   0.904145
../_images/tutorial_optimizer_6_2.png
../_images/tutorial_optimizer_6_3.png
[7]:
optimizer = MaximumDiversificationOptimizer(do_re_optimize=True)
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)
)

runner.run(
    assets=[1.2, 0.8],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:29<00:00, 88.15it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]             1.097104      0.973233       0.860672

   max draw down span
0                 259
              return       std  sharpe ratio  draw down
2011-12-31  0.140836  0.101429      1.191333   0.959363
2012-12-31  0.091821  0.057257      1.254353   0.975547
2013-12-31  0.063153  0.072105      0.598476   0.934230
2014-12-31  0.197220  0.055625      3.185969   0.974626
2015-12-31 -0.020343  0.083618     -0.482469   0.921480
2016-12-31  0.061061  0.074068      0.554360   0.921090
2017-12-31  0.135903  0.044091      2.628754   0.943999
2018-12-31 -0.013885  0.076654     -0.442053   0.930290
2019-12-31  0.200613  0.064145      2.815719   0.952952
2020-12-31  0.108962  0.133637      0.665701   0.860672
2021-12-31  0.041933  0.084919      0.258278   0.912403
../_images/tutorial_optimizer_7_2.png
../_images/tutorial_optimizer_7_3.png
[8]:
optimizer = RiskParityOptimizer(do_re_optimize=True)
runner = Runner(
    rebalancer=MonthlyRebalancer(optimizer=optimizer)
)

runner.run(
    assets=[1.2, 0.8],
    cash=0.5,
    market=market,
    train_span=200,
    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%|██████████| 2557/2557 [00:28<00:00, 89.54it/s]
      tickers  yearly total return  sharpe ratio  max draw down  \
0  [VOO, EDV]             1.097106      0.973265       0.860674

   max draw down span
0                 259
              return       std  sharpe ratio  draw down
2011-12-31  0.140837  0.101429      1.191344   0.959364
2012-12-31  0.091822  0.057257      1.254383   0.975549
2013-12-31  0.063155  0.072105      0.598503   0.934233
2014-12-31  0.197208  0.055624      3.185802   0.974626
2015-12-31 -0.020366  0.083620     -0.482732   0.921462
2016-12-31  0.061065  0.074068      0.554425   0.921093
2017-12-31  0.135912  0.044089      2.629078   0.944002
2018-12-31 -0.013875  0.076653     -0.441921   0.930308
2019-12-31  0.200604  0.064144      2.815611   0.952967
2020-12-31  0.108996  0.133633      0.665972   0.860674
2021-12-31  0.041933  0.084918      0.258282   0.912406
../_images/tutorial_optimizer_8_2.png
../_images/tutorial_optimizer_8_3.png