Skip to main content

【算法】无脑定投指数基金的收益

· loading · loading ·
算法 Algorithm
Jinbo Pan
Author
Jinbo Pan
A Life Explorer
Table of Contents
投资有风险,入市需谨慎。

懒人的投资
#

懒人的投资方法是复利定投,难点在于找到真正平均每年回报率高的产品以及真正地付诸行动。

定期定额投资指数基金(简称“定投”)是一种受到广泛推崇的策略,特别是对于长期投资者。 定投指数基金的策略很简单:无论市场行情如何,投资者都在固定时间(如每月、每季)投入固定金额购买指数基金。 这种方法有助于“摊平”投资成本,因为在市场低迷时,同样的资金可以购买更多份额,而在市场高涨时则相反。 长期而言,这种策略能够有效降低投资的平均成本,提高投资回报的可能性。

很好奇定投到底能赚多少,所以决定写个简单的程序来看看到底能赚多少。

选了几个常见的指数基金:

  1. SPY: 标普500指数ETF,该指数成份股包括了美国500家顶尖上市公司,占美国股市总市值约80%。
  2. QQQ:纳斯达克100指数ETF,该指数包括了美国纳斯达克100支最大型本地及国际非金融类上市公司。
  3. SPXL: 3倍杠杆标普500指数ETF
  4. TQQQ:3倍纳斯达克100指数ETF

定投总投入与总收入
#

下图展示了从2014-05-12年开始到2024-05-04结束,10年时间,每15天投资500块美元,在交易日期的最高价买入, 每日的总资产按照每日最低价计算,投资不同的指数基金的总投入与总资产:

长远来看,这样的策略似乎是可行的。加杠杆收益大,风险也大,三倍杠杆的SPXL在2020年4月的时候甚至总资产低于总投入,但同时收益也可能更大,三倍杠杆的TQQQ 到2024年总资产高达68万,是总投入的接近6倍。

如果在高位开始定投呢?
#

如果在高位开始定投,会怎样呢?

下图以TQQQ为例,从2021年7月1日(股价高位)开始以同样的策略定投的总投入与总资产:

尽管定投可以减少市场波动的影响,但不同的入市时点仍然会对最终的投资收益产生重大影响。 如果在市场高点开始投资,则可能需要更长的时间来实现资本增值,投资初期都是亏钱,还是很考验心态的。

实操
#

所有这些分析都是基于历史数据,未来的市场走向存在不确定性。但感觉想偷懒,不想做太多功课,这个简单策略赚钱的几率还是挺大的。

代码
#

import pandas as pd

# history stock price is stored in stock_ticker.csv
file_name = 'tqqq'
file_path = file_name + '.csv'
data = pd.read_csv(file_path)
data['Date'] = pd.to_datetime(data['Date'])
data = data.sort_values(by='Date')

total_investment = 0
total_shares = 0
interval_days = 15
investment_amount = 500
start_date = data['Date'].min()
results = pd.DataFrame(columns=['Date', 'Total Shares', 'Total Cost', 'Total Value', 'Total Return'])

# Iterate over the dataframe by interval
for current_date in pd.date_range(start=start_date, end=data['Date'].max(), freq=f'{interval_days}D'):
    # Find the row with the current date or the closest previous date
    if not data[data['Date'] <= current_date].empty:
        row = data[data['Date'] <= current_date].iloc[-1]
        investment_price = row['High']  # Get the high price for the date

        # Calculate the number of shares to buy
        shares_bought = investment_amount / investment_price

        # Update total shares and investment
        total_shares += shares_bought
        total_investment += investment_amount

        # Calculate current total value using the low price of the most recent date
        current_total_value = total_shares * row['Low']

        # Prepare new row to add to the results DataFrame
        new_row = pd.DataFrame({
            'Date': [row['Date']],
            'Total Shares': [total_shares],
            'Total Cost': [total_investment],
            'Total Value': [current_total_value],
            'Total Return': [current_total_value - total_investment]
        })

        # Append new row to results DataFrame
        results = pd.concat([results, new_row], ignore_index=True)

print(results)