问题描述
解决方案
在 JoinQuant(聚宽)的策略回测与模拟交易中,Position 对象里的 avg_cost 和 acc_avg_cost 是两个非常重要但容易混淆的概念。
简单来说,avg_cost 是“当前持仓的平均买入成本”,而 acc_avg_cost 是“考虑了历史盈亏后的累计持仓成本”。
以下是详细的区别解析:
1. avg_cost (当前持仓成本)
- 定义:仅计算当前持有的那部分股票的平均买入价格(包含交易费用)。
- 更新逻辑:
- 买入(加仓)时:会重新计算。公式为:
(原持仓市值 + 本次买入金额 + 手续费) / (原持仓数量 + 本次买入数量)。 - 卖出(减仓)时:不会变化。因为卖出操作并不改变剩余股票当年的买入价格。
- 买入(加仓)时:会重新计算。公式为:
- 用途:用于计算浮动盈亏。这与大多数券商软件中显示的“成本价”逻辑一致。
- 特点:只要不继续买入,无论怎么卖出,这个数值通常保持不变。
2. acc_avg_cost (累计持仓成本)
- 定义:反映了在该标的上进行的一系列操作后的盈亏平衡点。它将历史上(从建仓到现在)所有的买入支出和卖出收入都计算在内。
- 更新逻辑:
- 买入(加仓)时:成本增加。
- 卖出(减仓)时:会变化。系统会将卖出获得的资金(扣除手续费)用来冲抵成本。
- 如果卖出赚钱,
acc_avg_cost会下降(因为收回了资金,剩余持仓的压力变小)。 - 如果卖出亏钱,
acc_avg_cost会上升。
- 如果卖出赚钱,
- 公式逻辑:
- 减仓时:
新成本 = (原成本 * 原数量 - 卖出金额 + 手续费) / 剩余数量
- 减仓时:
- 用途:用于计算平仓盈亏或判断该股的整体投资回报。非常适合用于网格交易或做T(日内回转交易)的策略统计。
- 特点:
- 如果通过高抛低吸获利较多,
acc_avg_cost可能变成负数。这意味着你已经收回了所有本金且有盈利,剩下的持仓全是“零成本”或“负成本”的利润。 - 当持仓数量清零时,该数值重置。
- 如果通过高抛低吸获利较多,
举例说明
假设初始资金充足,忽略手续费,对股票 A 进行以下操作:
1. 第一天:买入 1000 股,价格 10 元。
- 花费:10,000 元。
- avg_cost: 10.0 元
- acc_avg_cost: 10.0 元
2. 第二天:股价涨到 20 元,卖出 500 股(止盈一半)。
- 收回资金:10,000 元。
- avg_cost: 10.0 元
- 解释:虽然卖了一半,但手里剩下的 500 股当初就是 10 块钱买的,成本没变。
- acc_avg_cost: 0.0 元
- 解释:总投入 10,000,卖出收回 10,000。相当于现在的 500 股持仓没有占用任何本金,成本为 0。
3. 第三天:股价跌回 10 元,又买入 500 股。
- 花费:5,000 元。
- avg_cost: 10.0 元
- 解释:原持仓 500 股成本 10 元,新买 500 股成本 10 元,平均还是 10 元。
- acc_avg_cost: 5.0 元
- 解释:之前的累计成本是 0(剩余 500 股),现在又花了 5,000 买 500 股。总共 1000 股,对应的净投入是 5,000 元。
5000 / 1000 = 5。
- 解释:之前的累计成本是 0(剩余 500 股),现在又花了 5,000 买 500 股。总共 1000 股,对应的净投入是 5,000 元。
总结对比表
| 特性 | avg_cost (当前成本) | acc_avg_cost (累计成本) |
|---|---|---|
| 核心含义 | 剩余持仓的平均买入价 | 该股历史上所有操作后的盈亏平衡线 |
| 买入时 | 更新 | 更新 |
| 卖出时 | 不更新 | 更新 (盈利则下降,亏损则上升) |
| 能否为负 | 否 (除非数据异常) | 能 (当盈利超过本金时) |
| 适用场景 | 计算当前持仓的浮动盈亏 | 计算该股的整体累计收益、做T策略 |
在编写策略时,如果你想模仿券商软件的逻辑判断是否盈利,请使用 avg_cost;如果你在写网格策略或者需要计算该股的历史总贡献,请使用 acc_avg_cost。
Q&A
Q: 为什么我的 acc_avg_cost 是负数?
A: 这说明您在该股票上的历史操作(高抛低吸)已经产生了超过您当前持仓市值的利润。简单来说,您已经收回了所有投入的本金,并且还赚了钱,目前持有的股票相当于“纯利润”。
Q: 如果我清仓了股票,再重新买入,这两个值会怎么变?
A: 当持仓数量(total_amount)变为 0 时,相关记录通常会重置。再次买入时,avg_cost 和 acc_avg_cost 都会重新从新的买入价开始计算,之前的历史盈亏不会计入新的 acc_avg_cost 中(除非您自己用全局变量 g 记录)。
Q: 手续费会影响这两个值吗?
A: 会。JoinQuant 的计算公式中,买入时的手续费会增加成本,卖出时的手续费会减少收回的资金(从而导致 acc_avg_cost 下降得少一点,或者上升得多一点)。两个指标都包含了交易成本。