Desic Terminal
EN

文档

系统化策略指南

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. 创建策略#

策略研究工作台:Python 编辑器、参数面板与不可变版本历史,右侧可调用 AI 协助改写。

策略 → 新建,从四个模板开始:

模板适合场景
blank.py空白骨架,从零编写
ema-trend.py双 EMA 趋势跟踪
macd-volume-atr.pyMACD + 成交量 + 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. 历史回测#

回测结果与回放:评估区间、期末权益、最大回撤与成交账本,可逐根 K 线回放。

回测 → 配置 → 运行回测

参数说明
策略与版本选择策略与具体版本
合约回测的交易对(如 BTC-USDT-SWAP)
初始权益 / 杠杆账户起点与杠杆
评估区间正式评估的开始与结束(最多近一年)
预加载历史评估开始前加载的上下文 K 线(只用于预热指标,不计入权益与统计)
成交假设进出场滑点与手续费、保证金安全系数
期末处理按最后收盘价盯市 / 强制平仓

回测完成后进入回顾标签:

  • 权益曲线、最大回撤、胜率、盈亏比等指标
  • 成交明细与已平仓交易
  • 逐根回放:拖动进度条查看任意时刻的权益、持仓、动作与信号原因

6. 回放与复盘#

回顾页的回放是排查策略行为的关键工具:

  1. 拖动时间轴到目标区间(按需加载,超时自动提示重试)。
  2. 查看该时点的持仓、挂单、权益与策略动作原因。
  3. 结合右侧参数与成交记录,验证策略在具体 bar 上"为什么这么决策"。

7. 参数调优#

调优 → 配置参数空间 → 运行调优

配置说明
候选预算30 / 100 / 300 个候选参数组合(确定性采样)
参数空间每个参数的最小/最大/步长
训练/验证按 7:3 切分评估区间,训练段搜索、验证段确认
评价指标验证段 Calmar(年化收益 / 最大回撤)

调优完成后:

  • 工作台展示候选结果、训练/验证指标与预计剩余时间,可随时取消。
  • 采用最佳参数:一键把最佳参数写入当前草稿并保存为新版本(保存后建议再跑一次独立回测确认)。
  • 调优只在草稿上工作,不会悄悄修改已保存的版本。

8. Strategy Profile 实盘#

Profile 把策略版本变成实盘信号执行器

绑定内容(创建时固定,运行中不可静默修改)

  • 策略与具体版本、交易对
  • 账户与环境(模拟盘 / 实盘)
  • 全仓/逐仓、目标杠杆、方向权限
  • 每笔入场保证金预算与同向总预算
  • 单日已实现亏损限额、入场冷却时间
  • 保护单:策略源码静态声明的止盈止损方向(市价或触发后限价)

运行方式

  • 复用已订阅的 1 分钟 K 线:每根确认收线后执行一次 on_bar
  • 主机在评估前等待刚收盘的 K 线落库并核验确认截止时间;修复失败会跳过本周期并记录诊断,绝不基于残缺窗口评估。
  • 策略只返回开平仓意图;主机按最新权益、执行价、合约面值与张数规则换算合约张数,再走风控与幂等下单链路。

激活要求

  • 该策略版本与合约已完成回测
  • 本地 Python 环境就绪
  • 账户具有读取与交易权限
  • 与同账户启用的 AI 自动化完成冲突审查
  • 实盘账户每次启用需显式确认

9. 信号历史#

信号标签按 Profile 过滤展示每次评估:

字段说明
时间1 分钟收线的确认时间
动作开多/开空/平仓意图或空仓等待
阻止原因风控拦截的规则(预算、亏损限额、冷却等)
订单提交后的订单标识
错误本周期策略、账户快照或执行错误

单周期错误不会立即停止 Profile(正常风控仍可拦截后续动作);连续故障会触发自动停用保护。策略信号与阻止动作可按通知设置推送飞书。


10. 最佳实践#

  1. 先回测后实盘:任何策略版本都必须先完成回测才能绑定 Profile。
  2. 参数从少到多:先固定大部分参数,只调优 2-3 个关键参数,避免维度爆炸。
  3. 样本外验证:调优参数在验证段的表现与历史段差异过大时,警惕过拟合。
  4. 保护单写进源码:止盈止损方向由策略源码静态声明,主机不会替策略"发明"缺失的保护单。
  5. 小预算起步:实盘先以最小保证金预算与严格日亏损限额运行,积累信号历史后再放大。
  6. 定期看信号历史:被阻止的动作和错误记录比成交更重要——它们显示风控是否按预期工作。

11. 常见问题#

Q:需要自己安装 Python 吗? 不需要。安装包内置运行时;首次打开系统化研究会自动准备环境(需要联网安装依赖)。

Q:回测为什么和实盘有差异? 回测基于 1m 已确认 K 线与成交假设(滑点、手续费、盯市方式);实盘撮合、挂单队列与资金费率都会带来差异。

Q:策略能同时持多单和空单吗? 不能。运行时维护单一持仓状态;策略在同一决策点只能返回一个动作。

Q:调优结果可以直接实盘吗? 建议先"采用最佳参数"保存为新版本 → 独立回测确认 → 再用该版本创建 Profile。

Q:Profile 会修改我的策略版本吗? 不会。Profile 绑定不可变版本快照;修改源码会生成新版本,已启用 Profile 继续用旧版本。

在 GitHub 上查看原文