3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)的策略开发中,下单函数是最核心的操作接口。这四个函数主要分为两类维度:按“数量”还是按“金额”,以及按“增量”还是按“目标”。
以下是这四个函数的详细区别解析:
| 维度 | 增量下单 (调整多少) | 目标下单 (调整到多少) |
|---|---|---|
| 按股数 (Amount) | order |
order_target |
| 按价值 (Value) | order_value |
order_target_value |
order(security, amount, ...) —— 按股数下单amount 为正数:买入指定股数。amount 为负数:卖出指定股数。order('000001.XSHE', 100) $\rightarrow$ 最终持有 100 股。order('000001.XSHE', -200) $\rightarrow$ 最终持有 300 股。order_target(security, amount, ...) —— 按目标股数下单amount。amount 必须为非负数(0 或 正数)。order_target('000001.XSHE', 300) $\rightarrow$ 系统自动买入 200 股,最终持有 300 股。order_target('000001.XSHE', 0) $\rightarrow$ 系统自动卖出 500 股,最终持有 0 股(清仓)。order_value(security, value, ...) —— 按价值下单value 为正数:买入该金额对应的股票。value 为负数:卖出该金额对应的股票。股数 = value / 当前价格(股票会自动向下取整到100的倍数)。order_value('000001.XSHE', 10000) $\rightarrow$ 买入约 1000 股(1万元市值)。order_target_value(security, value, ...) —— 按目标价值下单value。value 必须为非负数。order_target_value('000001.XSHE', 80000) $\rightarrow$ 系统会自动买入约 3 万元市值的股票,使总持仓达到 8 万元。order_target_value('000001.XSHE', 0) $\rightarrow$ 卖出所有持仓(清仓)。| 特性 | order |
order_target |
order_value |
order_target_value |
|---|---|---|---|---|
| 输入单位 | 股数 (手数*100) | 股数 (手数*100) | 金额 (元) | 金额 (元) |
| 操作逻辑 | 增量 (+/-) | 最终目标 (=) | 增量 (+/-) | 最终目标 (=) |
| 正负值含义 | 正买 / 负卖 | 只能为正 (目标持仓) | 正买 / 负卖 | 只能为正 (目标市值) |
| 自动计算方向 | 否 (需手动指定) | 是 (自动判断买卖) | 否 (需手动指定) | 是 (自动判断买卖) |
| 清仓写法 | 需知道当前持仓量 | amount=0 |
需知道当前市值 | value=0 |
| 典型用途 | 定量买卖 | 调仓到指定数量 | 定额买卖 | 调仓到指定市值权重 |
order_target(security, 0) 或 order_target_value(security, 0),因为它们不需要你先去查询当前持仓是多少,不容易出错。order_target_value,它能自动处理股价波动带来的市值变化,直接调整到目标金额。_value 后缀的函数时,系统会自动处理 A 股“买入必须是 100 的整数倍”的逻辑(通常向下取整),所以实际成交金额可能会略小于你输入的金额。Q: 如果我使用 order_target_value 买入,但资金不足怎么办?
A: 系统会根据你当前的可用资金(available_cash)计算最大可买入数量。如果目标价值需要的资金超过了可用资金,系统会买入尽可能多的股票(即全仓买入),并在日志中输出警告信息(Warning),但不会报错停止运行。
Q: order_target 会处理未成交的挂单吗?
A: 是的。order_target 和 order_target_value 在执行前,通常会先检查该标的是否有未完成的挂单(Open Orders)。如果有,系统会先撤销这些旧订单,然后再计算需要买卖的数量,以防止重复买入或卖出导致持仓错误。
Q: 在回测中,order_value 是按什么价格计算股数的?
A: 在回测中,如果是按天回测,通常使用当天的开盘价(或根据滑点设置的价格)来估算股数;如果是按分钟回测,则使用当前分钟的收盘价或下一分钟的开盘价(取决于撮合机制设置)。实际成交时,会扣除手续费,因此实际花费的现金 = 成交金额 + 手续费。