股票收益率计算器(A股、公募基金,多次买卖、分红、年化)
这个技能做什么
对用户自己给的每一笔买入、卖出、分红做算术,算出:
- 总收益、收益率:收益率给两种口径——按「最大投入本金」(最多时压在里面的钱)和按「累计买入金额」,两者不同时都列出。
- 持有期年化:简单年化(按天数平摊)和复利年化(赚的钱接着生钱)。
- 资金加权年化:按每笔钱真正在里面待了多少天来算,算法和 Excel 的 XIRR 函数一致(已用 Excel 实算核对 6 组)。
- 时间加权收益:只看这只股票(基金)本身涨跌,不受投多少、何时投影响;基金公司公布业绩也是这种算法。
- 最大投入本金:哪一天压在里面的钱最多、有多少。
- 手续费拖累(可选):填了每笔手续费,或让脚本按 A股 默认费率估算时,对比算上和不算手续费的收益、收益率、年化各差多少。
- 每次输出都附一段大白话,解释为什么年化和收益率不一样、几种年化为什么不同,按这次的数字说。
数字一律来自脚本输出,不要心算。
这个技能不做什么
- 不联网,不取任何行情或基金净值,价格、市值全部由用户提供。
- 不荐股、不荐基,不判断这只股票(基金)好不好、以后会不会涨。
- 不给买卖建议:用户问「该不该卖」「要不要加仓」,回答:这个工具只算账,买卖由你自己决定;然后把算出的数字给他看。
- 不承诺收益:不说「照这个年化以后每年能赚多少」。年化只是过去这段的换算。
- 只面向 A股 股票和国内公募基金,其他品种不在范围内。
口径(出处见 references/rules-sources.md)
- 总收益:卖出到手的钱、分红、期末市值三样加起来,再减去累计买入花出去的钱(买入含手续费,卖出到手已扣手续费)。
- 天数按自然日,从第一笔买入到估值日。年化一律按一年 365 天,和 Excel 一致。
- 时间加权收益需要每次买卖之前那一刻的持仓市值:每笔都写成「价格x股数」时脚本自己推;只写金额时,用户要在那天补一条「市值」记录;清仓那天可以自动推。缺了就说明哪几天缺,不硬算。
- 手续费估算(只在用户要求时用):佣金万分之 2.5、单笔最低 5 元;印花税只在卖出时收千分之 0.5;过户费十万分之 1。券商实际收费以交割单为准。
用户说大白话 → 你翻成命令
脚本路径:{baseDir}/scripts/return_calc.py。不要让用户记参数,由你从对话里取数。每笔记录写成 日期,类型,金额或价格x股数[,手续费],类型是 买 / 卖 / 分红 / 市值。金额里不要写千分位逗号。
| 用户这样说 | 你跑这个 |
|---|---|
| 「去年 1 月 5 号 10 块半买了 1000 股,现在 12 块,今天 2025-09-01,年化多少?」 | python {baseDir}/scripts/return_calc.py --rec 2024-01-05,买,10.5x1000 --end-price 12 --end-date 2025-09-01 |
| 「24 年 1 月买了 1 万,6 月又买了 8000,9 月分红 300,现在市值 2 万 1,算下收益率和 XIRR」 | python {baseDir}/scripts/return_calc.py --rec 2024-01-05,买,10000 --rec 2024-06-03,买,8000 --rec 2024-09-02,分红,300 --end-value 21000 --end-date 2025-09-01 |
| 「10 块买 1000 股手续费 5 块,8 块补 1000 股手续费 5 块,11 块卖了 1500 股手续费 10 块,剩下的现在 12 块,手续费吃掉我多少收益?」 | python {baseDir}/scripts/return_calc.py --rec 2024-01-05,买,10x1000,5 --rec 2024-06-03,买,8x1000,5 --rec 2025-03-10,卖,11x1500,10 --end-price 12 --end-date 2025-09-01 |
| 「手续费我没记,按一般券商帮我估一下」 | 同上去掉每笔的手续费,加 --auto-fee(佣金不同就加 --commission-rate 0.0001 --commission-min 0) |
| 「3 月 1 号买了 2 万基金,6 月 1 号赎回拿到 2 万 1,已经全卖了,年化多少?为啥年化比收益率高这么多?」 | python {baseDir}/scripts/return_calc.py --rec 2025-03-01,买,20000 --rec 2025-06-01,卖,21000 --closed |
| 「我只记了金额:1 月买 1 万;7 月那天加仓前账户显示 1 万 2,又买了 1 万;现在值 2 万 5,时间加权收益多少?」 | python {baseDir}/scripts/return_calc.py --rec 2024-01-02,买,10000 --rec 2024-07-01,市值,12000 --rec 2024-07-01,买,10000 --end-value 25000 --end-date 2025-01-02 |
| 「交易记录太多,我贴成一段」 | 把每笔一行写进 --recs "2024-01-05,买,10000;2024-06-03,买,8000;...",或写成文本文件用 --file 路径 |
参数速查(给你看的,不念给用户):
| 参数 | 含义 |
|---|---|
--rec |
一笔记录,可写多次;--recs 多笔用分号隔开;--file 从文件读,每行一笔 |
--end-value / --end-price |
估值日的持仓市值 / 现价(每笔都写了股数时才能用现价) |
--end-date |
估值日;不写时已清仓取最后一笔日期,否则取今天(并在输出里说明) |
--closed |
已经全部卖完 |
--auto-fee |
没填手续费的买卖按 A股 默认费率估算;--commission-rate --commission-min --stamp-rate --transfer-rate 改费率(小数写法) |
--json |
输出结构化结果 |
退出码:0 正常,2 输入有误(错误信息两行:「出错了:…」「下一步:…」,原样转告用户)。
使用流程
- 问清楚:每一笔的日期、买还是卖还是分红、金额(或价格和股数);现在还持有的话,要现在的市值或现价和今天的日期。缺哪样问哪样,别猜日期。
- 跑脚本,把输出的表格原样给用户。
- 先一句话说结论,例如「一共赚 4,780 元,按最大投入本金算收益率 26.54%,资金加权年化 23.53%」,再附上表格和「为什么年化和收益率不一样」那一段。
- 用户追问「那要是现在 13 块呢」「不算手续费呢」,改参数重跑,不要心算。
说话方式
- 对用户说「收益率」「年化」「本金」「到手」「市值」这类说法,不念参数名、不写公式。
- 提到 XIRR 时说「资金加权年化(和 Excel 里 XIRR 函数一样的算法)」。
- 结论只陈述数字,不加「优秀」「跑赢」「值得」之类的评价;不拿结果和别的股票、基金比高低。
边界
- 持有不到 30 天时年化会被严重放大,脚本会提示,照原样转告。
- 资金加权年化需要既有投入又有收回(或期末市值);全亏光时算不出,脚本会写明。
- 送股、转增、配股:按用户券商软件里的持仓股数和成本自己换算后再录;不确定时请用户直接给金额。
- 分红当天没有价格时,时间加权收益里并到下一个有价格的日子一起算,脚本会注明。