历史绩效分析与导出

应用指南 · 结算后的历史数据

本指南从准备数据开始,演示如何查看历史权益、导出资金与交易记录,并制作 HTML 绩效看板。使用 8815 的绩效分析服务;HTTP 契约见 历史绩效 API,字段定义见 历史绩效字段

先让 AI 使用绩效分析 Skill

先用 QPro Skills,让 AI 快速实现需求 安装或更新 QPro Skills 后,Agent 可以使用 analyse-server-settlement-data 查询本服务。可以直接提出以下需求:

请使用 QPro 绩效分析 Skill,列出可查询的账户,让我选择账户和日期区间。
根据已解析的结算数据,生成每日客户权益、出入金、手续费和保证金报表,
并按合约汇总成交手续费。保留缺失值,展示实际数据覆盖日期。
如果做成 HTML 页面,请支持账户与日期筛选,以及导出查询结果。

页面可按 制作与使用 HTML 扩展 加入 QPro 的扩展板块。需要导入最新数据时,可以再明确要求 Agent “先同步并解析最新结算数据,再重新查询”。已有本地数据的查询无需每次刷新。

启用与首次使用

  1. 使用包含此功能的 QPro 版本,按 快速开始 启用 本地 Api 接口,重启并重新登录。

  2. 账户持仓监控 中确认 绩效分析 Api 服务端口,默认是 8815;修改后需要重启。

  3. 检查服务是否可用。首次使用或需要最新数据时,依次执行同步、解析,再查询可用账户与历史记录。

检查服务 → 同步结算数据 → 解析结算数据 → 选择账户 → 查询历史记录

只读取已经准备好的历史数据时,可直接从“选择账户”开始。QPro 负责启动服务和访问上游所需的登录身份,调用方不需要填写访问令牌。服务仅监听本机,详细访问边界见 快速开始 的安全说明。

备注

可查范围取决于上游已有的结算数据以及本地同步、解析结果。启动服务或健康检查成功,不代表历史数据已经完整。若上游没有某个账户或交易日的数据,本接口也无法补出这些记录。

刷新与选择账户

首次导入或需要最新数据时,按 同步与解析结算数据 依次调用同步和解析接口,并检查返回的失败计数。然后用 GET /account-infos 获取可查询账户,原样使用期货公司名称和客户号。

已有本地数据时可以直接查询,不必每次筛选都同步。下面的三个示例分别适合临时查看、批量导出和制作页面。

示例一:用 PowerShell 查看历史权益与资金占用

先调用 /account-infos,从结果中选定账户,再替换下方名称、客户号和日期。示例将 JSON 显式编码为 UTF-8,兼容包含中文期货公司名称的请求。

$baseUrl = "http://127.0.0.1:8815"
$query = @{
    start_date = "2026-08-01"
    end_date = "2026-08-31"
    accounts = @(@{
        futures_company_name = "示例期货公司"
        client_id = "000001"
    })
}
$body = [System.Text.Encoding]::UTF8.GetBytes(($query | ConvertTo-Json -Depth 4))
$result = Invoke-RestMethod -Method Post -Uri "$baseUrl/accounts/query" `
    -ContentType "application/json; charset=utf-8" -Body $body
if ($result.code -ne 0) { throw $result.message }
$result.data.accounts | Select-Object trading_day, currency, client_equity, `
    deposit_withdrawal, commission, margin_occupied, fund_available, risk_degree

这些列可以用来制作每日权益与保证金曲线。risk_degree 是小数比例,例如 0.2 应显示为 20%。资金、手续费等缺失值应保留为空,不要在展示或计算时直接补零。

示例二:用 Python 导出历史数据并汇总手续费

下载 完整 Python 示例。脚本只依赖 Python 3 标准库,无需安装第三方包。首先列出可查询账户:

python settlement_export.py --list-accounts

首次使用且需要导入最新数据时,可以添加 --refresh。它会依次同步、解析,检查本轮失败计数后再读取账户列表:

python settlement_export.py --refresh --list-accounts

选定账户后导出一个日期区间,示例账户需要替换为实际返回值:

python settlement_export.py --company "示例期货公司" --client "000001" `
    --start-date 2026-08-01 --end-date 2026-08-31

修改服务端口时传入 --base-url http://127.0.0.1:你的端口。默认只查询已解析数据;只有显式添加 --refresh 才会同步和解析。刷新耗时较长时,脚本为每个刷新请求设置了 600 秒超时。

脚本自动新建带时间戳的输出目录,产生以下文件:

示例输出

文件

用途

records.json

保存查询条件、导出时间和三类完整记录,保留字符串标识符与 null

accounts.csv

每日账户资金,可用于制作权益、出入金和资金占用曲线

trades.csv

取齐分页后的历史成交明细

positions.csv

取齐分页后的日终持仓汇总

fees_by_contract.csv

按账户、币种、数据来源、交易所和合约汇总成交手续费,并记录缺失手续费的行数

手续费汇总中,只要某组存在缺失手续费,commission_total 就留空,避免把不完整金额作为总额。trade_rows 表示成交记录条数,不是成交手数或完整往返交易次数;币种由同日账户记录关联,缺失时留空,不合并不同币种的金额。

分页实现如下,也可以在自己的程序中复用:

def query_pages(base_url, collection, query, page_size=1000):
    """查询期间应暂停同步与解析;接口不提供跨页快照。"""
    records, offset, expected_total = [], 0, None
    while True:
        data = request(base_url, f"/{collection}/query",
                       {**query, "limit": page_size, "offset": offset}, method="POST")
        if expected_total is None:
            expected_total = data["total"]
        elif data["total"] != expected_total:
            raise RuntimeError("分页期间记录总数变化,请等待刷新结束后重新导出")
        page = data[collection]
        if not page and offset < expected_total:
            raise RuntimeError("分页提前返回空页,未取得全部记录")
        records.extend(page)
        offset += len(page)
        if offset >= expected_total:
            if offset != expected_total:
                raise RuntimeError("返回记录数量与 total 不一致")
            return records


导出时保持查询区间的数据不变。脚本能发现翻页过程中总数变化或提前返回空页,但无法检测总数不变的内容更新。CSV 的缺失值为空白;导入 Excel 时请将客户号、成交编号等列设为文本,以保留前导零。需要精确保留原始类型时使用 records.json

示例三:生成历史绩效 HTML 扩展

可以让 Agent 组合本服务与 HTML 扩展能力,制作适合自己的复盘页面。下面两张 AI 生成的效果图使用虚构示例数据,展示可实现的布局与分析方式。

历史绩效看板效果图,包含账户与日期筛选、客户权益与风险度曲线、按合约汇总的成交手续费,以及数据覆盖说明

资金概览:按账户与日期查看客户权益、出入金和风险度,并按合约比较成交费用;同步解析与查询分别操作。

日终持仓效果图,包含选定交易日的多空持仓对比、账户保证金占用及持仓明细,并将缺失均价标为空值

日终持仓:选择交易日查看各合约的多空数量、账户保证金和持仓明细,缺失字段保留为空,不补成零。

可以把下面的需求交给 Agent,再按自己的复盘习惯调整展示内容:

使用 QPro 的 analyse-server-settlement-data 和 build-qpro-extension-html Skills,
生成一个单文件 HTML 历史绩效看板。
从 /account-infos 读取账户,允许选择日期区间。
展示每日客户权益、出入金、手续费和风险度,按合约汇总成交费用,
并支持查看某个交易日的多空持仓及保证金。
成交和持仓必须取完全部分页;缺失数据展示为缺失,不补成零。
显示实际覆盖日期、数据来源与币种。
提供单独的“同步并解析”按钮,完成后重新查询,不在每次筛选时刷新。

浏览器调用查询接口时使用 JSON POST,例如:

async function queryAccounts(selectedAccounts, startDate, endDate) {
  const response = await fetch("http://127.0.0.1:8815/accounts/query", {
    method: "POST",
    headers: {"Content-Type": "application/json; charset=utf-8"},
    body: JSON.stringify({
      start_date: startDate, end_date: endDate, accounts: selectedAccounts
    })
  });
  const result = await response.json();
  if (!response.ok || result.code !== 0) {
    throw new Error(result.message || `HTTP ${response.status}`);
  }
  return result.data.accounts;
}

如何理解历史数据

  • 数据来源source_typeObserveSettlement 时来自结算单;为 ObserveSnap 时来自支持的快期模拟日快照。两类来源的字段覆盖可能不同,应保留来源并检查所需字段是否存在。

  • 权益与收益:客户权益变化可能包含出入金,不能直接当作交易收益或净值回报。绘制收益率、回撤或计算风险调整指标前,应明确现金流处理、币种、期权市值、费用和缺失交易日口径。

  • 费用与盈亏:账户手续费与成交手续费汇总是不同层级的统计,不要重复扣减。单独的成交平仓盈亏不能代表整个账户的每日盈亏,也不能直接用于计算完整交易胜率。

  • 合约标识instrument_idexchange 保留来源中的表示,合约不保证带 交易所. 前缀。连接行情 API 前,应按交易所和合约核对映射;持仓记录本身不包含 exchange 字段,不要直接假设合约代码在各服务中完全相同。

  • 缺失与零:空成交、空持仓可能是当天确实没有相应业务,也可能是数据尚未齐全。应结合账户记录、同步解析计数和原始结算数据确认,不能仅凭空列表推断账户没有交易。