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

PTrade 平台如何提取历史交割单与资金流水?(基于 get_deliver 与 get_fundjour 接口)

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

问题描述

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

Title: PTrade 账户盘后复盘:利用 get_deliver 与 get_fundjour 提取历史交割单与资金流水

Question: 如何在 ptrade 盘后通过 API 获取账户的历史交割单和资金流水数据进行对账分析?

解决方案

PTrade 账户盘后复盘:利用 get_deliver 与 get_fundjour 提取历史交割单与资金流水

在量化交易与自动化策略运行过程中,盘后对账与交易复盘是确保资金安全、核对撮合成本及评估策略表现的关键环节。PTrade 平台提供了 get_deliver(获取历史交割单)和 get_fundjour(获取历史资金流水)两个核心 API,方便开发者在盘后事件中自动化提取柜台原数据进行对账。


一、接口使用场景与注意事项

  1. 运行阶段限制get_deliverget_fundjour 仅支持在交易模块的 before_trading_start(盘前)和 after_trading_end(盘后)阶段调用,无法在盘中 handle_datatick_data 中触发。
  2. 日期查询范围:仅支持查询上一个交易日(含)之前的历史数据,无法查询当日实时未结算的流水。
  3. 账户类型支持:目前仅支持查询普通股票账户(非融资融券账户)。
  4. 柜台数据差异:接口直接返回券商柜台原始数据字典,不同柜台的字段命名可能存在微小差异,建议在解析时针对性处理。

二、核心 API 规范说明

1. get_deliver - 获取历史交割单信息

get_deliver(start_date, end_date)
  • 参数
    • start_date (str):开始日期,格式为 'YYYYMMDD'(如 '20230101')。
    • end_date (str):结束日期,格式为 'YYYYMMDD'(如 '20230110')。
  • 返回值list[dict],每个字典代表一条交割记录,包含股票代码、成交数量、成交价格、手续费(佣金、印花税、过户费等)、发生金额及清算金额等。

2. get_fundjour - 获取历史资金流水信息

get_fundjour(start_date, end_date)
  • 参数
    • start_date (str):开始日期,格式为 'YYYYMMDD'
    • end_date (str):结束日期,格式为 'YYYYMMDD'
  • 返回值list[dict],每个字典代表一条资金变动流水,包含发生金额(occur_balance)、变动后余额(post_balance)、业务名称(business_name,如“证券买入”、“银证转账”)及备注描述等。

三、代码示例:盘后自动化导出与复盘分析

以下策略展示了如何在每日收盘后的 after_trading_end 触发器中,提取过去一段时间的交割单与资金流水并打印或进行复盘:

import pandas as pd

def initialize(context):
    # 设置股票池
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 盘中交易逻辑
    pass

def after_trading_end(context, data):
    # 获取上一交易日日期并格式化
    prev_date = context.previous_date.strftime('%Y%m%d')
    current_date = context.blotter.current_dt.strftime('%Y%m%d')
    
    log.info("=== 开始执行盘后对账与数据提取 ===")
    
    # 1. 提取历史交割单
    delivers = get_deliver(prev_date, current_date)
    if delivers:
        df_delivers = pd.DataFrame(delivers)
        log.info("历史交割单获取成功,记录数: %d" % len(df_delivers))
        # 打印关键对账字段(股票代码、业务名称、成交价、发生数量、清算金额等)
        for item in delivers:
            stock_code = item.get('stock_code', '')
            business_name = item.get('business_name', '')
            amount = item.get('business_amount', 0)
            price = item.get('business_price', 0)
            clear_balance = item.get('clear_balance', 0)
            log.info("交割记录: [%s] %s %d股@%.3f元, 清算金额: %.2f" % 
                     (stock_code, business_name, amount, price, clear_balance))
    else:
        log.info("指定范围内无交割单记录")
        
    # 2. 提取历史资金流水
    fundjours = get_fundjour(prev_date, current_date)
    if fundjours:
        df_fundjours = pd.DataFrame(fundjours)
        log.info("历史资金流水获取成功,记录数: %d" % len(df_fundjours))
        for item in fundjours:
            b_name = item.get('business_name', '')
            occur_bal = item.get('occur_balance', 0)
            post_bal = item.get('post_balance', 0)
            remark = item.get('remark', '')
            log.info("资金流水: %s, 变动金额: %.2f, 变动后余额: %.2f, 备注: %s" % 
                     (b_name, occur_bal, post_bal, remark))
    else:
        log.info("指定时间内无资金流水变动")

四、总结与最佳实践

  • 落盘持久化:结合 PTrade 提供的 get_research_path(),可将获取到的 DataFrame 数据导出为 CSV 文件保存至研究目录,便于后续可视化或二次建模分析。
  • 异常保护:由于接口依赖券商柜台响应,建议在对账代码外层包裹 try...except 结构,增强策略盘后运行的健壮性。