问题描述
解决方案
在 PTrade 量化交易平台中,order_value 和 order_target_value 都是基于金额(价值)来进行下单的函数,但它们的核心逻辑和使用场景有本质的区别。
简单来说:
order_value是增量操作(我要再买/卖多少钱)。order_target_value是目标操作(我要让持仓变成多少钱)。
以下是详细的对比解析:
1. order_value (按价值交易)
该函数用于买入或卖出指定金额的股票。它不关心你当前持有多少,只关心你现在想增加或减少多少资金的仓位。
- 逻辑:
- 传入正数:代表买入对应金额的股票。
- 传入负数:代表卖出对应金额的股票。
- 计算公式:
- 下单数量 $\approx$
value/price(向下取整到100股)。
- 下单数量 $\approx$
- 场景举例:
- 你当前持有“恒生电子”市值 50,000 元。
- 调用
order_value('600570.SS', 10000)。 - 结果:系统会再买入 10,000 元的股票。交易后你的持仓总市值变为 60,000 元(5万 + 1万)。
2. order_target_value (目标价值交易)
该函数用于调整持仓,使其最终市值达到指定的金额。系统会自动计算当前持仓市值与目标市值的差额,然后进行买入或卖出。
- 逻辑:
- 如果
目标价值>当前持仓市值:系统会自动买入差额部分。 - 如果
目标价值<当前持仓市值:系统会自动卖出差额部分。 - 如果
目标价值=当前持仓市值:系统不进行操作。
- 如果
- 计算公式:
- 下单金额 =
target_value-current_holding_value。
- 下单金额 =
- 场景举例:
- 你当前持有“恒生电子”市值 50,000 元。
- 调用
order_target_value('600570.SS', 10000)。 - 结果:因为目标(1万)小于当前持有(5万),系统会卖出 40,000 元的股票。交易后你的持仓总市值变为 10,000 元。
- 特殊用法:
order_target_value('600570.SS', 0)常用于清仓某只股票。
3. 代码对比示例
假设当前账户持有 0股 “恒生电子”(600570.SS),股价为 50元。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# -------------------------------------------------
# 场景 A:使用 order_value
# -------------------------------------------------
# 第一天:买入 10000 元
# 结果:持仓市值 10000 元
order_value(g.security, 10000)
# 第二天:再次调用 order_value 买入 10000 元
# 结果:持仓市值 20000 元 (10000 + 10000)
order_value(g.security, 10000)
# -------------------------------------------------
# 场景 B:使用 order_target_value
# -------------------------------------------------
# 第一天:调整持仓至 10000 元
# 结果:持仓市值 10000 元 (从0买入10000)
order_target_value(g.security, 10000)
# 第二天:再次调用 order_target_value 至 10000 元
# 结果:持仓市值 10000 元 (因为已经达标,系统不进行任何操作)
order_target_value(g.security, 10000)
# 第三天:调整持仓至 0 元
# 结果:持仓市值 0 元 (系统自动卖出所有持仓)
order_target_value(g.security, 0)
4. 总结与注意事项
| 特性 | order_value | order_target_value |
|---|---|---|
| 操作性质 | 增量操作 (加仓/减仓) | 目标导向 (调仓) |
| 正负值含义 | 正数买入,负数卖出 | 必须为正数(代表目标市值),0代表清仓 |
| 依赖持仓 | 不依赖,只看传入金额 | 强依赖,需读取当前持仓计算差额 |
| 适用场景 | 定投、金字塔加仓、网格交易 | 调仓再平衡、固定比例仓位管理、止盈止损清仓 |
特别注意(实盘交易风险):
在实盘交易中使用 order_target_value 需要谨慎。
由于柜台返回的持仓数据可能有延迟(通常约6秒),如果在短时间内连续调用 order_target_value,系统可能因为读取到旧的持仓数据而重复下单。
- 建议:在实盘策略中,如果使用
order_target系列函数,请确保逻辑上不会在同一分钟或极短时间内对同一标的多次触发,或者自行维护一个本地的持仓变量进行校验。
Q&A
Q: 如果我想清空某只股票的仓位,应该用哪个函数?
A: 使用 order_target_value(security, 0) 或 order_target(security, 0) 是最方便的清仓方法。如果使用 order_value,你需要先查询当前持仓市值,然后传入负的该数值,计算比较麻烦且容易有误差。
Q: 这两个函数下单时会自动取整吗?
A: 是的。PTrade 会根据股票价格,将计算出的股数自动向下取整到 100股 的整数倍(对于股票交易)。例如计算出需要买入 150 股,实际只会买入 100 股。
Q: order_target_value 会考虑在途订单(已委托未成交)吗?
A: 在回测中,引擎通常会考虑在途订单以避免重复买入。但在实盘交易中,依赖于柜台返回的持仓信息,如果之前的订单刚成交但柜台数据未同步,可能会导致计算偏差。因此建议在实盘中尽量避免高频调用此函数。