Blankly / 指标与绩效口径

README 只举了三个指标,实际有 28 个

Blankly 的 README 在示例部分提到 RSI、MACD、Golden Cross 三种用法,给人的印象是内置指标不多。实际上对已安装版本做一次反射,blankly.indicators 会导出 28 个指标函数blankly.metrics 提供 11 个绩效函数。这一页把清单按源码文件族整理出来(官方没有提供这份中文对照),并说明回测结果对象里的 12 个汇总字段与这些函数的区别。

来源:实测 dir(blankly.indicators)实测版本:1.18.25b0按源码文件族归类本站未实机交易
移动平均族sma / ema / wma / hma / vwma / zlema / trima / kama / macd
振荡族rsi / 随机指标 / 随机 RSI / aroon / CMO / APO / PPO
统计族标准差 / 方差 / 标准误 / 极值 / 求和(按周期)
覆盖与波动族布林带 / 真实波幅与 ATR / 威廉指标 / 累积派发
指标族归类示意(依据发行版 blankly/indicators/ 下的源码文件划分:moving_averages.py、oscillators.py、statistics.py、indicators.py)。归类按文件归属,不代表有效性评价。
指标清单

Blankly 内置哪些指标?28 个函数按源码文件族分组

下面四张表覆盖 Blankly 全部 28 个可调用函数。这份清单不在官方 README 里,是本站对发行版执行反射后按源码文件归类的结果。

移动平均族(9 个)函数名它解决什么选用时的注意点
简单移动平均sma最基础的平滑,双均线策略的主力对最新数据与最老数据等权,转折处滞后明显
指数移动平均ema更重视近期数据,转折更灵敏需要指定跨度参数,跨度不同结论差异大
加权移动平均wma线性加权平滑与 EMA 相比衰减速度不同,需按数据频率试算
成交量加权平均vwma把成交量纳入均价依赖数据里的 volume 真实可用
零延迟指数平均zlema减小 EMA 的滞后在震荡市里假信号可能增加
赫尔移动平均hma兼顾平滑与灵敏数学结构较复杂,参数解释成本高
三角移动平均trima双重平滑,噪声更小更平滑意味着信号更晚
考夫曼自适应平均kaufman_adaptive_ma按市场噪声自动调节平滑度参数较多,需要谨慎设置
指数平滑异同macd快慢线差与信号线三个周期参数共同决定行为,不要只调一个
振荡与动量族(7 个)函数名它解决什么选用时的注意点
相对强弱指标rsi超买超卖判断,官方模板默认使用强趋势市场里可长期停留在极值区
随机指标stochastic_oscillator收盘价在区间中的相对位置需要指定 K 与 D 的平滑参数
随机 RSIstochastic_rsi对 RSI 再做一次区间归一叠加两层平滑,滞后更大
阿隆振荡aroon_oscillator判断趋势成立还是盘整参数影响趋势判定长度
钱德动量振荡chande_momentum_oscillator把上涨与下跌幅度合并成一个动量读数与 RSI 类似但算法不同,不要混用结论
绝对价格振荡absolute_price_oscillator快慢均线之差绝对值随价格水平变化,跨标的比较需谨慎
百分比价格振荡percentage_price_oscillator把上一项转成百分比跨标的比较时通常比 APO 更合适
统计族(6 个)函数名它解决什么选用时的注意点
滚动标准差stddev_period波动幅度度量受极值影响,注意异常值处理
滚动方差var_period标准差的平方量纲与标准差不同,报表里要写清单位
滚动标准误stderr_period均值估计的不确定性与标准差常被混用,含义不同
滚动最小值min_period区间低点常用于止损位参考
滚动最大值max_period区间高点常用于突破型策略
滚动求和sum_period区间累计(如区间成交额)与均值指标搭配使用时注意周期一致
覆盖与波动族(6 个)函数名它解决什么选用时的注意点
布林带bbands均线加减若干倍标准差形成的通道带宽参数决定敏感度;通道收窄常被解读为变盘前兆(属经验判断)
真实波幅true_range把跳空纳入的单期波动是 ATR 的输入,通常不单独做信号
平均真实波幅average_true_range平滑后的波动幅度常用于按波动调整仓位大小
威廉指标willr与随机指标同源的反向读数取值方向与直觉相反,读数前先确认符号约定
累积派发wad结合价格与成交量判断资金累积/派发方向依赖成交量质量;缺失或占位数据会让它失真
威尔斯平滑wilders威尔斯式平滑(RSI、ATR 的内部算法)通常作为其它指标的组成部分使用
绩效函数

blankly.metrics 有哪 11 个函数?

Blankly 的这些函数是「你可以直接对一条收益或权益序列调用的工具」,与回测结果对象里的汇总字段不是同一批东西,用法也不同。

函数含义典型用途注意点
sharpe夏普比率风险调整后收益的横向比较依赖无风险利率与年化口径,跨工具比较前先统一
sortino索提诺比率只惩罚下行波动的变体与夏普不可直接互换解读
calmar卡玛比率年化收益与最大回撤的比值回撤口径不同会导致结果差异
cagr复合年化增长率把区间收益折算为年化区间长度过短时年化会失真
cum_returns累计收益区间总收益率是绝对收益,不含对照
volatility波动率风险度量基准取决于采样频率
variance方差波动率的平方单位与标准差不同
beta贝塔相对基准的系统性风险敞口必须提供基准序列才有意义
var在险价值给定置信水平下的潜在损失估计对尾部假设敏感
cvar条件在险价值超出 VaR 之后的平均损失比 VaR 更关注尾部,但样本不足时不稳定
max_drawdown最大回撤峰值到谷底的最大跌幅只是单个数字,看不出发生时间
为什么要把「函数」和「结果字段」分开讲:上面 11 个函数是你主动调用的工具,输入由你决定;而回测结束后结果对象里的 12 个字段是引擎按内部口径算好的。两者名字相似但口径来源不同——比如结果里的夏普用的是配置中的无风险利率,而你自己调用函数时可以另设。
结果字段

回测结束后,结果对象里到底有什么

下表是本站对真实回测结果执行字段枚举得到的清单。它明确了「框架帮你算了什么」与「你必须自己算什么」的分界。

字段显示名类型说明
calmarCalmar Ratio数值卡玛比率
cagrCompound Annual Growth Rate (%)数值(百分比)年化增长率
cavrConditional Value-at-Risk数值条件在险价值;键名是 cavr
cum_returnsCumulative Returns (%)数值(百分比)累计收益
max_drawdownMax Drawdown (%)数值(百分比)最大回撤
resampled_timeResampled Time数值(秒)账户价值重采样周期,实测日线为 86400.0
risk_free_rateRisk Free Return Rate数值本次计算所用的无风险利率,默认 0.0
sharpeSharpe Ratio数值夏普比率
sortinoSortino Ratio数值索提诺比率
value_at_riskValue-at-Risk数值在险价值
varianceVariance (%)数值(百分比)方差
volatilityVolatility数值波动率
这张表里缺两项常见指标:交易次数与胜率。它们都不在 12 个字段里。如果你要展示胜率,必须自己从成交记录统计,并且在展示时同时说明:统计了多少笔、是否只算已平仓交易、是否扣除手续费。少任何一项,胜率这个数字都可能误导读者。
指标选型

场景 → 指标 → 理由:怎么挑

指标不是越多越好。下表按你要回答的问题组织,每一行给出一条可执行的取舍理由。

你的问题优先考虑的指标理由需要避开的做法
判断趋势方向sma / ema / macd / aroon_oscillator都是对方向敏感的平滑类工具,冗余度低同时叠加五种均线,信号互相冲突且无法归因
判断超买超卖rsi / stochastic_oscillator / willr三者都在 0-100 或等价区间内,便于设阈值在强趋势市里照搬固定阈值
度量波动幅度average_true_range / bbands / stddev_periodATR 可作仓位缩放,布林带可作通道,标准差是通用底料把不同采样频率算出的波动率直接比较
做横截面比较percentage_price_oscillator / 收益率序列百分比形式不受价格水平影响用绝对价差类指标横向排序
做成交量相关判断vwma / wad把量价一起纳入在成交量列是占位数据时使用它们
评估回撤风险max_drawdown 加自算回撤序列汇总值看不出时间分布只看最大回撤数值就下结论
横向比较不同策略统一口径后的 sharpe / sortino / calmar三者互补:波动、下行、回撤在不同无风险利率与采样频率下比较
常见误用

哪六种指标误用会导致错误结论?

Blankly 的内置指标本身没有错,错的是口径和上下文。下面每一条都指出「错在哪、怎么发现」。

误用会得出什么错误结论怎么发现正确做法
用百分比类指标做跨标的金额比较误以为某标的「收益更高」看指标单位是否为百分比跨标的比较统一用百分比形式;金额分析另算
用不同采样频率算出的波动率互相比较误判哪个策略更稳检查 resampled_time 是否一致统一重采样频率后再比较
beta 用在没有基准的序列上得到一个没有意义的数值检查是否提供了基准序列先设基准(结果字段里 benchmark_symbol 默认为空)
cavr 写成 cvar 取值直接 KeyError,或误以为框架不支持打印 metrics.keys() 确认键名使用源码里的真实键名
只看最大回撤数值误以为风险可控,实际回撤集中在某个未察觉的阶段把回撤序列画出来get_returns() 自算回撤序列并对照时间轴
用胜率作为主要评价标准少量交易的高胜率被当成策略优势同时看交易笔数与平均盈亏胜率必须与交易笔数、盈亏比、样本外结果一起看
一条通用判断:任何单一指标都不足以支撑「策略有效」的结论。至少需要一组互补的度量(收益、波动、回撤、交易频率),加上一个对照组,再配合样本外区间,才有讨论的基础。
FAQ

关于指标与绩效口径的高频问题

清单来自对发行版 1.18.25b0 的反射结果;函数签名与算法细节以官方源码为准。

为什么官方 README 只写三个指标,实际有 28 个?

README 的作用是「让人快速理解能做什么」,所以只举了 RSI、MACD、Golden Cross 三个最常见例子。指标模块本身是把一个开源技术指标库封装进来的,所以数量远多于示例。这也意味着这些指标的实现细节与上游库一致,遇到精度或边界问题时,应当去查上游实现的说明。

这些指标需要联网或密钥吗?

不需要。指标模块是对你传入的序列做纯计算,与交易所无关。你可以把它当成一个独立的工具集使用——只要包能正常导入(需要先解决 numpy 依赖问题),就能对任意序列调用这些函数。

回测结果是字典吗?我 print 出来是对象地址。

不是字典。回测返回的是一个结果对象,直接 print 只会显示对象地址与内存位置。要拿数据有三种方式:读 .metrics 属性、调 .get_metrics() 方法、或调 .to_dict() 转成字典。实测中 dict(result) 会抛 TypeError: 'BacktestResult' object is not iterable

框架为什么不提供胜率?

本站只能陈述事实:12 个汇总字段里没有交易次数与胜率。至于原因,不排除是因为「胜率」的定义依赖口径(是否含手续费、是否只算已平仓、多空是否分开统计),不同使用者差异太大,因此留给自己算。实务上这是好事——逼你显式声明口径。

想加一个框架里没有的指标,怎么做?

两条路。第一,在策略回调里用 pandas 或 numpy 自己算,把结果存进 state.variables,这是最直接的方式。第二,如果这个指标要在多处复用,就写成独立函数放在你自己的模块里,再在回调中调用。要注意的是:自定义指标不会享有框架对内置指标的滞后保护,未来函数风险由你自行保证。

绩效函数的输入是收益率还是账户价值?

不同函数的期望输入不同,本站不做统一断言。稳妥做法是调用前先确认函数签名与它期望的序列形态(例如 cagrmax_drawdown 的输入通常是账户价值序列,sharpe 类通常需要收益率序列)。拿一条已知结论的简单序列(例如单调上涨)自测一遍,就能确认单位与方向是否正确。

下一步:从回测走到实盘要重验什么

指标齐了、口径定了,最后一关是把策略从回测搬到真实环境。Blankly 的模板用一行环境判断表达这件事,但真实需要重验的清单要长得多。