问题描述
用order_target()或者order_value()函数怎么判断或者设置用当天的开盘价或者收盘价买入股票?
解决方案
在 JoinQuant (聚宽) 平台上,order_target() 和 order_value() 函数默认使用的是市价单 (MarketOrder)。市价单的成交价格是由下单时策略运行的时间点决定的,而不是通过函数参数直接指定“开盘价”或“收盘价”。
根据聚宽的撮合机制:如果在开盘时刻运行,最新价格为开盘价;其他情况下,为上一分钟的最后一个价格。因此,要实现以开盘价或收盘价买入,你需要控制下单函数执行的时间。
1. 如何以当天的【开盘价】买入股票?
要以开盘价成交,你需要让下单逻辑在每天开盘时(09:30)执行。你可以使用 run_daily 函数来定时触发。
代码示例:
def initialize(context):
# 设定要操作的股票
g.security = '000001.XSHE'
# 每天 09:30 运行开盘买入逻辑
run_daily(buy_at_open, time='09:30')
def buy_at_open(context):
# 在 09:30 下市价单,系统会以当天的开盘价(或集合竞价后的最新价)撮合成交
order_target(g.security, 1000)
# 或者使用 order_value(g.security, 10000)
注:在日级模拟盘中,time='09:30' 的实际运行时间是 9:27~9:30 之间,此时集合竞价已完成,可以获取到开盘价并以开盘价撮合。
2. 如何以当天的【收盘价】买入股票?
A股的收盘时间是 15:00。在聚宽平台中,如果你在 15:00 之后下单,由于已经闭市,订单会被废弃或挂单到第二天。因此,无法以绝对精确的收盘价成交,但你可以通过在**接近收盘的时间(如 14:50 或 14:55)**下单,来获取非常接近收盘价的成交价格。
代码示例:
def initialize(context):
# 设定要操作的股票
g.security = '000001.XSHE'
# 每天 14:55 运行尾盘买入逻辑,获取接近收盘价的成交价
run_daily(buy_near_close, time='14:55')
def buy_near_close(context):
# 在 14:55 下市价单,成交价将非常接近当天的最终收盘价
order_target(g.security, 1000)
# 或者使用 order_value(g.security, 10000)
总结与注意事项
- 时间决定价格:
order_target和order_value默认是市价单,成交价取决于你调用该函数时的盘面最新价。利用run_daily(func, time='xx:xx')控制执行时间是关键。 - 滑点影响:即使你在
09:30下单,实际成交价也会受到你设置的滑点 (Slippage) 影响(默认有滑点)。如果你希望回测时完全等于开盘价,可以在initialize中将滑点设置为 0:set_slippage(FixedSlippage(0))。 - 限价单 (LimitOrder):如果你一定要指定某个具体的价格(例如你预测的收盘价),你可以传入
style参数使用限价单,例如:order_target('000001.XSHE', 1000, LimitOrderStyle(10.5))。但如果市场价格未达到该限价,订单将无法成交。