历史绩效分析与导出
本指南从准备数据开始,演示如何查看历史权益、导出资金与交易记录,并制作 HTML 绩效看板。使用 8815 的绩效分析服务;HTTP 契约见 历史绩效 API,字段定义见 历史绩效字段。
先让 AI 使用绩效分析 Skill
按 先用 QPro Skills,让 AI 快速实现需求 安装或更新 QPro Skills 后,Agent 可以使用 analyse-server-settlement-data 查询本服务。可以直接提出以下需求:
请使用 QPro 绩效分析 Skill,列出可查询的账户,让我选择账户和日期区间。
根据已解析的结算数据,生成每日客户权益、出入金、手续费和保证金报表,
并按合约汇总成交手续费。保留缺失值,展示实际数据覆盖日期。
如果做成 HTML 页面,请支持账户与日期筛选,以及导出查询结果。
页面可按 制作与使用 HTML 扩展 加入 QPro 的扩展板块。需要导入最新数据时,可以再明确要求 Agent “先同步并解析最新结算数据,再重新查询”。已有本地数据的查询无需每次刷新。
启用与首次使用
使用包含此功能的 QPro 版本,按 快速开始 启用
本地 Api 接口,重启并重新登录。在
账户持仓监控中确认绩效分析 Api 服务端口,默认是8815;修改后需要重启。检查服务是否可用。首次使用或需要最新数据时,依次执行同步、解析,再查询可用账户与历史记录。
检查服务 → 同步结算数据 → 解析结算数据 → 选择账户 → 查询历史记录
只读取已经准备好的历史数据时,可直接从“选择账户”开始。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 秒超时。
脚本自动新建带时间戳的输出目录,产生以下文件:
文件 |
用途 |
|---|---|
|
保存查询条件、导出时间和三类完整记录,保留字符串标识符与 |
|
每日账户资金,可用于制作权益、出入金和资金占用曲线 |
|
取齐分页后的历史成交明细 |
|
取齐分页后的日终持仓汇总 |
|
按账户、币种、数据来源、交易所和合约汇总成交手续费,并记录缺失手续费的行数 |
手续费汇总中,只要某组存在缺失手续费,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_type为ObserveSettlement时来自结算单;为ObserveSnap时来自支持的快期模拟日快照。两类来源的字段覆盖可能不同,应保留来源并检查所需字段是否存在。权益与收益:客户权益变化可能包含出入金,不能直接当作交易收益或净值回报。绘制收益率、回撤或计算风险调整指标前,应明确现金流处理、币种、期权市值、费用和缺失交易日口径。
费用与盈亏:账户手续费与成交手续费汇总是不同层级的统计,不要重复扣减。单独的成交平仓盈亏不能代表整个账户的每日盈亏,也不能直接用于计算完整交易胜率。
合约标识:
instrument_id、exchange保留来源中的表示,合约不保证带交易所.前缀。连接行情 API 前,应按交易所和合约核对映射;持仓记录本身不包含exchange字段,不要直接假设合约代码在各服务中完全相同。缺失与零:空成交、空持仓可能是当天确实没有相应业务,也可能是数据尚未齐全。应结合账户记录、同步解析计数和原始结算数据确认,不能仅凭空列表推断账户没有交易。