一、先跑原生实验,再决定是否添加摘要层
锁定源码的 qlib/cli/run.py 解析 workflow YAML,初始化 qlib,交给 task_train。示例Alpha158配置明确使用LGBModel、DatasetH,并记录SignalRecord、SigAnaRecord和PortAnaRecord;这里的模型是原生预测模型,不是填一个OpenAI模型名就自动替换。
本文给出的兼容接口仅属于外部报告摘要。原生数据、特征、训练、回测与指标应先完成,再带日期、基准和成本口径交给脚本。RD-Agent是独立项目,不能把其环境配置冒称为Qlib默认读取,也不能把通用配图当作真实训练截图。
二、环境准备
先按官方版本安装Qlib并确认日频数据目录。所列qrun命令从examples目录执行,使用实际存在的Alpha158文件;不是旧文档中缺少后缀的配置路径。没有数据时先停在数据准备。
- 按锁定Qlib版本安装,准备provider_uri对应真实数据,并核对市场、基准和训练/验证/测试区间。
- 示例Alpha158 YAML使用LightGBM和固定历史期,不是实时策略或高频LLM入口。
- report.json至少含workflow、period、benchmark、costs、metrics,保留实验ID、配置和原始指标。
- 独立Python摘要脚本默认离线;未运行qrun、训练、回测、RD-Agent或API。
继续配置 Qlib
先看对应接入页,核对本文的配置字段与验证步骤,再回到原运行环境测试。
三、原生凭据与可选摘要Key
原生模型、数据凭据按上游单独准备。只有主动运行本页作者的独立摘要脚本时,才从tokenba_API_KEY和tokenba_MODEL读取兼容接口配置;这两个变量不会让原生训练自动调用API。
四、修改 Qlib 模型配置
上方作者脚本另存summarize_qlib.py。report.json必须包含workflow、period、benchmark、costs、metrics,来自真实已完成实验;保持含成本/不含成本两组指标和原始单位。
import argparse
import json
import os
from pathlib import Path
from urllib.error import HTTPError
from urllib.request import Request, urlopen
parser = argparse.ArgumentParser()
parser.add_argument("input", type=Path)
parser.add_argument("--run", action="store_true")
args = parser.parse_args()
report = json.loads(args.input.read_text(encoding="utf-8"))
required = ['workflow', 'period', 'benchmark', 'costs', 'metrics']
missing = [name for name in required if name not in report]
if missing:
raise SystemExit("缺少报告字段: " + ", ".join(missing))
text = json.dumps(report, ensure_ascii=False)
if len(text) > 40000:
raise SystemExit("先按同一实验范围筛选输入,不能静默截断报告")
if not args.run:
print(json.dumps({"mode": "dry-run", "fields": list(report), "characters": len(text)}, ensure_ascii=False))
raise SystemExit(0)
output = args.input.with_name(args.input.stem + ".tokenba-response.json")
if output.exists():
raise SystemExit("输出已存在,请先归档或换输入版本")
model = os.environ["tokenba_MODEL"]
key = os.environ["tokenba_API_KEY"]
body = {"model": model, "messages": [{"role": "system", "content": '仅依据这份 Qlib 已完成实验解释指标。保持测试期、基准、含成本与不含成本分开,不预测未来收益、不生成交易指令。'}, {"role": "user", "content": text}]}
request = Request("https://api.apizt.com/v1/chat/completions", data=json.dumps(body).encode("utf-8"), headers={"Authorization": "Bearer " + key, "Content-Type": "application/json"})
try:
with urlopen(request, timeout=120) as response:
result = json.load(response)
except HTTPError as error:
raise SystemExit(f"HTTP {error.code}:先检查平台记录,本脚本不自动重发") from error
output.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8")
print(output)
Qlib 的配置字段与任务检查
只需要解释真实实验时,再接摘要 API
先保留Qlib原始实验和完整成本口径;apizt用于可选的文字整理,不替代数据准备、预测训练、回测引擎或RD-Agent。默认先做本地检查。
五、检查一个已完成实验,再生成解释
先阅读真实Alpha158 workflow和本地数据可用期,原生qrun完成后导出实验配置、记录和指标。将它们整理成独立report.json,不加--run检查;需要文字解释时再主动联网。
# 已安装并准备对应市场日频数据后,在锁定仓库examples目录
qrun benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
# 将已完成实验导出到独立目录的report.json,再另存上方作者脚本
python summarize_qlib.py report.json
# 设置tokenba_API_KEY和tokenba_MODEL后主动执行
python summarize_qlib.py report.json --run- 原实验的train/valid/test区间、市场和基准明确。
- 指标来自保存的实验记录,不是教程示例收益或模型自造。
- 报告将含成本/不含成本、预测指标与组合指标分开。
- 摘要逐项对回原输出;本文没有运行本地训练或验证收益。
六、查看 apizt 请求日志和成本
保留qrun原始日志、实验ID和回测输出,外部摘要另保存原始HTTP响应。数据缺失、特征计算、LightGBM依赖和API失败分别处理,修改摘要型号不能修复前面的训练数据错误。
适合的量化调用场景
按任务与分组选择模型
Qlib原生模型类和外部Chat模型名称不可互换。选择摘要模型只影响文字解释,不改变回测信号、交易规则或原始指标;也不证明收益可以在未来复现。
七、常见报错排查
先确认原生实验是否完整,再排外部摘要错误。只有一段流畅文字不能证明训练、回测或数据质量。
常见问题
Qlib 回测报告接大模型从哪里配置?
原生 Qlib qrun 读取 workflow YAML,初始化数据、训练 LGBModel,并执行 SignalRecord/SigAnaRecord/PortAnaRecord;它不因为设置 OPENAI_API_KEY 就改成大模型训练。先保存已完成实验,再用本站独立脚本检查报告字段,显式 --run 才调用兼容摘要 API。
设置 API Key 会替换原生训练模型吗?
不会。本文API调用由独立的作者摘要脚本执行,原生数据、模型权重、训练和回测仍由对应上游流程负责。
继续配置 Qlib
先看对应接入页,核对本文的配置字段与验证步骤,再回到原运行环境测试。
参考资料
本文依据下列项目源码说明接入位置与配置字段。不同版本先核对自己的入口和变量;上方通用界面示意不代替实际项目、模型调用与费用验收。
只需要解释真实实验时,再接摘要 API
先保留Qlib原始实验和完整成本口径;apizt用于可选的文字整理,不替代数据准备、预测训练、回测引擎或RD-Agent。默认先做本地检查。
