🚀 AI 一键生成 joinquant 策略代码

JoinQuant Position 对象深度解析:acc_avg_cost、avg_cost 与 closeable_amount 精讲

joinquant | 发布时间: 2025/11/28
以下内容由 EasyQuant 生成。

问题描述

请解释一下持仓信息中的 avg_cost 和 acc_avg_cost 有什么区别?

解决方案

在 JoinQuant(聚宽)的策略回测与模拟交易中,Position 对象里的 avg_costacc_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

总结对比表

特性 avg_cost (当前成本) acc_avg_cost (累计成本)
核心含义 剩余持仓的平均买入价 该股历史上所有操作后的盈亏平衡线
买入时 更新 更新
卖出时 不更新 更新 (盈利则下降,亏损则上升)
能否为负 否 (除非数据异常) (当盈利超过本金时)
适用场景 计算当前持仓的浮动盈亏 计算该股的整体累计收益、做T策略

在编写策略时,如果你想模仿券商软件的逻辑判断是否盈利,请使用 avg_cost;如果你在写网格策略或者需要计算该股的历史总贡献,请使用 acc_avg_cost


Q&A

Q: 为什么我的 acc_avg_cost 是负数?
A: 这说明您在该股票上的历史操作(高抛低吸)已经产生了超过您当前持仓市值的利润。简单来说,您已经收回了所有投入的本金,并且还赚了钱,目前持有的股票相当于“纯利润”。

Q: 如果我清仓了股票,再重新买入,这两个值会怎么变?
A: 当持仓数量(total_amount)变为 0 时,相关记录通常会重置。再次买入时,avg_costacc_avg_cost 都会重新从新的买入价开始计算,之前的历史盈亏不会计入新的 acc_avg_cost 中(除非您自己用全局变量 g 记录)。

Q: 手续费会影响这两个值吗?
A: 会。JoinQuant 的计算公式中,买入时的手续费会增加成本,卖出时的手续费会减少收回的资金(从而导致 acc_avg_cost 下降得少一点,或者上升得多一点)。两个指标都包含了交易成本。