🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant聚宽平台如何利用API回测和查询即时持仓?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

看即时仓位的方法

大神们,如何利用聚宽的平台回测即时的持仓?现在策略都是要第二天才能看到前一天的交易操作。谢谢!

解决方案

您好!关于您提到的“第二天才能看到前一天的交易操作”,这其实是回测结果页面展示机制造成的误解。在聚宽的回测详情页中,图表和持仓列表确实是按天(每日收盘后)进行结算和展示的。但是,在您的策略代码内部,持仓信息是完全即时(根据您的回测频率)更新的

如果您使用的是分钟回测或Tick回测,在盘中的每一分钟或每一个Tick,您都可以通过 context 对象获取到最新的、即时的持仓状态。

获取即时持仓的核心API

在策略运行过程中(如 handle_datarun_daily 指定的盘中函数内),您可以通过 context.portfolio.positions 来获取当前的即时持仓字典。

  • context.portfolio.positions:这是一个字典(dict),键(key)是标的代码(如 '000001.XSHE'),值(value)是 Position 对象,包含了该标的的详细持仓信息。

Position 对象的常用属性

当您拿到某个标的的 Position 对象后,可以查看以下即时信息:

  • total_amount: 总仓位(包含挂单冻结的仓位)。
  • closeable_amount: 可卖出的仓位(T+1制度下,今天买入的明天才能卖出,此字段会自动处理)。
  • price: 最新行情价格。
  • value: 标的当前总价值(price * total_amount * 乘数)。
  • avg_cost: 当前持仓成本(买入均价)。

代码示例:如何在盘中打印即时持仓

以下是一个在分钟回测中,每分钟打印当前即时持仓的示例:

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    g.security = '000001.XSHE'
    
    # 每天 10:00 定时买入
    run_daily(buy_stock, time='10:00')
    # 每天 14:00 定时查看即时持仓
    run_daily(check_position, time='14:00')

def buy_stock(context):
    # 买入1000股
    order(g.security, 1000)
    log.info("10:00 下单买入 1000 股 %s" % g.security)

def check_position(context):
    # 获取当前逻辑时间
    current_time = context.current_dt
    log.info("当前时间: %s, 开始检查即时持仓..." % current_time)
    
    # 获取所有持仓
    positions = context.portfolio.positions
    
    if len(positions) > 0:
        for stock in positions:
            pos = positions[stock]
            log.info("标的: %s, 总持仓: %d, 可卖仓位: %d, 最新价: %.2f, 持仓价值: %.2f" % 
                     (stock, pos.total_amount, pos.closeable_amount, pos.price, pos.value))
    else:
        log.info("当前无持仓")

进阶技巧:如何在回测图表上看到盘中变化?

如果您希望在回测的图表上直观地看到盘中某个时刻的持仓变化,可以使用 record() 函数。record() 可以将您自定义的变量绘制在回测结果的图表中。

def handle_data(context, data):
    # 记录平安银行的即时持仓数量
    if '000001.XSHE' in context.portfolio.positions:
        amount = context.portfolio.positions['000001.XSHE'].total_amount
    else:
        amount = 0
        
    # 将持仓数量画在图表上
    record(PA_Amount=amount)

总结:聚宽平台的底层撮合引擎是实时更新账户状态的。只要您的回测频率是分钟或Tick,您在代码中通过 context.portfolio 拿到的数据就是盘中即时的,完全可以基于这些即时数据进行复杂的盘中交易逻辑编写。