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