如何在Google Sheets中跨工作表计算各股票的XIRR?
Google Sheets投资组合表中计算单只股票XIRR的实现方法
前提假设(匹配你的表结构)
先明确两个表的关键列(如果你的列位置不同,对应调整公式中的列名即可):
- Transactions(交易记录表):
- A列:股票代码/名称(如HDFCBK)
- B列:交易日期
- D列:交易金额(买入填负数,卖出填正数,分红填正数)
- Portfolio(投资组合表):
- A列:股票代码/名称
- D列:总市值(已计算为「持仓量×当前市价」)
- E列:用于显示XIRR的目标列
核心公式
在Portfolio表的E2单元格(对应第一只股票)输入以下公式,下拉复制到所有行即可:
=IFERROR( XIRR( {FILTER(Transactions!D:D, Transactions!A:A=A2); D2}, {FILTER(Transactions!B:B, Transactions!A:A=A2); TODAY()} ), "无交易" )
公式解释
- FILTER函数:从Transactions表中筛选出当前股票(A2)的所有交易金额和对应日期,生成该股票的现金流数组和日期数组。
- 数组合并:
{...; D2}和{...; TODAY()}把当前股票的总市值作为最后一笔正现金流,今日日期作为这笔现金流的发生日(模拟当前卖出变现的情况)。 - XIRR函数:基于合并后的现金流和日期数组计算内部收益率,自动考虑不同时间点的资金成本。
- IFERROR包装:处理无交易记录的股票,返回友好提示。
关键注意事项
- 金额符号规范:买入必须填负数(资金流出),卖出/分红填正数(资金流入),否则XIRR计算结果会错误。
- 日期格式:确保两个表的日期列都是Google Sheets标准日期格式,不要用文本格式。
- 初始猜测值(可选):如果XIRR返回#NUM!错误,可以在函数最后加一个初始猜测值(比如0.1代表10%),例如:
=IFERROR(XIRR({FILTER(...); D2}, {FILTER(...); TODAY()}, 0.1), "无交易")
内容的提问来源于stack exchange,提问作者usr_lal123
相关产品推荐
相关产品推荐

