Lazy Portfolio, Is It Profitable?
Python backtesting of the Lazy Portfolio
It’s important to note that a investment strategy may not be suitable for every investor. Individuals should consider their financial goals, risk tolerance, and time horizon before implementing any investment approach. Consulting with a financial advisor can help tailor the strategy to individual needs and circumstances.
Lazy Portfolio
The Lazy Portfolio is an investment strategy that emphasizes simplicity and minimal effort. It is designed for long-term investors who prefer a hands-off approach to managing their portfolios. If you don’t want to be constantly monitoring your portfolio, this is your strategy.
The strategy’s core principle is to create a diversified portfolio with a few low-cost index funds or exchange-traded funds (ETFs) and maintain a consistent allocation over time. The goal of the Lazy Portfolio is to achieve market returns with minimal time and effort spent on active management.
For instance, a common Lazy Portfolio might include a domestic stock market fund, a bond fund, and an international stock market fund. The specific allocation to each asset class may vary depending on the investor’s risk tolerance and financial goals.
One of the key advantages of the Lazy Portfolio is its simplicity. By investing in a handful of index funds, investors can achieve instant diversification across thousands of securities. This diversification helps to reduce the overall risk of the portfolio and provides exposure to various market segments.
Another advantage is the low cost associated with the Lazy Portfolio. Index funds and ETFs are known for their low expense ratios compared to actively managed funds. By minimizing expenses, more of the investment returns can be retained by the investor, potentially leading to higher long-term performance.
Furthermore, the Lazy Portfolio promotes a passive investment approach, which means there is no need for frequent buying or selling of securities. Instead, the investor periodically rebalances the portfolio to maintain the desired asset allocation. Rebalancing involves adjusting the portfolio back to its original target allocation, which ensures that gains are taken from outperforming assets and reinvested in underperforming assets. This process helps to maintain the desired risk level and avoids letting any single asset class dominate the portfolio’s performance.
However, it’s important to note that the Lazy Portfolio may not be suitable for everyone. Investors with specific goals or unique circumstances may require a more customized approach. Additionally, market conditions and individual preferences can vary, so it’s crucial to assess one’s risk tolerance and consult with a financial advisor when considering any investment strategy.
Python simulation
Backtesting of this strategy may be done in Python. In this case, we will backtest one of the most simple Lazy Portfolio, which consist of:
- A domestic index fund. In this case, we will focus on the US zone, so this fund may be used for this (Vanguard Total Stock Market Index Fund (VTSAX))
- An international index fund, as this Vanguard Total International Stock Index Fund Admiral Shares (VTIAX).
- A Bonda Market intex. The Vanguard Total Bond Market Index Fund (VBTLX) will be taken into account for this part.
The portfolio allocation is 34% for VTSAX, 33% for VTIAS and 33% for VBTLX.
To get historical data for these three funds, we can use the yfinance library to obtain the value of the assets. This code get data for the last 10 years and plot the evolution of the three funds.
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Gather data for DOMESTIC, bonds, INTERNATIONAL and cash
period = "10y"
DOMESTIC = yf.Ticker("VTSAX").history(period=period)
DOMESTIC = DOMESTIC.drop(columns=['Dividends', 'Stock Splits'])
plt.plot(DOMESTIC['Close']/DOMESTIC['Close'][0])
BONDS = yf.Ticker("VBTLX").history(period=period)
BONDS = BONDS.drop(columns=['Dividends', 'Stock Splits'])
plt.plot(BONDS['Close']/BONDS['Close'][0])
INTERNATIONAL = yf.Ticker("VTIAX").history(period=period)
INTERNATIONAL = INTERNATIONAL.drop(columns=['Dividends', 'Stock Splits'])
plt.plot(INTERNATIONAL['Close']/INTERNATIONAL['Close'][0])The following figure shows the evolution of the funds for the last ten years. Values have been normalized to the initial value in order to compare all the funds in the same graph:

Python simulations may be used to evaluate the return on investment for this strategy. The following code set the allocation of each asset and every day compute the weight of the assets. Balancing is carried out at the beginning of the year, to establish assets allocation to the portfolio goal. Finally, returns are computed and storage for analysis purposes.
DOMESTIC_weigth = np.array([0.34])
INTERNATIONAL_weigth = np.array([0.33])
BONDS_weigth = np.array([0.33])
result = np.array([1])
DOMESTIC_shares = np.array(result*DOMESTIC_weigth[0]/DOMESTIC['Close'][0])
INTERNATIONAL_shares = np.array(result*INTERNATIONAL_weigth[0]/INTERNATIONAL['Close'][0])
BONDS_shares = np.array(result*BONDS_weigth[0]/BONDS['Close'][0])
for i in range(1,len(BONDS['Close'])):
# Daily results computation
result = np.append(result, DOMESTIC_shares[i-1]*DOMESTIC['Close'][i] +
INTERNATIONAL_shares[i-1]*INTERNATIONAL['Close'][i] +
BONDS_shares[i-1]*BONDS['Close'][i])
# Daily weitgh computation
DOMESTIC_weigth = np.append(DOMESTIC_weigth, DOMESTIC_shares[i-1]*DOMESTIC['Close'][i]/result[i])
INTERNATIONAL_weigth = np.append(INTERNATIONAL_weigth, INTERNATIONAL_shares[i-1]*INTERNATIONAL['Close'][i]/result[i])
BONDS_weigth = np.append(BONDS_weigth, BONDS_shares[i-1]*BONDS['Close'][i]/result[i])
# Check if we need to rebalance the assets
if BONDS.index[i].year > BONDS.index[i-1].year:
# Rebalancing
DOMESTIC_shares = np.append(DOMESTIC_shares, DOMESTIC_shares[i-1]-(DOMESTIC_weigth[i]-DOMESTIC_weigth[0])*result[i]/DOMESTIC['Close'][i])
INTERNATIONAL_shares = np.append(INTERNATIONAL_shares, INTERNATIONAL_shares[i-1]-(INTERNATIONAL_weigth[i]-INTERNATIONAL_weigth[0])*result[i]/INTERNATIONAL['Close'][i])
BONDS_shares = np.append(BONDS_shares, BONDS_shares[i-1]-(BONDS_weigth[i]-BONDS_weigth[0])*result[i]/BONDS['Close'][i])
else:
# No rebalancing
DOMESTIC_shares = np.append(DOMESTIC_shares, DOMESTIC_shares[i-1])
INTERNATIONAL_shares = np.append(INTERNATIONAL_shares, INTERNATIONAL_shares[i-1])
BONDS_shares = np.append(BONDS_shares, BONDS_shares[i-1])The result for the lazy portfolio for the last 10 years is:

Conclusions
This article presented a Python code to backtest the lazy portfolio. Returns for this strategy are lower than the obtained by the VTSAX fund. However, the Lazy Portfolio has experienced smaller downturns over the past 10 years due to its diversified nature. What do you think? Would you stand deeper downturns to get a higher performance? Leave a comment with your opinion!
Furthermore, the Python code may be used to evaluate any kind of portfolio, you just have to change the assets you are interested in and adjust the weight for rebalancing.
Do you want to learn Python:
Have you spent your learning budget for this month, you can join Medium here:




