3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)的策略回测与模拟交易中,Position 对象里的 avg_cost 和 acc_avg_cost 是两个非常重要但容易混淆的概念。
简单来说,avg_cost 是“当前持仓的平均买入成本”,而 acc_avg_cost 是“考虑了历史盈亏后的累计持仓成本”。
以下是详细的区别解析:
(原持仓市值 + 本次买入金额 + 手续费) / (原持仓数量 + 本次买入数量)。acc_avg_cost 会下降(因为收回了资金,剩余持仓的压力变小)。acc_avg_cost 会上升。新成本 = (原成本 * 原数量 - 卖出金额 + 手续费) / 剩余数量acc_avg_cost 可能变成负数。这意味着你已经收回了所有本金且有盈利,剩下的持仓全是“零成本”或“负成本”的利润。假设初始资金充足,忽略手续费,对股票 A 进行以下操作:
1. 第一天:买入 1000 股,价格 10 元。
2. 第二天:股价涨到 20 元,卖出 500 股(止盈一半)。
3. 第三天:股价跌回 10 元,又买入 500 股。
5000 / 1000 = 5。| 特性 | avg_cost (当前成本) | acc_avg_cost (累计成本) |
|---|---|---|
| 核心含义 | 剩余持仓的平均买入价 | 该股历史上所有操作后的盈亏平衡线 |
| 买入时 | 更新 | 更新 |
| 卖出时 | 不更新 | 更新 (盈利则下降,亏损则上升) |
| 能否为负 | 否 (除非数据异常) | 能 (当盈利超过本金时) |
| 适用场景 | 计算当前持仓的浮动盈亏 | 计算该股的整体累计收益、做T策略 |
在编写策略时,如果你想模仿券商软件的逻辑判断是否盈利,请使用 avg_cost;如果你在写网格策略或者需要计算该股的历史总贡献,请使用 acc_avg_cost。
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 下降得少一点,或者上升得多一点)。两个指标都包含了交易成本。