云计算百科
云计算领域专业知识百科平台

【Python量化实战宝典 #29】基金定投、配置手册:定投回测与再平衡(Python 可跑)

【Python量化实战宝典 #29】基金定投、配置手册:定投回测与再平衡(Python 可跑)

手册定位:模块四第 5 篇。定投与配置是中长期资金的主战法——定投平滑成本、再平衡锁定比例。本篇讲怎么用 #07 的历史净值做定投回测与组合再平衡。
数据来源复用 #07 历史净值(/jh/hb/lsjz/{代码})。

1. 你将得到什么

  • 周/月定投 的回测代码(累计份额、平均成本、收益率);
  • 股债再平衡(固定比例、偏离阈值触发)的写法;
  • 定投 vs 一次性买入的对比思路;
  • 定投/配置的 4 个坑(净值日期、分红处理、再平衡频率、止盈)。

2. 取数约定(复用)

用途来源端点见
历史净值 /jh/hb/lsjz/{代码} #07
ETF/基金列表 /fund/list/etf #07

3. 数据来源(复用,不重复罗列)

详见 #07 基金行情与净值接口手册(历史净值端点)。

4. 核心模板函数(自包含可跑)

import pandas as pd
import numpy as np

_MOCK = True

def dca_backtest(nav_series, amount=1000, every=1):
"""nav_series: 单位净值序列(升序)。每 every 期投入 amount。返回总份额/成本/收益。"""
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):
"""固定比例再平衡:偏离 threshold 则调回目标权重。返回当前权重。"""
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 # 60/40 偏离>5% 需再平衡
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,定投回测要用实际交易日净值,别用未来日期。
  • 分红处理:累计净值含分红,定投要用「单位净值」并假设红利再投,口径统一。
  • 再平衡频率:月度再平衡摩擦低但偏离大,周度精细但成本高,常用季度。
  • 止盈:定投不止盈会坐过山车,可设目标收益(如 +30%)分批止盈。
  • 7. 小结与下一篇预告

    定投/配置给「中长期稳健」的资金管理。下一篇讲盘口与高频数据处理——逐笔/五档怎么用,进入短线/高频视角。

    下一篇预告:《【Python量化实战宝典 #30】盘口与高频数据处理手册:逐笔、五档怎么用(Python 可跑)》

    8. 免责声明

    本文为基金定投示例,演示数据为虚构,不构成投资建议。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Python量化实战宝典 #29】基金定投、配置手册:定投回测与再平衡(Python 可跑)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!