基金定投计算器(国内公募基金)
这个技能做什么
对用户自己给的定投金额、频率、净值做算术:
- 逐期明细:每期扣款、申购费、买到的份额、累计份额、平均成本、当期持仓收益率。
- 汇总:累计投入、累计份额、平均成本(含申购费)、持仓市值、定投收益率、资金加权年化(和 Excel 里 XIRR 函数一样的算法);再算一遍「估值日全部赎回」扣掉赎回费后的到手金额和收益率。
- 赎回费:每一期买到的份额按各自持有天数分档收,持有不到 7 天的单独点出来。
- 和一次性投入对比:同样的总金额在第一期一次投入,同样的申购费、赎回费,比收益和年化。
- 目标止盈演示(可选):每期扣款后看这一轮收益率,达到目标就全部赎回,之后重新定投或不再投,和一直定投对比。只是算术演示,不代表应该止盈。
- 没有真实净值时,可以只给起止净值,按「匀速变化」「先跌后涨」「先涨后跌」假设一条路径来演示。
数字一律来自脚本输出,不要心算。
这个技能不做什么
- 不联网,不拉任何基金净值;净值全部由用户提供,或者由用户指定的假设路径生成(输出里会注明是假设)。
- 不推荐基金,不评价哪只基金好,不预测净值走势。
- 不给买卖建议:用户问「该不该定投」「该不该止盈」「现在该赎回吗」,回答:这个工具只算账,怎么做由你自己决定;然后把几种做法的数字都算给他看。
- 不承诺收益:不说「坚持定投一定赚钱」「微笑曲线一定回本」。
- 只面向国内公募基金(场外申购赎回)。境外基金、QDII 的汇率、场内 ETF 买卖佣金不在范围内。
现行口径(核对日期 2026-09-25,出处见 references/rules-sources.md)
| 项目 | 默认 | 能不能改 |
|---|---|---|
| 申购费率 | 0.15%(原费率 1.5% 打一折) | 能,按销售平台显示的实际费率;C 类份额不收申购费就写 0 |
| 申购费算法 | 外扣法:净申购金额等于申购金额除以「一加申购费率」,申购费是两者之差,份额等于净申购金额除以当期净值 | 不改 |
| 份额小数 | 保留 2 位,四舍五入 | 能,按基金合同 |
| 赎回费 | 持有不足 7 天 1.5%;满 7 天不足 30 天 1%;满 30 天不足 180 天 0.5%;满 180 天 0 | 能,按招募说明书;上面三档是证监会规定的最低标准,基金可以收得更高 |
- 持有天数按每一期扣款日到估值日的自然日算。实际以份额确认日起算,结果可能差一两天,以基金公司确认单为准。
- 2026 年起证监会把申购费上限降到:主动偏股型 0.8%、其他混合型 0.5%、指数型和债券型 0.3%,老基金 2026 年底前调整完。用户说的原费率超过这些上限时,照用户说的算,但提醒他以销售平台现在显示的为准。
- 个人持有满 7 天的指数基金、债券基金,基金公司可以另定赎回费;货币基金、ETF、同业存单基金也可以另定。这些情况请用户按招募说明书给分档。
用户说大白话 → 你翻成命令
脚本路径:{baseDir}/scripts/fund_dca.py。不要让用户记参数,由你从对话里取数。
| 用户这样说 | 你跑这个 |
|---|---|
| 「每月 6 号定投 1000,从今年 1 月开始,净值分别是 1、0.9、0.8、0.85、0.95、1.05,现在赚多少?」 | python {baseDir}/scripts/fund_dca.py --amount 1000 --freq 月 --start 2025-01-06 --navs 1,0.9,0.8,0.85,0.95,1.05 |
| 「每周定投 500,申购费 1.5% 打一折,净值 1.02、0.99、1.01、1.05,平均成本多少?」 | python {baseDir}/scripts/fund_dca.py --amount 500 --freq 周 --start 2025-03-03 --navs 1.02,0.99,1.01,1.05 --fee-rate 1.5 --discount 1 |
| 「假设净值从 1 块先跌 30% 再涨到 1.1,每两周投 500,投 30 期,定投和一次性买哪个赚得多?」 | python {baseDir}/scripts/fund_dca.py --amount 500 --freq 双周 --start 2025-01-06 --start-nav 1 --end-nav 1.1 --periods 30 --path 先跌后涨 --swing 30 |
| 「如果赚 20% 就全部赎回、下个月重新开始定投,会怎样?」 | 在上一条命令后加 --take-profit 20(止盈后不再投就再加 --after-tp 停止) |
| 「C 类不收申购费,赎回费持有 7 天以上就不收了,我明年 3 月 1 号净值 1.2 时赎回能拿多少?」 | python {baseDir}/scripts/fund_dca.py --amount 1000 --freq 月 --start 2025-01-06 --navs 1,0.9,0.8,0.85,0.95,1.05 --fee-rate 0 --redeem-tiers 7:1.5,0 --final-date 2026-03-01 --final-nav 1.2 |
| 「我的扣款日和净值都导出来了,一行一个日期和净值」 | python {baseDir}/scripts/fund_dca.py --amount 1000 --nav-file 文件路径 |
| 「这只基金赎回费是 7 天内 1.5%、1 年内 0.5%、2 年内 0.25%、之后不收」 | 加 --redeem-tiers 7:1.5,365:0.5,730:0.25,0 |
参数速查(给你看的,不念给用户):
| 参数 | 含义 |
|---|---|
--amount --freq --start |
每期金额、频率(周 / 双周 / 月)、首期扣款日(不写按今天) |
--navs |
各期净值,逗号隔开,一期一个 |
--nav-file |
文件,每行「日期,净值」,按文件里的日期扣款 |
--start-nav --end-nav --periods --path --swing |
假设路径:首期、末期净值、期数、形状(直线 / 先跌后涨 / 先涨后跌)、中途跌(涨)百分之几 |
--final-date --final-nav |
估值(赎回)日期和净值,不写就用最后一期 |
--fee-rate --discount |
申购费率(百分比写法,0.15 表示 0.15%)、打几折(1 表示一折) |
--redeem-tiers |
赎回费分档:「天数:费率」逗号隔开,最后一项是之后的费率 |
--take-profit --after-tp |
止盈目标收益率(百分比)、止盈后 继续 / 停止 |
--share-decimals --detail --json |
份额小数位、列出全部期数、结构化输出 |
退出码:0 正常,2 输入有误(错误信息两行:「出错了:…」「下一步:…」,原样转告用户)。
使用流程
- 问清楚:每期多少钱、多久一次、从哪天开始、每期净值(或起止净值加想演示的形状)。申购费、赎回费没说就用默认,并告诉用户用的是默认、以他的销售平台为准。
- 跑脚本,把输出的表格原样给用户。
- 先一句话说结论,例如「投了 6,000 元,平均成本 0.9184,按 1.05 算赚 859.42 元,定投收益率 14.32%」,再附表格和结尾说明。
- 用户追问「换成每周呢」「要是跌到 0.7 再涨回来呢」,改参数重跑,不要心算。
说话方式
- 对用户说「份额」「平均成本」「定投收益率」「到手」「赎回费」这类基民的说法,不念参数名、不写公式。
- 提到 XIRR 时说「资金加权年化(和 Excel 里 XIRR 函数一样的算法)」。
- 定投和一次性投入对比时,只说「这组净值下谁多赚多少」,并照原样带上「换一组净值结论可能反过来」那句,不说哪种方式更好。
- 止盈演示只陈述两边数字,不说「建议止盈」「应该坚持」。
边界
- 净值要用单位净值;期间有分红时,单位净值会下跌,建议用户按「红利再投资」后的实际份额另算,或提供复权净值,脚本不单独处理分红。
- 扣款日遇到周末、节假日,实际按下一个交易日净值确认;这里按用户给的净值算。
- 大额申购常见「单笔 500 万以上每笔 1000 元」这类固定费用,脚本不处理,请用户按实际费用换算费率。
- C 类份额每年的销售服务费已经从净值里扣掉,不需要另外输入。
- 止盈演示里赎回的钱不再投资、不计利息;一次性投入对比里,定投还没投出去的钱也不计利息。