跳至正文

定投优化策略与 Python 实现

核心思路

定投依然是核心,优化只是增加了购买金额。这种优化计算可以通过 Python 程序来实现。

 

虽然 Excel 表格应该也能实现这种计算,但我已经习惯用 Python 程序来做回测,因为更加灵活与高效。

 

优化策略的思路

  • 原始策略:每天固定金额买入。
  • 优化策略:判断当天买入的金额是否大于“平均持有成本”。

如果“大于等于” 平均持有成本:按照原本的金额买入。

如果 “小于” 平均持有成本:证明价格下跌,加仓,双倍金额买入。


Python 代码实现:

源代码(.py文件):优化定投.zip

import pandas as pd

 

# 设置 pandas 显示选项
pd.set_option(‘expand_frame_repr’, False)

 

# ===读取数据
df = pd.read_csv(‘C:/indwxyz/pythonProject/Reference_Documents/HUICE/btc_usdt_1D_2025_0123.csv’)
df = df[[‘candle_begin_time’, ‘close’]] # 只保留时间和收盘价

 

# ===确保时间列为日期格式
df[‘candle_begin_time’] = pd.to_datetime(df[‘candle_begin_time’])

 

# ===按时间升序排序并重置索引
df = df.sort_values(by=’candle_begin_time’, ascending=True).reset_index(drop=True)

 

# ===选取特定时间段
df = df[(df[‘candle_begin_time’] >= ‘2021-11-10’) & (df[‘candle_begin_time’] <= ‘2024-03-08’)]

 

# ===重置索引以确保索引连续
df = df.reset_index(drop=True)

 

# ===初始化资金和数量
df[‘每次投入资金’] = 0.0
df[‘累计投入资金’] = 0.0
df[‘每次买币数量’] = 0.0
df[‘累计买币数量’] = 0.0
df[‘平均持有成本’] = 0.0
df[‘市值’] = 0.0

 

# ===设置手续费
c_rate = 0.008

 

# ===逐行计算定投逻辑
for i in range(len(df)): # 使用连续索引迭代
current_price = df.loc[i, ‘close’]
if i == 0:
investment = 3.0 # 初始投资金额
quantity = investment / current_price * (1 – c_rate)

df.loc[i, ‘每次投入资金’] = investment
df.loc[i, ‘累计投入资金’] = investment
df.loc[i, ‘每次买币数量’] = quantity
df.loc[i, ‘累计买币数量’] = quantity
df.loc[i, ‘平均持有成本’] = investment / quantity
else:
prev_total_investment = df.loc[i – 1, ‘累计投入资金’]
prev_total_quantity = df.loc[i – 1, ‘累计买币数量’]
avg_cost = df.loc[i – 1, ‘平均持有成本’]

investment = 6.0 if current_price < avg_cost else 3.0
quantity = investment / current_price * (1 – c_rate)

df.loc[i, ‘每次投入资金’] = investment
df.loc[i, ‘累计投入资金’] = prev_total_investment + investment
df.loc[i, ‘每次买币数量’] = quantity
df.loc[i, ‘累计买币数量’] = prev_total_quantity + quantity
df.loc[i, ‘平均持有成本’] = (prev_total_investment + investment) / (prev_total_quantity + quantity)

df.loc[i, ‘市值’] = df.loc[i, ‘累计买币数量’] * current_price

 

# ===计算盈亏和收益率
df[‘盈亏’] = df[‘市值’] – df[‘累计投入资金’]
df[‘收益率’] = df[‘盈亏’] / df[‘累计投入资金’]

 

# ===输出数据
print(df[[‘candle_begin_time’, ‘close’, ‘每次投入资金’, ‘累计投入资金’, ‘每次买币数量’, ‘累计买币数量’, ‘平均持有成本’, ‘市值’, ‘盈亏’, ‘收益率’]])
print(df[‘收益率’].max())

温馨提示

因为排版问题,上面显示的代码有缩进问题,直接复制粘贴运行会报错。

可以直接下载压缩包解压,上面的压缩包才是能直接拿着就用的。

密码是简体中文,可以用360压缩,勾上显示密码就可以输入。

 

解压密码:答案创想

程序说明

读取数据:从 CSV 文件中读取 BTC 日线数据。
初始化:创建用于保存数据的列。

 

定投逻辑:

  • 如果当前价格低于平均成本,投入金额为 6.0。
  • 如果当前价格高于或等于平均成本,投入金额为 3.0。
  • 计算盈亏与收益率:逐行计算并输出。

总结

通过这种方式,可以在价格下跌时增加购买力度,从而在后续反弹时获得更好的收益。

📬 联系方式

  • Telegram:indwxyz
  • Discord:indworg

    ⚠️ Discord的用户名非唯一标识,请务必辨别真实身份。本人不会私下联系要求任何操作或资产转账。

⚠️ 免责声明:

本文内容仅供学习与参考,包括交易、工具使用、空投、科普及宏观信息分析等,不构成投资或操作建议。完整免责声明请查看:[免责声明]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注