Z-score 因子的深入思考

最新(2024 年 1 月)出版的 SC 技术分析(Techical Analysis of Stock & Commodities)的第 4 条文章给到了 Z-score,原文标题为《Z-score: How to use it in Trading》。今天的笔记,就借此机会,同步推出我们对通过Z-score来构建量化因子的一些观点。

在这里插入图片描述


Z-Score 的计算

Z-score 的计算公式如下:
Z = X − μ σ Z = \frac{X-\mu}{\sigma} Z=σXμ

这里 Z Z Z是 z-score, X X X一般取股价, μ \mu μ是均值, σ \sigma σ是标准差,也称波动率。

如果 X服从正态分布,那么将有以下结论:

  1. abs(z-score) >= 2 的概率小于 2.3%
  2. abs(z-score) >= 3 的概率小于 0.13%

由此可以作为某种反转信号,即一旦z-score超过±2,将有97.7%的概率会回归到±2 以内,也就是股价会发生向均值方向的回归。

在 scipy.stats 包中有 zscore 计算函数,但它是基于我们传入的全部数据的。在因子构建中,我们实际上要计算的是rolling-zscore。因此,我们借用 pandas 中的 rolling 方法来自行计算:

def rolling_zscore(s, win=20):ma = s.rolling(window=win).mean()std = s.rolling(window=win).std()return (s - ma)/std

在这里插入图片描述

因子检验

这篇笔记不打算走完整的流程,我们将随机选择一个标的,计算它最近 250 期的 zscore,把 zscore 小于-2 的点作为买入点,大于 2 的点作为卖出点,进行绘图显示,然后就图的走势,来进行深入讨论:


可以看出,每一个买入点差不多都是局部的最低点,每一个卖出点也差不多是局部最高点。但是,在下跌趋势中,即使我们在最低点进入了,它的反弹并不能持续多久(或者多大的幅度),而且很难等到 zscore 的卖出点,往往就已经拐头了。

或者说,zscore大于2,是一个卖出的充分但不必要条件;zscore 小于-2, 是一个买入的充分但不必要的条件。它不对未来趋势进行预测,并且在 97.7%的时间里,不会发出交易信号,这样资金利用率也不够。因此,zscore 可以构成一个因子,但不能构成一个策略。但作为因子,它仍然是优秀的,因为它能发出确定、胜率很高的信号。

与布林带的关系

如果你熟悉布林带策略,那么你会发现,z-score 的算法与布林带一模一样。不同的是,布林带的上下轨的数值是均值的±2个标准差,取值的波动可以很大,而z-score的取值是在确定的范围内(-3, +3),具有类似归一化的特征。正因为如此,它可以很方便地当成因子,用在机器学习中。实际上,要做到真正的归一化,我们直接取 z-score 的累积概率就好,它是在 [0,1] 区间分布的,并且当 z-score 为 2 时,累积概率为 0.977.


在这里插入图片描述

警惕黑天鹅

与其它别的因子不一样的地方是,z-score 因子的有效性来源于正态分布的假设。只有股价的波动符合正态分布,我们才能断言价格偏离均值加两个标准差的可能性小于 2.3%。然而,股价的波动并不符合正态分布(指数会更接近一点,但也是更符合广义双曲分布,而不是正态分布)。因此,z-score因子(以及布林带)的理论根基并不牢固。

另外,最重要的一点是,在偏离两个标准差的地方,尽管其概率很小,但也存在一种可能,就是它一旦发生,其后果会比较严重。这就是由 Taleb 提出的所谓黑天鹅效应。在 A 股中,需要注意的是,如果在偏离两个标准差的地方,如果发生了涨跌停,那么我们应该果断放弃 z-score 因子。因为在这种情况下,交易情绪是极端化的。


Quiz

如果价格的波动并不服从正态分布,或者任何一种已知的分布,我们又该如何把握它的统计学特征呢?

举例来说,如果有这样一个问题,今天沪指已经下跌了4%,依据过去1000个交易日的统计数据,它继续下跌的概率是多少,你应该如何回答这个问题?能够正确地回答这个问题的人,才能抓住加速赶底、或者因意外事件错误下跌的机会

提示:这是我们在课程中,用来引出PDF/CDF概念的一个问题。

在这里插入图片描述

本文所附源代码在大富翁量化网站上可下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319147.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wireshark抓包分析HTTP协议,HTTP协议执行流程,

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…

【壹基金儿童服务站】瑞金站:清捡垃圾 美化环境

1月1日下午,瑞金赋能公益和象湖镇东升社区新时代文明实践站在壹基金儿童社区服务站开展“我是环保小卫士——走进小区捡垃圾“主题活动,帮助小朋友树立爱护环境从小做起,用自己的双手照顾身边的环境,争做环保小卫士,为…

【ikbp】数据可视化DataV

天天查询一些数据,希望来一个托拉拽的展示,部署体验一下可视化大屏 快速搭建快速查询实时更新简单易用 启动服务 数据可视化 静态查询 配置数据 过滤数据 分享

k8s pod基础 1

发布和yaml文件的初步了解。 pod:是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中可以同时…

算法通关村番外篇-数组实现队列

大家好我是苏麟 , 今天来用数组实现一下队列 . 数组实现队列 顺序存储结构存储的队列称为顺序队列,内部使用一个一维数组存储,用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标),用一个队尾指针rear(有的地方…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法,对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块,VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

QML 项目中使用 Qt Design Studio 生成的UI界面

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 今天来和大家聊一下 Qt Design Studio 这个软件。这个软件的主要功能是用来快速完成 UI 界面,就和 widget 中的 desig…

【数据结构】一些数组面试题以及顺序表的思考

简单不先于复杂,而是在复杂之后。 文章目录 1. 数组相关面试题2. 顺序表的问题及思考 1. 数组相关面试题 1.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) {i…

单电阻落地扇电机驱动 DEMO 方案

SYNWIT DEMO方案 低压 PMSM 电机,软件上采用SVPWM空间电压矢量调制技术,直接闭环启动,相比传统方波效率提高15%,具有更小的谐波分量及转矩脉动,同时采用32位MCU芯片SWM201G6S7 SSOP28 封装为主控,为驱动算…

在ARMv8中aarch64与aarch32切换

需求描述 在项目调试过程中,由于内存或磁盘空间不足需要将系统从aarch64切换到aarch32的运行状态去执行,接下来记录cortexA53的调试过程。 相关寄存器描述 ARM64: SPSR_EL3 N (Negative):表示运算结果的最高位,用于指示运算结果是否为负数。 Z (Zero):表示运算结果是否…

FastApi-快速入门1

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…