3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,Position 对象提供了两个核心的成本计算属性:avg_cost(当前持仓成本) 和 acc_avg_cost(累计持仓成本)。理解两者的算法差异,对于精确计算策略浮动盈亏、调仓止盈止损至关重要。
| 属性名称 | 属性说明 | 触发更新时机 | 卖出/减仓时的变化 | 核心用途 |
|---|---|---|---|---|
avg_cost |
当前持仓成本 | 仅在开仓、加仓时更新 | 保持不变 | 计算当前持仓的浮动盈亏、设置止盈止损点 |
acc_avg_cost |
累计持仓成本 | 开仓、加仓、减仓/清仓时均更新 | 随清算收益重新计算 | 衡量该标的自历史建仓以来的综合累计成本与收益 |
avg_cost)avg_cost 表示当前所持有股票的平均买入成本,包含买入交易手续费。
开仓/加仓时:
$$\text{new_avg_cost} = \frac{\text{position_value} + \text{trade_value} + \text{commission}}{\text{position_amount} + \text{trade_amount}}$$
其中 commission 为本次交易的手续费/佣金。
卖出/减仓时:
avg_cost 保持不变。卖出股票不影响剩余持仓的单价成本。
acc_avg_cost)acc_avg_cost 是将该标的历史上所有的交易损益(包括卖出盈利或亏损)和手续费摊销到持仓中的累计成本。初始状态下(持仓为0时)为 0。
加仓时:
$$\text{new_acc_avg_cost} = \frac{\text{acc_avg_cost} \times \text{amount} + \text{trade_value} + \text{commission}}{\text{amount} + \text{trade_amount}}$$
减仓/卖出时:
$$\text{new_acc_avg_cost} = \frac{\text{acc_avg_cost} \times \text{amount} - \text{trade_value} + \text{commission}}{\text{amount} - \text{trade_amount}}$$
注意:如果卖出获得大幅盈利,- trade_value 会导致 acc_avg_cost 降低甚至变为负数,这代表历史卖出收益已经收回了全部本金。
在 JoinQuant 策略中,可以通过 context.portfolio.positions 或 context.subportfolios[0].long_positions 获取 Position 对象:
security = '000001.XSHE'
# 获取持仓对象
position = context.portfolio.positions[security]
if position.total_amount > 0:
print("标的:", position.security)
print("当前持仓数量:", position.total_amount)
print("当前持仓成本 (avg_cost):", position.avg_cost)
print("累计持仓成本 (acc_avg_cost):", position.acc_avg_cost)
print("最新价格:", position.price)
# 计算当前持仓浮动盈亏(基于 avg_cost)
floating_pnl = (position.price - position.avg_cost) * position.total_amount
print("持仓浮动盈亏:", floating_pnl)
avg_cost。因为它真实反映了当前这批持仓的实际买入均价,不受此前历史卖出盈亏的干扰。acc_avg_cost。它综合反映了对该标的多轮建仓、平仓后的整体资金回收情况。