问题描述
解决方案
在聚宽(JoinQuant)的策略开发中,下单函数是最核心的操作接口。这四个函数主要分为两类维度:按“数量”还是按“金额”,以及按“增量”还是按“目标”。
以下是这四个函数的详细区别解析:
1. 函数分类概览
| 维度 | 增量下单 (调整多少) | 目标下单 (调整到多少) |
|---|---|---|
| 按股数 (Amount) | order |
order_target |
| 按价值 (Value) | order_value |
order_target_value |
2. 详细解释
(1) order(security, amount, ...) —— 按股数下单
- 含义:在当前持仓的基础上,增加或减少指定数量的股票。
- 参数逻辑:
amount为正数:买入指定股数。amount为负数:卖出指定股数。
- 适用场景:定投策略(每次买100股)、网格交易(每跌一格买100股)。
- 示例:
- 当前持有 0 股,执行
order('000001.XSHE', 100)$\rightarrow$ 最终持有 100 股。 - 当前持有 500 股,执行
order('000001.XSHE', -200)$\rightarrow$ 最终持有 300 股。
- 当前持有 0 股,执行
(2) order_target(security, amount, ...) —— 按目标股数下单
- 含义:通过买入或卖出,使该标的的最终持仓数量等于指定的
amount。 - 参数逻辑:
- 系统会自动计算(目标股数 - 当前持仓),得出需要买入还是卖出。
amount必须为非负数(0 或 正数)。
- 特殊机制:使用此接口时,若该标的有未完成的挂单,系统通常会先撤销未完成订单,以确保仓位调整准确。
- 适用场景:清仓(设为0)、调仓(固定持仓数量)。
- 示例:
- 当前持有 100 股,执行
order_target('000001.XSHE', 300)$\rightarrow$ 系统自动买入 200 股,最终持有 300 股。 - 当前持有 500 股,执行
order_target('000001.XSHE', 0)$\rightarrow$ 系统自动卖出 500 股,最终持有 0 股(清仓)。
- 当前持有 100 股,执行
(3) order_value(security, value, ...) —— 按价值下单
- 含义:在当前持仓的基础上,买入或卖出指定金额对应的股票数量。
- 参数逻辑:
value为正数:买入该金额对应的股票。value为负数:卖出该金额对应的股票。- 系统会自动根据当前股价计算股数:
股数 = value / 当前价格(股票会自动向下取整到100的倍数)。
- 适用场景:资金分配策略(如:用剩余资金的50%买入某股票)。
- 示例:
- 股价 10 元,执行
order_value('000001.XSHE', 10000)$\rightarrow$ 买入约 1000 股(1万元市值)。
- 股价 10 元,执行
(4) order_target_value(security, value, ...) —— 按目标价值下单
- 含义:通过买入或卖出,使该标的的最终持仓市值等于指定的
value。 - 参数逻辑:
- 系统自动计算:(目标市值 - 当前持仓市值)/ 当前价格,得出需要操作的股数。
value必须为非负数。
- 特殊机制:同样会先撤销该标的未完成的订单。
- 适用场景:基于市值的权重调仓(如:让平安银行占总资产的 10%)。
- 示例:
- 当前持仓市值 5 万元,执行
order_target_value('000001.XSHE', 80000)$\rightarrow$ 系统会自动买入约 3 万元市值的股票,使总持仓达到 8 万元。 - 当前持仓市值 5 万元,执行
order_target_value('000001.XSHE', 0)$\rightarrow$ 卖出所有持仓(清仓)。
- 当前持仓市值 5 万元,执行
3. 核心区别总结表
| 特性 | order |
order_target |
order_value |
order_target_value |
|---|---|---|---|---|
| 输入单位 | 股数 (手数*100) | 股数 (手数*100) | 金额 (元) | 金额 (元) |
| 操作逻辑 | 增量 (+/-) | 最终目标 (=) | 增量 (+/-) | 最终目标 (=) |
| 正负值含义 | 正买 / 负卖 | 只能为正 (目标持仓) | 正买 / 负卖 | 只能为正 (目标市值) |
| 自动计算方向 | 否 (需手动指定) | 是 (自动判断买卖) | 否 (需手动指定) | 是 (自动判断买卖) |
| 清仓写法 | 需知道当前持仓量 | amount=0 |
需知道当前市值 | value=0 |
| 典型用途 | 定量买卖 | 调仓到指定数量 | 定额买卖 | 调仓到指定市值权重 |
4. 最佳实践建议
- 清仓操作:最推荐使用
order_target(security, 0)或order_target_value(security, 0),因为它们不需要你先去查询当前持仓是多少,不容易出错。 - 定期调仓:如果你的策略是基于权重的(例如:沪深300指数增强,每只股票占比不同),推荐使用
order_target_value,它能自动处理股价波动带来的市值变化,直接调整到目标金额。 - A股整手限制:在使用
_value后缀的函数时,系统会自动处理 A 股“买入必须是 100 的整数倍”的逻辑(通常向下取整),所以实际成交金额可能会略小于你输入的金额。
Q&A
Q: 如果我使用 order_target_value 买入,但资金不足怎么办?
A: 系统会根据你当前的可用资金(available_cash)计算最大可买入数量。如果目标价值需要的资金超过了可用资金,系统会买入尽可能多的股票(即全仓买入),并在日志中输出警告信息(Warning),但不会报错停止运行。
Q: order_target 会处理未成交的挂单吗?
A: 是的。order_target 和 order_target_value 在执行前,通常会先检查该标的是否有未完成的挂单(Open Orders)。如果有,系统会先撤销这些旧订单,然后再计算需要买卖的数量,以防止重复买入或卖出导致持仓错误。
Q: 在回测中,order_value 是按什么价格计算股数的?
A: 在回测中,如果是按天回测,通常使用当天的开盘价(或根据滑点设置的价格)来估算股数;如果是按分钟回测,则使用当前分钟的收盘价或下一分钟的开盘价(取决于撮合机制设置)。实际成交时,会扣除手续费,因此实际花费的现金 = 成交金额 + 手续费。