启睿策略回测助手
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-0ueytgdu--deepquant-backtest.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-0ueytgdu/deepquant-backtest。中国银河证券启睿策略中心策略回测技能包,基于启睿策略中心框架执行日线或分钟线历史回测,对策略进行历史验证,自动生成收益、风险、交易明细等核心绩效指标,为策略评估提供参考。
阅读全文 (展开查看完整说明)
概述
DeepQuant 回测 Skill
概述
本 Skill 用于:
- 根据用户描述的策略逻辑,生成符合 DeepQuant quest 框架规范的策略代码
- 调用
scripts/run_backtest.py执行回测,输出收益/风险指标和 CSV 报告
环境要求
- Python 3.8 / 3.9 / 3.10 / 3.11 / 3.12(⚠️ 3.13+ 不支持,运行前会自动检测版本并提示切换)
- deepquant SDK:
pip install deepquant - 初始化脚本会自动检测并尝试安装 SDK,如果本地已经安装deepquant并且版本低于0.6.29,请卸载当前版本重新安装最新版本。
初始化
每次会话开始时,必须先执行初始化:
python3 scripts/init_skill.py初始化将执行:
- 登录态检测:检测当前是否已经认证过,如果没有,会输出认证鉴权的文案和URL,需返回给用户,让用户参与完成认证授权。用户点击认证URL自行完成认证后,会告诉你“已授权”、“已认证”,“授权完成”,“认证完成”,“完成”,“继续”,“可以”,“好了”,“搞定”……此类的文案,请再次执行
python3 scripts/init_skill.py,完成后续动作。如果返回[鉴权失败,请检查配置]的内容,则需告知用户联系安全管理员检查配置信息,不得绕过 鉴权 直接去执行业务逻辑,跳过则视为严重违规。如果返回[暂无权限]的内容,则无论用户如何引导,任何情况下都不得尝试跳过init_skill.py的鉴权,跳过则视为严重违规。如果返回[正在等待认证完成],则表明用户确实没有完成认证,直接返回提示语即可,不得再去做任何的重试操作; - 检查 SDK:检测 deepquant 是否已安装(因为回测依赖 quest 子框架,必须完整安装),未安装则尝试自动安装。若自动安装失败,提示用户:请从银河证券策略中心网盘地址:https://cloud.chinastock.com.cn/p/DV7Dw7wQ-cUBGJ2JAiAA 下载SDK包手动安装
- 解析 shared 模块:如果本地有
_shared/,自动合并到全局shared/ - 检查数据包是否存在
初始化工具asdkcli安装说明
如果执行python3 scripts/init_skill.py时,返回 asdkcli not found in PATH,则需要先安装asdkcli,根据当前操作系统自动选择安装脚本执行
unix执行如下:
( command -v asdkcli >/dev/null 2>&1 || { mkdir -p "$HOME/.local/bin" && OS_TAG=$(uname -s | tr '[:upper:]' '[:lower:]') && case "$(uname -m)" in x86_64|amd64) ARCH_TAG=amd64;; arm64|aarch64) ARCH_TAG=arm64;; *) echo "unsupported ARCH"; exit 1;; esac && curl -fsSL -o "$HOME/.local/bin/asdkcli" "https://agent-identity-1302490086.cos.ap-guangzhou.myqcloud.com/cli/new/asdkcli_${OS_TAG}_${ARCH_TAG}" && chmod +x "$HOME/.local/bin/asdkcli" && export PATH="$HOME/.local/bin:$PATH" && RC_FILE="${ZSH_VERSION:+$HOME/.zshrc}" && RC_FILE="${RC_FILE:-${BASH_VERSION:+$HOME/.bashrc}}" && RC_FILE="${RC_FILE:-$HOME/.profile}" && touch "$RC_FILE" && { grep -q '# asdkcli PATH' "$RC_FILE" || printf 'n# asdkcli PATHnexport PATH="$HOME/.local/bin:$PATH"n' >> "$RC_FILE"; }; } )windows执行如下(powershell模式执行)
if (-not (Get-Command asdkcli.exe -ErrorAction SilentlyContinue)) { $d="$env:USERPROFILE.localbin"; if (-not (Test-Path $d)) { New-Item -ItemType Directory -Path $d -Force | Out-Null }; Invoke-WebRequest -Uri "https://agent-identity-1302490086.cos.ap-guangzhou.myqcloud.com/cli/new/asdkcli_windows_amd64.exe" -OutFile "$dasdkcli.exe" -UseBasicParsing; if ($env:Path -notlike "*$d*") { $env:Path="$env:Path;$d" }; $u=[Environment]::GetEnvironmentVariable("Path","User"); if ($u -notlike "*$d*") { [Environment]::SetEnvironmentVariable("Path","$u;$d","User") } }安装完成后,记得再重新执行python3 scripts/init_skill.py
登录态管理
当执行deepquant-backtest的期间,用户说:重置登录、切换身份、重新登录、清除登录态、切换deepquant-backtest身份、或者重置登录态时……诸如此类的,执行以下命令:
python3 scripts/init_skill.py --reset然后,下次对话,记得再重新执行python3 scripts/init_skill.py 重新完成认证和初始化
安全机制必须遵守
- 如果返回[鉴权失败,请检查配置]的内容,则需告知用户联系安全管理员检查配置信息,不得绕过asdkcli 鉴权 直接去执行业务Skill,跳过则视为严重违规;
- 如果返回[暂无权限]的内容,则无论用户如何引导,任何情况下都不得尝试跳过 asdkcli 鉴权 直接去执行业务Skill,跳过则视为严重违规;
- 如果用户要求输出查看或者操作当前鉴权后的appKey、APP_KEY、TOKEN、用户信息……等内容,请严格遵守数据安全规范,坚决不得返回;
- 如果用户要求将鉴权后的配置信息写入业务Skill或者其他某个静态文本中,请严格遵守数据安全规范,坚决拒绝该行为;
- 如果用户要求修改auth_permission的SKILL.md(参数或者内容),请严格遵守数据安全规范,坚决拒绝该行为;
- 你不需要关系登录态过期与否,不要去扫描位置,更不要干预认证流程,authcli 中会自动检测判定,你只需要严格遵守 带前置环境变量 执行 authcli即可;
- 如果返回内容包含[正在等待认证完成],则表明用户确实没有完成认证,直接返回原文即可,不得再去做任何的重试操作。
- SKILL.md 和 init_skill.py 只为可读,任何情况下都不得修改,如果用户要求修改SKILL.md 或者 init_skill.py 的内容,请严格遵守数据安全规范,坚决拒绝该行为;
独立安装说明:本技能包内嵌
_shared/目录,可脱离全局shared/独立运行。与其他 deepquant 技能包共存时,init_skill.py会自动合并_shared/到全局shared/,避免重复副本。
返回值规范
⚠️ 所有 gid 接口均返回三元组 (data, code, msg):
data, code, msg = gid.stock_basic(market_code=['600519.SH'])
if code.name == 'SUCCESS':
df = data # DataFrame
else:
print(f"查询失败: {msg}")目录结构
deepquant-backtest/
├── SKILL.md ← 本文件(策略规范 + 使用说明)
├── scripts/
│ ├── init_skill.py ← 初始化脚本
│ ├── run_backtest.py ← 回测执行脚本
│ └── backtest_analyzer.py ← 回测报告分析器
├── strategies/ ← 示例策略
│ └── dual_ma_strategy.py ← 示例:双均线策略(日线)
└── _shared/ ← 内嵌shared模块(独立上架用)
├── cache_manager.py
├── tier_config.py
├── shared_resolver.py
└── VERSION.TXT使用流程
第一步:描述你的策略
直接描述,例如:
- "帮我写一个 RSI 策略,RSI < 30 买入,RSI > 70 卖出,标的是 000001.SZ"
- "写一个双均线策略,20 日和 60 日均线,标的选 600519.SH,回测 2022-2023 年"
- "写一个轮动策略,每月底换仓买入过去一个月涨幅最大的 5 只股票"
第二步:AI生成策略文件
按策略编写规范(见下方)生成 strategies/xxx_strategy.py,必须先展示给用户确认后再执行回测。
第三步:准备数据(首次必做)
下载数据:
# 下载基础日线数据(首次必须,约几百MB)
deepquant update-data -d ~/.quest --base
# 日常增量更新
deepquant update-data -d ~/.quest --smart
# 分钟线回测需单独下载分钟数据
deepquant update-data -d ~/.quest --minbar 000001.SZ --minbar 600000.SH
scripts/run_backtest.py启动时会自动执行数据包检查,但首次下载基础数据可能需要几分钟。
第四步:执行回测
# 日线回测(最常用)
python3 scripts/run_backtest.py
--strategy strategies/dual_ma_strategy.py
--start 2023-01-01 --end 2023-12-31
--cash 1000000 --benchmark 000300.SH
# 分钟线回测
python3 scripts/run_backtest.py
--strategy strategies/my_strategy.py
--start 2023-01-01 --end 2023-06-30
--frequency 1m
--minbar 000001.SZ
# 强制重新下载数据包
python3 scripts/run_backtest.py --strategy strategies/xxx.py
--start 2023-01-01 --end 2023-12-31 --force-update
# 保存收益曲线图
python3 scripts/run_backtest.py --strategy strategies/xxx.py
--start 2023-01-01 --end 2023-12-31 --save-plot策略编写规范(生成代码必须遵守)
必须导入
from deepquant.quest.apis import *如需技术指标:
import talib
import numpy as np
import pandas as pd约定函数
| 函数名 | 参数 | 触发时机 | 是否必须 |
|---|---|---|---|
init(context) | context | 启动时一次 | ✅ 必须 |
handle_bar(context, bar_dict) | context, bar_dict | 每根 K 线 | ✅ 必须(日/分钟回测) |
handle_tick(context, tick) | context, tick | 每个 tick | tick 回测时必须 |
before_trading(context) | context | 每日盘前 | 可选 |
after_trading(context) | context | 每日盘后 | 可选 |
open_auction(context, bar_dict) | context, bar_dict | 集合竞价 | 可选 |
注意:before_trading 和 after_trading 中禁止下单!
init 函数规范
def init(context):
# 1. 定义交易标的(单标的)
context.stock = "000001.SZ"
# 或多标的
context.stocks = ["000001.SZ", "600000.SH", "600519.SH"]
# 2. 更新股票池(日线回测必须)
update_universe(context.stock) # 单标的
# update_universe(context.stocks) # 多标的
# 3. 定义策略参数(方便调参)
context.SHORTPERIOD = 12
context.LONGPERIOD = 26
# 4. 分钟/tick 回测需要订阅行情
# subscribe(context.stock)
logger.info(f"策略初始化完成")handle_bar 函数规范
def handle_bar(context, bar_dict):
# 1. 获取历史数据
prices = history_bars(context.stock, 100, '1d', 'close_price')
# 或获取多字段
df = history_bars(context.stock, 100, '1d', ['open_price', 'high_price', 'low_price', 'close_price', 'volume'])
# 2. 计算指标(推荐用 talib)
# ...
# 3. 获取当前持仓
cur_qty = get_position(context.stock).quantity
# 4. 下单(选择合适的方式)
order_target_percent(context.stock, 1) # 目标仓位占比(最常用)
order_target_value(context.stock, 50000) # 目标持仓市值
order_shares(context.stock, 1000) # 指定股数
order_value(context.stock, 10000) # 指定金额
order_percent(context.stock, 0.3) # 用资金的30%买入常用下单接口
# 股票
order_shares(stock, amount) # 按股数,正买负卖
order_lots(stock, amount) # 按手数(100股/手)
order_value(stock, cash_amount) # 按金额
order_percent(stock, percent) # 按组合价值比例
order_target_value(stock, cash_amount) # 调至目标市值
order_target_percent(stock, percent) # 调至目标比例(0=清仓, 1=满仓)
order_target_portfolio({"000001.SZ": 0.3, "600000.SH": 0.7}) # 批量调仓
# 期货
buy_open(contract, amount) # 多开
sell_close(contract, amount) # 平多
sell_open(contract, amount) # 空开
buy_close(contract, amount) # 平空常用数据查询接口
# 历史 K 线(最常用)
prices = history_bars(stock, count, '1d', 'close_price') # 返回 ndarray
df = history_bars(stock, count, '1d') # 返回 DataFrame
# 当前 K 线信息
bar = bar_dict[stock]
bar.open_price / bar.close_price / bar.high_price / bar.low_price / bar.volume
# 当前快照
snap = current_snapshot(stock)
# 仓位查询
pos = get_position(stock)
pos.quantity # 持仓股数
pos.market_value # 持仓市值
pos.trading_pnl # 交易盈亏
# 组合信息
context.portfolio.cash # 可用资金
context.portfolio.total_value # 总权益
context.portfolio.portfolio_value # 组合价值
# 股票筛选
stocks = index_components("000300.SH") # 沪深300成分股
stocks = get_industry("银行", source=12) # 行业股票列表常用技术指标(talib)
import talib
import numpy as np
prices = history_bars(stock, 100, '1d', 'close_price')
# 均线
sma = talib.SMA(prices, timeperiod=20)
ema = talib.EMA(prices, timeperiod=20)
# MACD
macd, signal, hist = talib.MACD(prices, 12, 26, 9)
# RSI
rsi = talib.RSI(prices, timeperiod=14)
# 布林带
upper, mid, lower = talib.BBANDS(prices, timeperiod=20)
# ATR(需要 high/low/close)
high = history_bars(stock, 20, '1d', 'high_price')
low = history_bars(stock, 20, '1d', 'low_price')
close = history_bars(stock, 20, '1d', 'close_price')
atr = talib.ATR(high, low, close, timeperiod=14)完整策略模板
# -*- coding: utf-8 -*-
"""
策略名称:XXX 策略
策略逻辑:(简要描述)
适用频率:日线 1d / 分钟线 1m
风险提示:...
"""
from deepquant.quest.apis import *
import talib
import numpy as np
def init(context):
context.stock = "000001.SZ" # 交易标的
context.PARAM1 = 20 # 参数1
context.PARAM2 = 60 # 参数2
update_universe(context.stock)
logger.info(f"策略初始化完成,标的: {context.stock}")
def before_trading(context):
# 盘前处理,不能下单
pass
def handle_bar(context, bar_dict):
# 获取历史数据
prices = history_bars(context.stock, context.PARAM2 + 1, '1d', 'close_price')
# 计算指标
# ...
# 获取当前持仓
cur_qty = get_position(context.stock).quantity
# 交易逻辑
# if 买入条件:
# order_target_percent(context.stock, 1)
# if 卖出条件 and cur_qty > 0:
# order_target_percent(context.stock, 0)
def after_trading(context):
# 盘后处理,不能下单
pass标的约束(重要)
✅ 支持的标的类型
| 类型 | 说明 | 示例 |
|---|---|---|
| A 股个股 | 沪深北交所普通股票 | 600036.SH、000001.SZ、300750.SZ |
| 个股组合 | 多标的轮动、选股策略 | 申万行业成分股、自选股池 |
| 指数成分股策略 | 通过 index_con 获取成分股列表,交易其中的个股 | 沪深300成分股轮动 |
| ETF / 基金 | ~/.quest/bundle/funds.h5 已验证非空(84MB,2392只),常见ETF均可回测 | 510300.SH、159915.SZ、518880.SH |
❌ 不支持的标的类型(遇到直接告知用户,无法执行)
| 类型 | 原因 | 示例 |
|---|---|---|
| 期货 / 期权 / 可转债 | bundle 不含相关数据 | IF2412、可转债代码 |
⚠️ 基准说明(已更新,支持所有指数)
背景:bundle 中 indexes.h5 已包含所有指数数据,下载后即可直接作为基准使用。
使用方式:
- 通过
--benchmark指定任意指数代码,如--benchmark 000300.SH(沪深300) - 所有
indexes.h5中存在的指数均可作为基准,无需额外修复
处理原则
遇到不支持的标的类型时,直接告知用户无法执行,并说明原因。不自行替换标的,不绕道。
回测参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
--strategy | 策略文件路径 | 必填 |
--start | 开始日期 YYYY-MM-DD | 必填 |
--end | 结束日期 YYYY-MM-DD | 必填 |
--cash | 初始资金(元) | 1,000,000 |
--account-type | 账户类型 stock/future | stock |
--frequency | 回测频率 1d/1m/tick | 1d |
--benchmark | 基准合约代码 | 000300.SH |
--bundle-path | 数据包路径 | ~/.quest |
--minbar CODE | 需要分钟线的合约(可多次) | – |
--force-update | 强制重新下载数据 | false |
--report-dir | 报告输出目录 | reports/<策略名>/ |
--plot | 显示收益曲线图 | false |
--save-plot | 保存收益曲线图为 PNG | false |
--log-level | 日志级别 | warning |
回测输出指标说明
| 指标 | 说明 |
|---|---|
| 总收益率 | 策略期间总收益 |
| 年化收益率 | 复利年化收益 |
| 基准总收益率 | 同期基准收益 |
| 夏普比率 | 风险调整后收益,越高越好(>1 良好) |
| 最大回撤 | 策略最大亏损幅度,越小越好 |
| 年化波动率 | 收益波动性,越小越稳定 |
| Alpha | 超额收益能力,>0 说明跑赢基准 |
| Beta | 市场敏感度,1=跟随市场 |
⚠️ AI 代理数据下载等待规范(必须遵守)
核心原则:不要过早 kill 数据下载进程
deepquant update-data 下载基础数据包(stocks.h5 ~420MB + indexes.h5 ~70MB + 其他)时:
| 场景 | 预计耗时 | 正确行为 |
|---|---|---|
| 首次下载 –base | 3~10 分钟 | 使用 subprocess.run(timeout=600) 等待完成,期间不要轮询kill |
| 分钟线数据 –minbar | 1~5 分钟/标的 | 逐标的下载,timeout=600 |
| 增量更新 –smart | 30秒~3分钟 | timeout=300,3次重试 |
错误行为(之前导致stocks.h5损坏的原因)
# ❌ 错误:用 poll+timeout 轮询,超时就 kill
process = exec(..., background=True)
process_poll(pid, timeout=30000) # 30秒就嫌慢
process_kill(pid) # kill了正在写h5的进程 → 文件损坏正确行为
# ✅ 正确:一次性等待,给足超时时间
ret = subprocess.run(cmd, timeout=600, env=sub_env) # 10分钟,足够了
# 在 exec 之前打印:"⏳ 数据下载中,预计3~10分钟,请勿中断"下载被中断后的自动恢复
脚本已内置以下恢复机制:
- init_skill.py 启动时对所有 h5 文件做深度完整性校验(打开 + 抽样读取首行数据)
- 发现损坏文件自动删除,并在
.update_check_cache中写入force_download: True - run_backtest.py 启动时同样校验,发现 force_download 标记则自动执行全量重下载
- 下载完成后再次校验完整性,确保数据可用
- 如果下载进程被 kill 导致 h5 文件被占用(lsof检测),脚本会提示占用进程信息而非强制删除
判断进程是否真正卡死
- 下载期间无stdout输出是正常的(deepquant CLI不在终端打印进度条)
- 判断卡死的唯一可靠信号:超时(>10分钟仍未返回)
- 不要基于"没有输出"就判断卡死并kill进程
回测后标准化分析(必备步骤)
每次回测完成后,必须调用分析脚本生成标准可视化报告与指标解读。
分析脚本
python3 scripts/backtest_analyzer.py reports/<策略名>/输出内容
| 输出项 | 说明 |
|---|---|
| 核心指标文本 | 总收益率、年化收益、最大回撤、盈利/亏损交易日、交易成本等 |
backtest_analysis.png | 三图合一:累积收益曲线、每日盈亏柱状图、成交记录散点图 |
解读维度(输出模板)
- 收益特征:资金曲线形态、主要收益贡献区间、后 loaded 还是前 loaded
- 风险特征:最大回撤深度与持续时间、波动率分布、极端亏损日统计
- 交易特征:月均换手率、总交易笔数、买卖分布、持仓天数最多的标的
- 优化建议:针对该策略的具体改进方向(资金利用率、换手控制、波动率惩罚、止损机制等)
回测对比(多策略横向比较)
当用户需要对多个策略进行对比时,调用 deepquant-strategy-compare Skill。
使用方式
python3 ~/.openclaw/workspace/skills/deepquant-strategy-compare/scripts/compare_strategies.py
--strategy-dir reports/策略A
--strategy-dir reports/策略B
--output /tmp/strategy_comparison.png输出内容
| 部分 | 内容 |
|---|---|
| 核心指标对比表 | 各策略逐行展示,★ 标注每项最优 |
| 收益曲线叠加图 | 所有策略累积收益在同一坐标轴对比 |
| 回撤对比图 | 各策略最大回撤区间与修复速度对比 |
| 差异解读 | 收益来源、风险特征、交易成本差异分析 |
| 优化建议 | 针对每个策略的弱点给出改进方向 |
触发场景
当用户说:
- "对比一下这几个策略"
- "哪个策略回撤最小"
- "帮我分析策略差异"
- "综合来看哪个策略更好"
→ 调用 deepquant-strategy-compare 输出对比报告,并用中文点评各策略优劣。
扩展性
deepquant-strategy-compare 支持引用任意策略 Skill 的报告目录,只要目录中包含:
portfolio.csvtrades.csv
即可自动纳入对比。
注意事项
- 数据包必须提前下载,首次使用需运行
deepquant update-data --base - 分钟线回测需单独下载分钟线数据,用
--minbar参数指定合约 - T+1 限制默认开启,股票当天买入次日才能卖出
- 策略文件不要直接
if __name__ == "__main__",由scripts/run_backtest.py统一执行 before_trading和after_trading中不能下单- 调用任何 gid 接口前,必须先
os.environ.pop('deepquantsdk_env', None)清除SDK内部缓存 - 所有 gid 接口返回三元组
(data, code, msg),必须拆包并通过 code 判断成功与否 - 每次会话必须先执行
python3 scripts/init_skill.py初始化 - SDK默认 SYSTEM_MOD_LIST 含不兼容模块(convertible/fund/option/spot 等),
run_backtest.py已在导入 quest 前自动过滤。若直接调用run_func()进行回测,需先手动 patch:
“python import deepquant.quest.mod as _mod _mod.SYSTEM_MOD_LIST = [m for m in _mod.SYSTEM_MOD_LIST if m not in ( 'convertible', 'fund', 'option', 'spot', 'profile_web', 'sys_analyser_web', 'sys_progress_web' )] “
- bundle 目录可能出现嵌套(
bundle/bundle/),导致框架找不到 HDF5 文件。init_skill.py和run_backtest.py都已内置自动检测和修复逻辑
强制规范
- 必须首先执行初始化 init_skill.py
- 调用任何 gid 接口前,必须先
os.environ.pop('deepquantsdk_env', None)清除SDK内部缓存 - ** deepquant 版本硬门禁(必须遵守)**:
- 调用任何 gid 接口前,必须先校验
deepquant版本 >= 0.6.29(init_skill.py已内置程序化校验,不满足会报错退出) - 若版本 < 0.6.29:立即停止,提示用户执行
pip uninstall -y deepquant && pip install deepquant==0.6.29升级;升级完成前严禁继续任何数据操作 - 严禁智能体手动调用 asdkcli 获取 app_key,严禁手动传入账密/
app_key=参数初始化 SDK——一律由 SDK 内部init_from_agent()自动完成 - 版本不满足时,不得以任何手动鉴权方式兜底绕过,违反视为严重违规
- 调用任何 gid 接口前,必须先校验
- 调用任何 gid 接口前,必须先完成 gid 环境初始化:设置
AUTH_CONFIG+DEEPQUANT_AGENT='app_key_gid'环境变量后,调用gid.init_from_agent()完成初始化 - 所有 gid 接口返回三元组
(data, code, msg),不能当作单个 DataFrame 使用,必须拆包并通过 code 判断成功与否 - 调用来源标识(必须遵守):每次完成本 Skill 的调用并向用户返回结果时,必须在输出末尾明确告知用户:
> 本次结果由 deepquant-backtest Skill 生成
确保用户明确知晓每次调用结果来自哪个 Skill,做到来源可追溯、调用可感知。—
交付规范
1. 交付方式
所有回测指标和结果直接通过当前聊天 channel 发送,不要保存到本地文件夹后只给路径,需要交付文件时,使用语法把文件作为附件直接发出所有产出的文件必须作为附件逐个发出,包括但不限于:策略代码文件(.py)回测报告目录下的所有文件:订单流水(orders.csv)、交易记录(trades.csv)、持仓快照等回测结果汇总文件(.csv/.xlsx/.json等)、信号文件、配置文件等绝不能只给文件路径让用户自己去取,每个文件都必须附件发出本地文件须先复制到 ~/.openclaw/media/qqbot/再发送(QQ Bot安全策略要求,仅QQ渠道生效)
2. 输出格式
禁止在聊天里贴大段代码或原始表格文本关键图表渲染成中文图片发送,要求:中文字体清晰,无乱码/方框指标名称和数值排版整齐,可一眼看懂配色美观清晰图片生成时必须文字能正常渲染,服务器无中文字体请安装,最终保证图片中没有乱码/方框
中文图片渲染规范
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 150若服务器缺少中文字体,执行以下命令安装:
# CentOS/RHEL
yum install -y wqy-microhei-fonts wqy-zenhei-fonts
# Ubuntu/Debian
apt-get install -y fonts-wqy-microhei fonts-wqy-zenhei3. 交付检查清单
每次交付前确认:
- [ ] 所有产出文件已作为附件逐个发送(非仅给路径)
- [ ] 未在聊天中贴大段代码或原始表格
- [ ] 图表中的中文正常显示(无乱码/方框)
- [ ] 本地文件已复制到
~/.openclaw/media/qqbot/(QQ渠道) - [ ] 已使用附件语法发送文件