当前位置: 首页 > news >正文

SPL 量化 复权数据

复权概念

由于股票经常发生分红、配股、分拆或合并等事件,使得股价出现较大变化,复权就是用来修正这种股价变化。

例如某支股票每股 10 元,持有 100 股,总资产 1000 元

发生拆股后,持有的 100 股变为 500 股,但是股价也会自动调整为原来的 1/5,变为 2 元,总资产还是 1000 元,并没有发生变化。

股价从 10 元变为 2 元,看似暴跌了 80%,但投资者的资产始终没变,因此股价的变化其实是 0。

为了避免这种价格“暴跌”的影响,需要对股票的价格进行修复,这一过程就叫做复权。

复权分为前复权和后复权。

前复权就是保持新时间点的价格不变,对历史时间点的价格进行调整,使得股价连续。而后复权正好相反,保持早期时间点价格不变,调整后续时间点的价格。

按上面例子,股价从 10 元变为 2 元,向前复权时,会维持今天的股价不变,而把昨天的股价由 10 元变成 2 元与当前价格保持一致,之前的股价也都一律按比例缩小,股价变为一条连续的曲线。

反之,向后复权就是保持昨天的价格 10 元不变,调整当前价格 2 元变 10 元,之后的股价也都按比例增大。

复权价的计算方法有多种,由于数据口径或计算方法的不同,得到的复权价格也会有所不同。这里我们采用的是涨跌幅复权法。

日 K 线数据里,pfactor 为复权因子。需要注意的是:该复权因子为当日复权因子,而不是累计复权因子,这样的好处是更方便随意指定一个时间区间计算出和该区间相关的复权价格。累计复权因子计算的是从头向后复权或从尾向前复权,这会导致距离太远的数会太大或太小,和实际的股票价格相差很大,有些软件还会算出负数。而当日复权因子则可以只计算所需区间的复权价格,计算量小,也不会和实际股票相差很多,用起来更灵活。因此这里我们采用当日复权因子。

比如以浦发银行为例,数据如下图所示。在 2024 年 7 月 18 日发生了复权动作,复权因子 pfactor 为 0.96460176991。前复权数据就是保持当日股价不变,昨日股价调整为 8.9*0.96460176991=8.584955752212391,以此类推,之前的股价也按比例调整。反之,后复权数据就是保存历史股价不变,当日股价调整为 8.75/0.96460176991=9.0711009174311,之后的股价同样也按比例调整。

由图中也可以看出 pfactor 为当日复权因子,只有在发生复权动作时参数才会变,其余都是 1。网上有些渠道提供的因子可能为累计因子,因此看起来会有所不同,使用时需注意区分。

..

复权价格

因为复权后价格才有涨跌的可比性,所以做量化策略时通常会使用复权价格,我们可以写一个脚本实现从原始价格到复权价格的计算。

复权脚本:

AB
1for data.group(code)=A1.sort(tdate).(pfactor)
2=if(opt=="b",B1.(if(#==1,cp=1,cp=cp/~)), B1.rvs().(if(#==1,cp=1,cp=cp*~[-1])).rvs())
3=A1.run(cp=B2(#), open*=cp, close*=cp, low*=cp,high*=cp )
4return data

脚本参数:

参数名含义
opt复权类型。填空:前复权,”b”: 后复权;
dada某支或多支股票的 k 线数据

将此脚本保存为 adjustprice.splx,可返回股票的前复权或后复权数据。

例如,计算浦发银行 2024 年的复权价格:

AB
1=register("loadkday","loadkday.splx")将读数脚本登记为函数
2=register@o("adjustprice," adjustprice.splx")将复权脚本登记为函数,并将第一个参数设为选项
3600000股票代码。计算多支股票时传入代码序列如 [600000,600015]
42024-01-01开始日期
52024-12-31截止日期
6=loadkday(A3,A4,A5)读取 k 线数据
7=adjustprice(A6)返回前复权
8=loadkday(A3,A4,A5)读取 k 线数据
9=adjustprice@b(A8)加选项 @b 返回后复权

运行效果:

A7 前复权

..

A8 后复权

..

SPL 可以在这里下载:免费下载。使用免费的桌面版就可以了,直接安装即可使用。专业程序员也可以使用这里的开源版,但需要自行配置部署。

SPL 配有系统的教程,这里有面向新手的课程(含视频):SPL程序设计语言 · 乾学院VIP课程 ,乾学院 也有更多学习资料。

相关文章:

  • uniapp跨平台开发---动态控制底部切换显示
  • 【WEB3】web3.0是什么
  • Android开发中svg转xml工具使用
  • ‌sd - 批量修改文本文件的命令和软件工具
  • 深入理解编程中的同步与异步:原理、区别及实战应用
  • 基于边缘人工智能的AI无人机-更高效更安全的飞行任务执行
  • 【SpringMVC】概念引入与连接
  • EKS环境下服务重启50X错误
  • 小白学习java第16天(上): javaWeb
  • LLM开发——基于DeepSeek R1 和 Qwen 构建智能检索增强生成系统
  • STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)
  • Java大厂面试:互联网医疗场景中的Spring Boot与微服务应用
  • 【应用密码学】实验二 分组密码(2)
  • 获取电脑mac地址
  • 特征工程三:数据特征之词干提取器(stemmer)
  • 如何有效防止 SQL 注入攻击?
  • 使用wavesurferJs实现录音音波效果
  • 数据可视化 —— 直方图
  • git 基础开发操作
  • memcpy 使用指南 (C语言)
  • 早睡1小时,变化有多惊人?第一个就没想到
  • 超级干细胞有助改善生育治疗
  • 人民日报:光荣属于每一个挺膺担当的奋斗者
  • 美联合健康集团高管枪杀案嫌疑人对谋杀指控不认罪
  • 本周看啥|在电影院里听民谣,听摇滚,燥起来吧
  • 传媒湃︱《金陵晚报》副刊“雨花石”5月起改为免费刊登