【Python量化实战全攻略 #29】基金定投、配置手册:定投回测与再平衡(附代码)
摘要:【Python量化实战全攻略 #29】基金定投、配置手册:定投回测与再平衡(附代码) 手册定位:模块四第 5 篇。定投与配置是中长期资金的主战法——定投平滑成本、再平衡锁定比例。本篇讲怎么用 #07 的历史净值做定投
手册定位:模块四第 5 篇。定投与配置是中长期资金的主战法——定投平滑成本、再平衡锁定比例。本篇讲怎么用 #07 的历史净值做定投回测与组合再平衡。
数据来源复用 #07 历史净值(/jh/hb/lsjz/{代码})。
1. 你将得到什么
- 周/月定投 的回测代码(累计份额、平均成本、收益率);
- 股债再平衡(固定比例、偏离阈值触发)的写法;
- 定投 vs 一次性买入的对比思路;
- 定投/配置的 4 个坑(净值日期、分红处理、再平衡频率、止盈)。
2. 取数约定(复用)
| 用途 | 来源端点 | 见 |
|---|---|---|
| 历史净值 | /jh/hb/lsjz/{代码} |
#07 |
3. 数据来源(复用,不重复罗列)
详见 #07 基金行情与净值接口手册(历史净值端点)。
4. 核心模板函数(自包含可跑)
import pandas as pd
import numpy as np
_MOCK = True
def dca_backtest(nav_series, amount=1000, every=1):
s = pd.Series(nav_series)
shares = 0.0
cost = 0.0
for i in range(0, len(s), every):
shares += amount / s.iloc[i]
cost += amount
value = shares * s.iloc[-1]
return {"份额": shares, "成本": cost, "市值": value, "收益率": value / cost - 1}
def rebalance(weights, navs, threshold=0.05):
values = np.array(navs)
total = values.sum()
cur = values / total
need_rebalance = np.any(np.abs(cur - np.array(weights)) > threshold)
return cur, need_rebalance
def run_check():
nav = [1.00, 1.02, 0.98, 1.05, 1.10, 1.08, 1.15]
r = dca_backtest(nav, amount=1000, every=1)
assert r["收益率"] > 0 and r["份额"] > 0
cur, reb = rebalance([0.5, 0.5], [1200, 800], threshold=0.05)
assert reb
print("校验通过 | 定投收益率=%.2f%% 再平衡触发=%s" % (r["收益率"] * 100, reb))
return r
if __name__ == "__main__":
run_check()
5. 跑通示例
r = run_check()
print("定投结果:", {k: round(v, 3) for k, v in r.items()})
6. 坑与注意事项
- 净值日期:历史净值 T+1,定投回测要用实际交易日净值。
- 分红处理:定投要用「单位净值」并假设红利再投,口径统一。
- 再平衡频率:月度摩擦低但偏离大,周度精细但成本高,常用季度。
- 止盈:定投不止盈会坐过山车,可设目标收益分批止盈。
7. 小结与下一篇预告
定投/配置给「中长期稳健」的资金管理。下一篇讲盘口与高频数据处理——逐笔/五档怎么用。
下一篇预告:《【Python量化实战全攻略 #30】盘口与高频数据处理手册:逐笔、五档怎么用(附代码)》
8. 免责声明
本文为基金定投示例,演示数据为虚构,不构成投资建议。
关于数据来源:本文定投所需的净值数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #07),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲盘口高频。
想亲自试一下?免费获取证书