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

joinquant 盘后复盘流程:如何使用 after_trading_end 自动汇总日终持仓与收益?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 盘后复盘流程:使用 after_trading_end 自动汇总日终持仓与收益

Question: 如何在每天收盘后自动导出并记录策略的订单与成交详情?

解决方案

joinquant 盘后复盘流程:使用 after_trading_end 自动汇总日终持仓与收益

在量化交易策略的编写与实盘模拟中,交易日结束后的复盘至关重要。聚宽(JoinQuant)平台提供了专门的盘后回调函数 after_trading_end,用于在每日 15:30 股票交易结束后执行日志打印、数据导出及收益分析等操作。


一、after_trading_end 函数机制

  • 触发时间:股市收盘后(通常为 15:30;期货为 15:30,夜盘视品种而定)。
  • 运行特点:此时所有未完成的订单均已被系统自动撤销,账户持仓与资金已完成当日结算。
  • 应用场景:汇总当日成交订单、打印持仓明细、记录账户收益、将复盘日志写入私有文件等。

二、核心 API 说明

after_trading_end 函数中,可通过以下 API 提取交易数据:

  1. get_orders():获取当天的所有订单信息(返回字典,order_id 为 key,Order 对象为 value)。
  2. get_trades():获取当天的所有成交记录(返回字典,trade_id 为 key,Trade 对象为 value)。
  3. context.portfolio:访问账户总体持仓、可用资金、总权益及累计收益。
  4. write_file(path, content, append=True):将复盘汇总数据追加写入研究根目录的 csv 或 txt 文件中。

三、盘后导出订单与成交记录示例代码

以下为完整的 joinquant 示例代码,展示如何在每天收盘后自动记录订单、成交信息并导出至研究目录的文件中:

import jqdata
import pandas as pd

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    # 设置买卖标的
    g.security = '000001.XSHE'
    # 注册每日定时交易任务
    run_daily(market_open, time='every_bar')
    # 注册每日收盘后运行函数
    run_daily(after_market_close, time='15:30')

def market_open(context):
    # 简单交易逻辑示范
    if context.portfolio.available_cash > 10000:
        order(g.security, 100)

def after_trading_end(context):
    """盘后运行函数"""
    current_date = context.current_dt.strftime("%Y-%m-%d")
    log.info("========== 开始 %s 盘后复盘汇总 ==========" % current_date)
    
    # 1. 汇总账户资金与收益
    total_value = context.portfolio.total_value
    returns = context.portfolio.returns
    available_cash = context.portfolio.available_cash
    log.info("账户总价值: %.2f | 累计收益: %.2f%% | 可用资金: %.2f" % (total_value, returns * 100, available_cash))
    
    # 2. 获取当日成交明细
    trades = get_trades()
    trade_logs = []
    if trades:
        log.info("--- 当日共成交 %d 笔 ---" % len(trades))
        for trade in trades.values():
            log.info("成交时间: %s | 标的: %s | 数量: %d | 价格: %.2f | 订单ID: %s" % 
                     (trade.time, trade.security, trade.amount, trade.price, trade.order_id))
            trade_logs.append({
                'date': current_date,
                'time': trade.time,
                'security': trade.security,
                'amount': trade.amount,
                'price': trade.price,
                'order_id': trade.order_id
            })
    else:
        log.info("今日无成交记录。")
        
    # 3. 将成交记录写入/追加到研究私有文件 csv 中
    if trade_logs:
        df_trades = pd.DataFrame(trade_logs)
        # 如果是首日可以新建,后续append=True追加
        content = df_trades.to_csv(index=False, header=False)
        write_file("daily_trades_log.csv", content, append=True)
        log.info("今日成交记录已成功追加至 daily_trades_log.csv")
        
    log.info("========== 盘后复盘结束 ==========")

四、注意事项与最佳实践

  1. 数据持久化:使用 write_file 保存的数据可以在“研究”模块中随时通过 read_filepd.read_csv 提取进行二次统计。
  2. T+1 复盘建议:配合 get_fundamentals 查阅财报数据时,请注意收盘前只能获取以前的数据,盘后(15:00 后)方可获取当日最新的基础财务数据。