Lite 是云栖量化平台自研的回测策略语言,面向 A 股日线回测。策略参数写在代码顶部,回测引擎负责 T+1、100 股整手、佣金与滑点等规则。
语言概览
| 能力 | Lite 写法 |
|---|---|
| 回测参数 | config.* 配置块 |
| 策略逻辑 | on bar { ... } |
| 全局跨日状态 | state.xxx |
| 单标的独立状态 | local.xxx |
| 固定股票池 | config.symbols |
| 指数成分股池 | config.pool_index + config.max_pool |
| 业绩基准 | 自动对比上证综合指数 000001 |
| 手续费 / 滑点 | config.fee / config.slippage |
| 信号复权 | config.fq(撮合仍用不复权价) |
| 行情字段 | open / high / low / close / volume |
| 跨标的引用 | data("sh.000001").close |
| 技术指标 | ma / ema / rsi / macd_* / highest / lowest |
| 运行时计算 | emar(key, val, span) 运行时EMA / prev_val(key, val, n) 任意值历史 |
| 涨停复制类指标 | limit_up_count / xys0 / hhjsjdb 等(见指标节) |
| 按数量下单 | buy / sell |
| 按金额 / 目标调仓 | buy_value / target / target_value |
| 仓位 sizing | pct_equity / cash(金额) / lots / equal_cash() |
| 账户查询 | position / equity / cash() / avg_price / hold_bars |
运行时刻:每个交易日,对股票池内每个标的依次触发 on bar;当日产生的委托在下一交易日开盘价撮合。
多标的同日下单:若多个标的在同一天发出买入,使用 equal_cash() 可在策略层表达「均分当日可用现金」;引擎在当日全部标的评估完毕后统一计算份额并下单(对标 PTrade 的 cash / len(candidates))。
语法要点
| |
- 代码块用
{/},闭合}需与if同级缩进(子句多缩进 2 格) - 比较:
>、>=、<、<=、== - 逻辑:
and、or、not
策略配置
配置项一览
| 配置项 | 类型 | 说明 |
|---|---|---|
config.title | 字符串 | 策略名称(可选) |
config.symbols | 数组 | 固定股票池,如 ["600519.SS","601857.SS"] |
config.pool_index | 字符串 | 指数成分股池,如 "000300.SS"(沪深300) |
config.max_pool | 数字 | 成分股池上限,默认 400 |
config.start | 日期 | 回测开始 YYYY-MM-DD |
config.end | 日期 | 回测结束 YYYY-MM-DD |
config.capital | 数字 | 初始资金 |
config.fee | 数字 | 手续费(小数),0.0001 = 万分之一 |
config.slippage | 数字 | 滑点 百分比,可选 |
config.pyramiding | 数字 | 同标的同 id 最大加仓次数,1 = 不加仓 |
config.fq | 字符串 | 信号取数复权:none / pre / post / dypre(推荐 dypre) |
config.order_volume | 数字 | 策略内 order_volume 变量默认值(可选) |
config.symbols 与 config.pool_index 二选一;使用 pool_index 时回测自动拉取成分股并排除基准指数。
写法示例
| |
指数池:
| |
块写法:
| |
事件入口
| |
- 多标的时,
on bar对池中每个标的各执行一遍,共享同一账户与state - 每个标的另有独立
local对象,用于买卖标志等 per-symbol 状态
行情与数据
| 名称 | 说明 |
|---|---|
open / high / low / close / volume | 当前标的、当前 Bar 的 OHLCV(受 config.fq 影响,用于信号) |
symbol | 当前标的代码(如 sh.601857) |
date | 当前交易日 YYYY-MM-DD |
bar_index | 当前 Bar 在全局交易日历中的索引 |
symbol_bars | 当前标的已有 K 线根数 − 1(跳过停牌日;用于「至少 N 根 K 线」过滤) |
data("sh.000001").close | 引用其他标的同期行情 |
prev(close, 1) | 前 N 根 Bar 的 close / open / high / low(仅 OHLC 字段,不支持计算值) |
| 计算值历史 | prev_val(key, value, n) — 支持任意表达式的历史值(见运行时计算节) |
| |
技术指标
通用指标
| |
交叉
| |
涨停复制 / 通达信类指标
以下函数为引擎预计算,Bar 内 O(1) 读取,适合性能敏感场景:
| 函数 | 说明 |
|---|---|
limit_up_count(n) | 近 n 日涨停次数(收盘价较前一日涨幅 > 10% 计 1 次) |
xys0() | 捕捞季节线变化率 |
xys1() | xys0 的 2 日均线 |
xys2() | xys0 的 1 日均线 |
hhjsjdb() | 智能辅助线 D 值 |
hhjsjdc() | 智能辅助线 5 日平滑 |
如需自行实现或修改公式,可用下方的 emar / prev_val 在策略代码中重写(见示例 9)。
指标在回测开始前向量化预计算,Bar 内 O(1) 读取。
运行时计算(对任意计算值)
以下函数不是预计算的,而是在 on bar 执行过程中对任意表达式计算,使用 key 字符串维护 per-symbol 内部状态:
| 函数 | 说明 | 示例 |
|---|---|---|
emar(key, value, span) | 对 value 做 span 期 EMA(运行时,非预计算) | emar("wy1002", wy1001, 4) |
prev_val(key, value, offset) | 存当前 value、取 offset 天前的值 | prev_val("hhjsjda", v, 5) |
用途举例:
| |
注意:
key必须是字符串字面量("xxx"),同一 key 在同一 Bar 多次调用只存一次value可以是close、计算表达式(如(close+high)/2)、或其他变量offset=0返回今天刚存的值,offset=1返回昨天存的,依此类推- 数据不足 offset 时返回
NaN
下单与仓位
Sizing 函数(用于 buy / sell 的数量参数,或 buy_value 的金额参数)
| 函数 | 含义 | 示例 |
|---|---|---|
pct_equity(pct) | 按账户总权益的百分比换算股数(100 股整数倍) | buy("main", pct_equity(90)) |
cash(金额) | 按指定金额换算股数 | buy("main", cash(50000)) |
lots(n) | n 手(1 手 = 100 股) | buy("main", lots(10)) |
equal_cash() | 占位符:参与当日「均分可用现金」队列(见下文) | buy_value("main", equal_cash()) |
cash() | 账户可用现金(元),不是 sizing | buy_value("main", cash()) 全仓 |
注意:
cash()无参数 = 查账户现金;cash(50000)带参数 = 按 5 万元换算股数。二者不同。
equal_cash() 行为说明
对标 PTrade:
| |
Lite 策略层写法:
| |
引擎行为:
- 当日每个标的的
on bar中,凡传入equal_cash()的买单先登记意图,不立即算具体股数 - 当日全部标的评估结束后,统计登记数
N,每只分配可用现金 / N(预留手续费),向下取整至 100 股整数倍 N = 1时等价于buy_value("main", cash())全仓- 分配金额买不起 1 手的标的跳过;委托在下一交易日开盘撮合
按数量
| |
按目标调仓
| |
持仓与账户
| |
同一 id(如 "main")可区分不同逻辑仓位;pyramiding = 1 时已有同 id 持仓则忽略新买单。
状态:state 与 local
| 对象 | 作用域 | 用途 |
|---|---|---|
state | 全局,跨标的、跨日持久 | 组合级计数、择时标志 |
local | 单标的独立,跨日持久 | 买卖标志、防重复下单 |
| |
多标的共用 state 时请加前缀或按业务拆分 key,避免冲突。
场景示例
1. 双均线 + 全仓买卖
| |
2. MACD 金叉死叉
| |
3. 指数过滤(大盘择时)
| |
4. 多标的同日均分现金(推荐)
旧写法需手动估 pct_equity(45);现用 equal_cash() 由引擎按当日信号数自动均分:
| |
5. 持仓 N 日强制平仓
| |
6. RSI 超买超卖
| |
7. 突破 N 日高点
| |
8. 指数池、专用指标与均分现金(写法片段)
以下为** API 组合示例**,非完整策略;具体选股与买卖条件请自行编写。
配置指数成分股池:
| |
读取专用指标(片段):
| |
9. 自定义指标(emar / prev_val 用法)
用运行时计算函数在策略代码中自行实现指标,不依赖引擎预计算。以下示例等价于 xys0/xys1/xys2 + hhjsjdb/hhjsjdc 的涨停复制买入条件:
| |
多标的均分现金 + local 防重复卖单(片段):
| |
撮合与 A 股规则
- T+1:当日买入的仓位当日不可卖出(卖单在撮合阶段检查可卖数量)
- 整手:买卖数量向下取整至 100 股整数倍
- 佣金:买卖双向收取,
fee = 0.0001表示万分之一 - 滑点:
config.slippage为百分比,买入加价、卖出减价 - 加仓:
pyramiding = 1时,已有同 id 持仓则忽略新买单 - 信号 vs 撮合:
config.fq仅影响指标与close等信号价;实际成交价、市值仍用不复权行情 - 基准:绩效报告与权益图自动对比上证综合指数(000001);权益图 Y 轴为累计收益率(%)
暂不支持(后续扩展)
- 分钟 / Tick 级回测
- 限价单 / 止损单(仅市价、下一日开盘撮合)
- 做空、融资融券
- 财务基本面选股
- 涨跌停、停牌专门过滤
- 分时段定时任务(逻辑统一写在
on bar) on day单次全池循环(当前为 per-symbolon bar)
调试建议
- 先用单标的、双均线示例验证框架
- 多标的同日买入优先用
equal_cash(),避免手动写死pct_equity比例 - 多标的状态用
local,组合级用state - 长周期指标加
symbol_bars < N过滤,避免上市初期 NaN - 使用
config.fee = 0.0003(万分之三)更接近实盘佣金 - 绩效 Tab 查看夏普、最大回撤、基准超额;摘要行可看标的数、成交笔数、信号次数