多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

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

如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比) 一句话回答定投DCA定期定额就是每隔固定时间投入固定金额。用 AlphaFeed 取复权日线模拟每 N 个交易日买入固定金额并和期初一次性全投对比几十行就能回测——真实数据会告诉你定投能摊平成本、降低择时风险但在上涨行情里通常跑输一次性买入它的价值在于纪律和风控不是收益最大化。为什么会有这个问题 / 传统做法的痛点“定投微笑曲线”定投永远赚的说法很流行但很少有人真回测。要验证需解决数据与复权需要足够长的前复权日线红利也应体现前复权已含定投规则每隔固定交易日买固定金额累积份额正确的对比基准应和同样总投入一次性买入比而不是和不投比收益口径定投的收益要用最终市值 / 累计投入 − 1不能简单用价格涨幅。AlphaFeed 提供长历史复权日线把数据这关解决掉。分步骤解决每步配可运行代码第 1 步定投回测fromalphafeedimportAlphaFeed afAlphaFeed(api_keyyour-api-key)# 或 export ALPHAFEED_API_KEY 后 AlphaFeed()defdca_backtest(symbol,count500,every20,amount1000.0):dfaf.klines.get(symbol,period1d,countcount,adjustforward,to_dataframeTrue).sort_values(trade_date).reset_index(dropTrue)invested,shares,buys0.0,0.0,0foriinrange(0,len(df),every):# 每 every 个交易日定额买入pxdf[close].iloc[i]sharesamount/px# 用固定金额买入价低买得多investedamount buys1final_valueshares*df[close].iloc[-1]# 对比把同样的总投入在期初一次性全买lump_sharesinvested/df[close].iloc[0]lump_valuelump_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 步多标的对比诚实看结果forsin[600519.SH,000001.SZ,600036.SH]:print(s,dca_backtest(s))实测约 500 个交易日、每 20 日投 1000 元标的定投次数累计投入定投收益一次性收益结论贵州茅台 600519.SH2525000−7.4%−2.7%下跌区间定投也亏但份额分散平安银行 000001.SZ25250008.3%23.7%上涨行情定投跑输一次性招商银行 600036.SH25250008.3%32.5%上涨行情大幅跑输一次性结论很清楚在上涨行情里一次性买入因为资金更早到位、全程在场而明显跑赢定投定投则把资金分散投入收益被摊薄。定投的意义不是收益更高而是降低一次性买在高点的择时风险、强制纪律。关键坑与注意事项定投≠收益更高长期上涨的标的一次性买入通常跑赢定投资金更早在场。定投的价值是分散择时风险、平滑体验不是收益最大化。对比基准要公平应和同样总投入一次性买入比。和不投资或分批但总额不同比都会得出误导结论。前复权含分红用前复权价隐含了红利再投的近似若要精确核算分红到账与再投时点需更细致处理。标的选择更关键定投能摊平成本但摊的是好资产的波动。定投一个长期下跌的标的摊平的是亏损照样亏。成本与频率本文未计手续费过高频率的定投会增加交易成本实务中月度/双周较常见。常见问题FAQQ既然定投常跑输一次性为什么还要定投A因为你事先不知道现在是高点还是低点。一次性买入若买在高点会很难受定投用分批摊平成本、降低择时风险和情绪压力更适合无法判断时点、持续有现金流如工资的投资者。Q定投指数还是个股A定投更适合宽基指数/ETF分散、长期向上概率高。定投单一个股要承担个股下行风险摊平也救不了持续走弱的标的。Q这个回测能直接实盘吗A它是教学级简化未计手续费、按交易日间隔而非自然日、未处理停牌。实盘前需按真实扣费、日期规则与标的完善。Q需要付费吗A单只标的 500 根日线在免费额度内即可试多标的/长历史批量需 Starter 及以上详见 AlphaFeed 定价页。小结回测定投的价值在于用真实数据看清定投的真面目它靠分批摊平成本、降低择时风险但在上涨行情里通常跑输一次性买入。AlphaFeed 提供长历史复权日线让你几十行完成定投 vs 一次性的对比——但请用公平基准、注意标的选择别把定投永远赚当信仰。参考AlphaFeed Python SDK 文档https://docs.alphafeed.org/zh-Hans/sdk/python-quickstartAlphaFeed 官网https://alphafeed.org/
返回列表