跳至正文

定投优化策略与 Python 实现

定投优化策略与 Python 实现

核心思路

定投依然是核心,优化只是减少了购买次数。这种优化计算可以通过 Python 程序来实现。

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

原本的定投流程思路,可以参考上篇文章《量化现货定投Excel回测教程 – 以BTC日线为例》:https://www.indw.org/coin-circle-excel-backtesting/

优化策略的思路

  • 原始策略:每天固定金额买入。
  • 优化策略:判断当天买入的金额是否大于“平均持有成本”。
    • 如果 大于等于 平均持有成本:按照原本的金额买入。
    • 如果 小于 平均持有成本:证明价格下跌,加仓,双倍金额买入。

Python 代码实现

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())

程序说明

  • 读取数据:从 CSV 文件中读取 BTC 日线数据。
  • 初始化:创建用于保存数据的列。
  • 定投逻辑
    • 如果当前价格低于平均成本,投入金额为 6.0。
    • 如果当前价格高于或等于平均成本,投入金额为 3.0。
  • 计算盈亏与收益率:逐行计算并输出。

总结

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

本文内容为加密货币的基础科普,仅供学习与研究,非操作建议。请结合实际情况合理使用,并对内容的适用性自行判断。


如果有不懂的,可以在添加Discord好友进行讨论,Discord用户名:indwxyz
添加好友时,请说明来意,感谢配合!


免责声明:

本文所涉内容仅供学习与参考,包括但不限于科普信息、个人观点及实操记录。内容不构成任何形式的投资建议、法律建议或行为指导。
加密货币具有高度波动性及高风险性质,请根据自身风险承受能力和判断审慎决策。用户因使用本文内容或采取相关操作所导致的任何损失,均需自行承担责任。
请在合规和合法的前提下参与加密货币市场活动,并遵守您所在国家或地区的法律法规。

发表回复

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