系统化策略指南
Python 策略编程、回测、参数调优与实盘 Profile 的完整工作流。
用 Python 编写策略 → 历史回测 → 参数调优 → 实盘 Profile:Desic Terminal 的系统化研究把策略从想法带到可审计的自动化执行,且免安装 Python。
1. 核心概念#
| 概念 | 说明 |
|---|---|
| 策略(Strategy) | Python 源码 + 参数,通过受控协议在本地运行时执行 |
| 版本(Version) | 策略源码与参数的不可变快照;回测与 Profile 都绑定具体版本 |
| 回测(Backtest) | 在历史 K 线上按成交假设模拟策略执行,产出权益曲线、成交与统计 |
| 调优(Optimization) | 在参数空间内采样搜索,用训练/验证分段评估 Calmar,找到稳健参数 |
| Profile | 把策略版本、合约、账户与风控预算绑定为实盘信号执行器 |
| 信号(Signal) | Profile 每次 1 分钟收线后的评估结果:动作、阻止原因或执行错误 |
工作流六个标签页:
text
策略(编写/版本)→ 回测 → 调优 → 回顾(结果库)→ Profile(实盘)→ 信号(历史)2. 运行环境#
- 免安装 Python:安装包内置经校验的 CPython 运行时;首次打开系统化研究时自动创建本地环境并安装固定依赖(numpy、pandas、scikit-learn 等),标题栏底部显示准备进度。
- 环境是依赖隔离:策略只能 import 白名单内的库,无法访问网络、文件系统与子进程。
- 环境失败会给出明确指引;开发环境没有内置运行时时会回退到系统 Python 3.12-3.13。
3. 创建策略#
策略 → 新建,从四个模板开始:
| 模板 | 适合场景 |
|---|---|
blank.py | 空白骨架,从零编写 |
ema-trend.py | 双 EMA 趋势跟踪 |
macd-volume-atr.py | MACD + 成交量 + ATR 保护 |
bollinger-reversion.py | 布林带均值回归 |
编辑体验
- 内置 CodeMirror 编辑器,保存即生成新版本。
- AI 策略助手:右侧面板可以多轮讨论策略思路、让 AI 修改代码并在受控环境中有界测试;会话在"AI 策略"分类下独立保存。
- 每次保存都有版本号;回测、调优与 Profile 都引用具体版本,旧版本结果不受新修改影响。
4. 策略编程模型#
策略是一个实现了 on_bar 函数的 Python 模块:
python
def on_bar(ctx):
# ctx: 当前决策点(1m 收线后)的只读上下文
close = ctx.market_series("1m").close(-1) # 最新收盘
ema_fast = ctx.indicator("ema", period=13).value(-1)
ema_slow = ctx.indicator("ema", period=26).value(-1)
fast = float(ctx.params.get("fastPeriod", "13"))
slow = float(ctx.params.get("slowPeriod", "26"))
if ema_fast > ema_slow and ctx.flat():
return ctx.open_long(reason="快线金叉慢线")
if ema_fast < ema_slow and ctx.position("long"):
return ctx.close(reason="快线死叉慢线")
return ctx.no_action(reason="等待交叉")可用能力
| 能力 | 说明 |
|---|---|
ctx.market_series(interval) | 任意内置周期(1m ~ 1M)的 K 线序列,只含截至当前已确认的 bar |
ctx.indicator(...) | 内置指标滚动计算,不逐根重复全量计算 |
ctx.params.get(key, default) | 参数读取,支持字符串/数值 |
ctx.flat() / ctx.position(side) | 当前持仓状态 |
ctx.open_long / open_short | 开仓意图,可带保护单参数 |
ctx.close | 平仓意图 |
ctx.no_action(reason) | 显式空仓等待 |
硬性约束
- 每个 bar 只能返回一个动作;动作只是意图,成交与数量由主机决定。
- 策略看不到未来数据:任何 bar 的收盘时间不得晚于决策点(主机与运行时双重校验)。
- 不允许 import 白名单以外的库、不允许文件/网络/子进程访问。
完整协议见 策略协议规范。
5. 历史回测#
回测 → 配置 → 运行回测
| 参数 | 说明 |
|---|---|
| 策略与版本 | 选择策略与具体版本 |
| 合约 | 回测的交易对(如 BTC-USDT-SWAP) |
| 初始权益 / 杠杆 | 账户起点与杠杆 |
| 评估区间 | 正式评估的开始与结束(最多近一年) |
| 预加载历史 | 评估开始前加载的上下文 K 线(只用于预热指标,不计入权益与统计) |
| 成交假设 | 进出场滑点与手续费、保证金安全系数 |
| 期末处理 | 按最后收盘价盯市 / 强制平仓 |
回测完成后进入回顾标签:
- 权益曲线、最大回撤、胜率、盈亏比等指标
- 成交明细与已平仓交易
- 逐根回放:拖动进度条查看任意时刻的权益、持仓、动作与信号原因
6. 回放与复盘#
回顾页的回放是排查策略行为的关键工具:
- 拖动时间轴到目标区间(按需加载,超时自动提示重试)。
- 查看该时点的持仓、挂单、权益与策略动作原因。
- 结合右侧参数与成交记录,验证策略在具体 bar 上"为什么这么决策"。
7. 参数调优#
调优 → 配置参数空间 → 运行调优
| 配置 | 说明 |
|---|---|
| 候选预算 | 30 / 100 / 300 个候选参数组合(确定性采样) |
| 参数空间 | 每个参数的最小/最大/步长 |
| 训练/验证 | 按 7:3 切分评估区间,训练段搜索、验证段确认 |
| 评价指标 | 验证段 Calmar(年化收益 / 最大回撤) |
调优完成后:
- 工作台展示候选结果、训练/验证指标与预计剩余时间,可随时取消。
- 采用最佳参数:一键把最佳参数写入当前草稿并保存为新版本(保存后建议再跑一次独立回测确认)。
- 调优只在草稿上工作,不会悄悄修改已保存的版本。
8. Strategy Profile 实盘#
Profile 把策略版本变成实盘信号执行器:
绑定内容(创建时固定,运行中不可静默修改)
- 策略与具体版本、交易对
- 账户与环境(模拟盘 / 实盘)
- 全仓/逐仓、目标杠杆、方向权限
- 每笔入场保证金预算与同向总预算
- 单日已实现亏损限额、入场冷却时间
- 保护单:策略源码静态声明的止盈止损方向(市价或触发后限价)
运行方式
- 复用已订阅的 1 分钟 K 线:每根确认收线后执行一次
on_bar。 - 主机在评估前等待刚收盘的 K 线落库并核验确认截止时间;修复失败会跳过本周期并记录诊断,绝不基于残缺窗口评估。
- 策略只返回开平仓意图;主机按最新权益、执行价、合约面值与张数规则换算合约张数,再走风控与幂等下单链路。
激活要求
- 该策略版本与合约已完成回测
- 本地 Python 环境就绪
- 账户具有读取与交易权限
- 与同账户启用的 AI 自动化完成冲突审查
- 实盘账户每次启用需显式确认
9. 信号历史#
信号标签按 Profile 过滤展示每次评估:
| 字段 | 说明 |
|---|---|
| 时间 | 1 分钟收线的确认时间 |
| 动作 | 开多/开空/平仓意图或空仓等待 |
| 阻止原因 | 风控拦截的规则(预算、亏损限额、冷却等) |
| 订单 | 提交后的订单标识 |
| 错误 | 本周期策略、账户快照或执行错误 |
单周期错误不会立即停止 Profile(正常风控仍可拦截后续动作);连续故障会触发自动停用保护。策略信号与阻止动作可按通知设置推送飞书。
10. 最佳实践#
- 先回测后实盘:任何策略版本都必须先完成回测才能绑定 Profile。
- 参数从少到多:先固定大部分参数,只调优 2-3 个关键参数,避免维度爆炸。
- 样本外验证:调优参数在验证段的表现与历史段差异过大时,警惕过拟合。
- 保护单写进源码:止盈止损方向由策略源码静态声明,主机不会替策略"发明"缺失的保护单。
- 小预算起步:实盘先以最小保证金预算与严格日亏损限额运行,积累信号历史后再放大。
- 定期看信号历史:被阻止的动作和错误记录比成交更重要——它们显示风控是否按预期工作。
11. 常见问题#
Q:需要自己安装 Python 吗? 不需要。安装包内置运行时;首次打开系统化研究会自动准备环境(需要联网安装依赖)。
Q:回测为什么和实盘有差异? 回测基于 1m 已确认 K 线与成交假设(滑点、手续费、盯市方式);实盘撮合、挂单队列与资金费率都会带来差异。
Q:策略能同时持多单和空单吗? 不能。运行时维护单一持仓状态;策略在同一决策点只能返回一个动作。
Q:调优结果可以直接实盘吗? 建议先"采用最佳参数"保存为新版本 → 独立回测确认 → 再用该版本创建 Profile。
Q:Profile 会修改我的策略版本吗? 不会。Profile 绑定不可变版本快照;修改源码会生成新版本,已启用 Profile 继续用旧版本。