如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比)

一句话回答: 定投(DCA,定期定额)就是"每隔固定时间投入固定金额 "。用 AlphaFeed 取复权日线,模拟"每 N 个交易日买入固定金额"并和期初一次性全投对比,几十行就能回测------真实数据会告诉你:定投能摊平成本、降低择时风险,但在上涨行情里通常跑输一次性买入,它的价值在于纪律和风控,不是收益最大化。

为什么会有这个问题 / 传统做法的痛点

"定投微笑曲线""定投永远赚"的说法很流行,但很少有人真回测。要验证需解决:

  • 数据与复权:需要足够长的前复权日线,红利也应体现(前复权已含);
  • 定投规则:每隔固定交易日买固定金额,累积份额;
  • 正确的对比基准:应和"同样总投入一次性买入"比,而不是和不投比;
  • 收益口径:定投的收益要用"最终市值 / 累计投入 − 1",不能简单用价格涨幅。

AlphaFeed 提供长历史复权日线,把数据这关解决掉。

分步骤解决(每步配可运行代码)

第 1 步:定投回测

python 复制代码
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

def dca_backtest(symbol, count=500, every=20, amount=1000.0):
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
    invested, shares, buys = 0.0, 0.0, 0
    for i in range(0, len(df), every):        # 每 every 个交易日定额买入
        px = df["close"].iloc[i]
        shares += amount / px                 # 用固定金额买入,价低买得多
        invested += amount
        buys += 1
    final_value = shares * df["close"].iloc[-1]
    # 对比:把同样的总投入在期初一次性全买
    lump_shares = invested / df["close"].iloc[0]
    lump_value = lump_shares * df["close"].iloc[-1]
    return {"buys": buys, "invested": round(invested, 0),
            "dca_ret_%": round((final_value / invested - 1) * 100, 1),
            "lump_ret_%": round((lump_value / invested - 1) * 100, 1)}

定投参数:

参数 含义 本文取值
every 每隔多少交易日买一次 20(约每月)
amount 每次定额金额 1000
收益口径 最终市值/累计投入−1 ---
对比基准 同额期初一次性买入 lump sum

第 2 步:多标的对比(诚实看结果)

python 复制代码
for s in ["600519.SH", "000001.SZ", "600036.SH"]:
    print(s, dca_backtest(s))

实测(约 500 个交易日、每 20 日投 1000 元):

标的 定投次数 累计投入 定投收益 一次性收益 结论
贵州茅台 600519.SH 25 25000 −7.4% −2.7% 下跌区间定投也亏,但份额分散
平安银行 000001.SZ 25 25000 +8.3% +23.7% 上涨行情定投跑输一次性
招商银行 600036.SH 25 25000 +8.3% +32.5% 上涨行情大幅跑输一次性

结论很清楚 :在上涨行情里,一次性买入因为"资金更早到位、全程在场"而明显跑赢定投;定投则把资金分散投入,收益被摊薄。定投的意义不是收益更高,而是降低一次性买在高点的择时风险、强制纪律。

关键坑与注意事项

  • 定投≠收益更高:长期上涨的标的,一次性买入通常跑赢定投(资金更早在场)。定投的价值是分散择时风险、平滑体验,不是收益最大化。
  • 对比基准要公平:应和"同样总投入一次性买入"比。和"不投资"或"分批但总额不同"比都会得出误导结论。
  • 前复权含分红:用前复权价隐含了红利再投的近似;若要精确核算分红到账与再投时点,需更细致处理。
  • 标的选择更关键:定投能摊平成本,但摊的是"好资产的波动"。定投一个长期下跌的标的,摊平的是亏损,照样亏。
  • 成本与频率:本文未计手续费;过高频率的定投会增加交易成本,实务中月度/双周较常见。

常见问题(FAQ)

Q:既然定投常跑输一次性,为什么还要定投?

A:因为你事先不知道现在是高点还是低点。一次性买入若买在高点会很难受,定投用分批摊平成本、降低择时风险和情绪压力,更适合无法判断时点、持续有现金流(如工资)的投资者。

Q:定投指数还是个股?

A:定投更适合宽基指数/ETF:分散、长期向上概率高。定投单一个股要承担个股下行风险,摊平也救不了持续走弱的标的。

Q:这个回测能直接实盘吗?

A:它是教学级简化(未计手续费、按交易日间隔而非自然日、未处理停牌)。实盘前需按真实扣费、日期规则与标的完善。

Q:需要付费吗?

A:单只标的 500 根日线在免费额度内即可试;多标的/长历史批量需 Starter 及以上,详见 AlphaFeed 定价页。

小结

回测定投的价值,在于用真实数据看清定投的真面目:它靠分批摊平成本、降低择时风险,但在上涨行情里通常跑输一次性买入。AlphaFeed 提供长历史复权日线让你几十行完成定投 vs 一次性的对比------但请用公平基准、注意标的选择,别把"定投永远赚"当信仰。

参考

相关推荐
CodeGL4 小时前
10、Python基础之进程和线程
开发语言·python
刀笔财经4 小时前
万物构想让 AI 跑进真实生意里
人工智能
leobertlan4 小时前
杂篇 -- 拂拭念头、造器与自洽:AI 时代属于每个人的秩序
人工智能·程序员
AI_AGENT_DEV_AI4 小时前
AI 教培智能体的开发技术
人工智能
lazy熊5 小时前
Prompt 优化不是写得更长,而是把上下文分层给 AI
人工智能·prompt
甲维斯5 小时前
Kimi K3.1 Pro已测,国模终于来一个能打的 !?
人工智能
冬奇Lab5 小时前
一天一个开源项目(第246篇):rec —— Recursive 自研的本地推理引擎,在 Mac 上跑 Flint 编码模型,称比 llama.cpp 快 1.4–2.6 倍
人工智能·开源·llm
fxss5 小时前
认识闯关大冒险|十个关卡,带娃认全生活里的东西
人工智能
renhongxia15 小时前
边缘AI部署与大模型轻量化技术全景:量化、蒸馏、RAG 与智能体落地实战
大数据·人工智能
AI视频工具指南5 小时前
怎么用 AI 做悬疑短剧?
人工智能·aigc·音视频