CTA策略【量化理论】
CTA策略演变史
全称:Commodity Trading Advisor (商品交易顾问)
CTA最开始是指通过为客户提供期权、期货方面的交易建议,或者直接通过受管理的期货账户参与实际交易,来获得收益的机构或个人。
随着市场的发展,市场对CTA的理解普遍发生了改变,它已不再是商品期货,而是基于量价的趋势跟踪策略——无论是商品期货、金融期货,还是股票、外汇,只要是有历史公开量价的二级市场,都可以成为CTA策略运作的市场。
在国内市场中,期货相比股票交易起来的限制较小(t+0交易且可以做空),因此推荐用期货来学习
趋势跟踪策略是CTA的重要组成部分,通俗来讲就是追涨杀跌,该假说核心的理论就是利用在股市中明显存在的非理性狂热和羊群效应,在市场情绪明显不是很好的情况下在置信区间内持有股票,以达到收割韭菜的目的,客观来讲,这种量化策略客观上实现了一件事:使得股价更加稳定且符合实际价值,降低了市场情绪对股价造成的影响

相关指标类型
国内大量的量化CTA都是利用了技术指标来构建量化策略,大体上,这些量化指标可以分为三类:
(1):趋势型:例如MACD、SAR用于趋势跟踪策略
(2):超买超卖型:和追涨杀跌的趋势型恰相反,用KDJ、RSI等指标来描述并捕捉趋势行情的终结
(3):能量型:从成交量的角度来考察价格变动的力量,常用于辅助判断信号的强度,比如VOL、OBV等
有关跳空定义的处理方法
在进行较长时间的回测时,在换月时会遇到假跳空的问题,这是由于期货合约到期后,新的合约和原来的合约存在一个比较大的价差
对于这种假跳空的情况,一般会采用三种处理方法1.使用期货合成指数来回测2.对跳空进行复权处理3.不使用主力合约,而是使用单独月份的合约来进行分析
1.使用合成指数进行回测:
对某一品种的各个月赋予权重,计算出一个综合性指标,用于代表该产品的整体走势,计算指数时,算法一般都会保证其连续性,不会出现假跳空的现象。
方法缺点:指数并非真实存在的价格数据而产生误差;指数的计算公式往往不是透明的
2.进行复权算法处理:
复权算法分为两个维度,可以分为加减复权和乘除复权,也可以分为前复权和后复权,所谓加减复权就是指对跳空产生的价差加减平移:
假设你持有以下期权组合:
• 买入一个行权价为50的看涨期权,价格为5元。
• 卖出一个行权价为60的看涨期权,价格为2元。
• 初始价差为3元(5 - 2)。
如果市场情况发生变化:
• 加价差:你可能会卖出一个行权价为70的看涨期权,价格为1元,新的价差变为4元(5 - 1)。
• 减价差:你可能会买入一个行权价为55的看涨期权,价格为3元,新的价差变为2元(5 - 3)。
• 平移:你可能会将行权价从50和60调整为60和70,但保持价差宽度不变。
例如本来的收盘价:1010,1000,1200,1170——其中,1000到1200就是由假跳空导致的,这时我们就把后面的两个序列减去200,得到新的收盘价:1010,1000,1000,930,这种处理方法的优点是价格序列整体简洁,缺点是收益率会出现偏差,要让收益率不会出现偏差,我们可以采用乘除复权法,也就是在原来的数字上乘上一个因子,比如在刚刚举例的1010,1000,1200,1170序列当中,就可以把后面的两个数字乘上(1/1.2)这样就得到了连续时收益率不变的新序列1010,1000,1000,975
前复权就是对前面的数据复权,后复权就是对后面的数据复权
法三的主要缺点是容易造成数据损失
在这里给大家介绍一个比较成熟的库:ta-lib,其本身是基于c语言开发的技术指标库,现在也提供Python包装后的库,下载此库时,在windows中建议使用预编译的二进制安装包/anaconda:
其函数主要分为如下十组:
·Overlap Studies(可叠加指标)
·Momentum Indicators(动量指标)
·Volume Indicators(成交量指标)
·Volatility Indicators(波动率指标)
·Price Transform(价格变换)
·Cycle Indicators(周期指标)
·Pattern Recognition(模式识别)
·Statistic Functions(统计函数)
·Math Transform(数学变换)
·Math Operators(数学运算符)
ta-lib有两种方法计算指标(Function API和Abstract API)
其中函数式API提供了一种轻量级的调用方式,例如:
output = talib.SMA(close)
可以简单计算其移动平均
from talib import MA_Typeupper, middle, lower = talib.BBANDS(close, matype=MA_Type.T3)
可以计算其布林线
output = talib.MOM(close, timeperiod=5)
timeperiod来指定计算周期
一般而言,一个合理的CTA策略往往以趋势跟踪为主,以反转指标和能量指标为辅,取趋势指标T、反转指标R、能量指标E
定义趋势当中最常用的方法有两种(T+表示多头信号,T-表示空头信号):
1.突破:高于或低于先前几期的最高价或最低价,就是向上突破或向下突破
2.穿越:短期均线上穿/下穿长期均线
当涨的太高,股市很容易会出现回调的情况,此时一些常见的指标高于某一值,我们就可以称目前的情况为超买,为R-空头信号;低于某值为超卖,为R+多头信号
能量指标E,比如OBV:当日价格低于昨日价格,那么当日OBV就是本日值+前一日OBV值(且本日值小于零,为交易量*-1)
import pandas as pd
import numpy as np
import talib as ta
import matplotlib.pyplot as plt# 示例数据加载(请替换为实际数据)
data = pd.read_csv('your_data.csv', index_col='Date', parse_dates=True)
data = data[['Open', 'High', 'Low', 'Close', 'Volume']]# 参数设置
fast_ma_period = 10 # 快速均线周期
slow_ma_period = 50 # 慢速均线周期
bbands_period = 20 # 布林线周期
std_dev = 2 # 布林线标准差# 计算OBV(能量指标E)
data['OBV'] = ta.OBV(data['Close'], data['Volume'])# 计算布林线(反转指标R)
data['BB_UP'], data['BB_MID'], data['BB_LOW'] = ta.BBANDS(data['Close'], timeperiod=bbands_period, nbdevup=std_dev, nbdevdn=std_dev)# 计算均线(趋势指标T)
data['MA_Fast'] = ta.SMA(data['Close'], timeperiod=fast_ma_period)
data['MA_Slow'] = ta.SMA(data['Close'], timeperiod=slow_ma_period)# 生成信号
data['Signal'] = 0 # 初始化信号# 基于OBV和布林线的反转信号
data.loc[(data['OBV'] > data['OBV'].shift(1)) & (data['Close'] < data['BB_LOW']), 'Signal'] = 1 # 买入信号
data.loc[(data['OBV'] < data['OBV'].shift(1)) & (data['Close'] > data['BB_UP']), 'Signal'] = -1 # 卖出信号# 基于均线的趋势信号
data.loc[data['MA_Fast'] > data['MA_Slow'], 'Signal'] = 1 # 均线多头,增强买入信号
data.loc[data['MA_Fast'] < data['MA_Slow'], 'Signal'] = -1 # 均线空头,增强卖出信号# 简单的交易逻辑
data['Position'] = data['Signal'].shift(1) # 当前持仓状态
data['Strategy_Return'] = data['Position'] * data['Close'].pct_change() # 策略收益率# 绘制结果
plt.figure(figsize=(14, 8))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['MA_Fast'], label='Fast MA')
plt.plot(data['MA_Slow'], label='Slow MA')
plt.plot(data['BB_UP'], label='BB_UP')
plt.plot(data['BB_MID'], label='BB_MID')
plt.plot(data['BB_LOW'], label='BB_LOW')
plt.scatter(data.index[data['Signal'] == 1], data['Close'][data['Signal'] == 1], color='green', label='Buy Signal')
plt.scatter(data.index[data['Signal'] == -1], data['Close'][data['Signal'] == -1], color='red', label='Sell Signal')
plt.legend()
plt.title('CTA Strategy with OBV, BBands, and MA')
plt.show()# 输出策略绩效
cumulative_return = (1 + data['Strategy_Return']).cumprod() - 1
print("Cumulative Return:", cumulative_return.iloc[-1])
指标总体策略
空仓时,若出现T+,则开多仓;若出现T-,则开空仓。
当前是多头时,若出现T-,则平多反手开空;T+若出现R-,则平多不开新仓。
当前是空头时,若出现T+,则平空反手开多;T-若出现R+,则平空不开新仓。
所有的信号均可以用能量E超过某阈值m来辅助,只有当E有效时,信号才有效。
相关文章:
CTA策略【量化理论】
CTA策略演变史 全称:Commodity Trading Advisor (商品交易顾问) CTA最开始是指通过为客户提供期权、期货方面的交易建议,或者直接通过受管理的期货账户参与实际交易,来获得收益的机构或个人。 随着市场的发展&#…...
基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享
作者:Hello,Panda 各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。 一、方案背景 先说方案的应用背景:众所周知,较为上层的如基于AI的机器视觉应用,大多基于高端的专用SoC、AI专…...
②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网
Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 网关 MS-A1-5081 MS-A1-5081 网关通过 MODBUS TCP 协议与 Modbus RTU/ASCII 协议的相互转换,可以将 Modbus 串口设备接入 MODBUS TCP 网络…...
游戏引擎学习第145天
仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前,我们正在完成遗留的工作。当时我们已经将声音混合器(sound mixer)集成到了 SIMD 中,但由于一个小插曲,没有及时完成循环内部的部分。这个小插曲主要是…...
【Kotlin】Kotlin基础笔记
一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量(相当于常量);使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int,不可变 var b: Double 5.0 // 显示声明为 Double,可变变量…...
Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )
Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). ) 题目大意: 在这个交互式问题中,你需要通过查询系统,逐步找出隐藏的位字符串 S。给定一个偶数 n,表示目标位字符串 S 的长度,你需要通…...
uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!
此文章懒得排版了,为了找出这个bug, 星期六的晚上我从9点查到0点多,此时我心中一万个草泥马在崩腾,超级想骂人!!!!!!!!! uniCloud 不想…...
【Linux】冯诺依曼体系与操作系统理解
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充:理解系统调用…...
STM32之软件SPI
SPI传输更快,最大可达80MHz,而I2C最大只有3.4MHz。输入输出是分开的,可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意:所有设备需要共地,时钟线主机输出&…...
Python零基础学习第三天:函数与数据结构
一、函数基础 函数是什么? 想象你每天都要重复做同一件事,比如泡咖啡。函数就像你写好的泡咖啡步骤说明书,每次需要时直接按步骤执行,不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...
启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED
问题:启动wsl里的Ubuntu24报错 报错信息: 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件,并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息,请访…...
顶点着色器和片段着色器
在Unity渲染中,**顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工:想象你要画一幅由三角形组成的3D模型,顶点…...
std::optional详解
基础介绍 c17版本引入了std::optional特性,这一个类模板,基本的使用方法如下: std::optional<T> 这个新特性的含义是利用std::optional<T>创建的某个类型的对象,这个对象存储某个类型的值,这个值可能存在…...
Web三件套学习笔记
<!-- HTML --> HTML是超文本标记语言 1、html常用标签 块级标签 独占一行 可以设置宽度,高度,margin,padding 宽度默认所在容器的宽度 标签作用table定义表格h1 ~ h6定义标题hr定义一条水平线p定义段落li标签定义列表项目ul定义无序列表ol定…...
Scala 中trait的线性化规则(Linearization Rule)和 super 的调用行为
在 Scala 中,特质(Trait)是一种强大的工具,用于实现代码的复用和组合。当一个类混入(with)多个特质时,可能会出现方法冲突的情况。为了解决这种冲突,Scala 引入了最右优先原则&#…...
C++入门——引用
C入门——引用 一、引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。这就好比《水浒传》中,一百零八位好汉都有自己的绰号。通过&…...
深度学习模型组件之优化器—Lookahead:通过“快慢”两组优化器协同工作,提升训练稳定性
深度学习模型组件之优化器—Lookahead:通过“快/慢”两组优化器协同工作,提升训练稳定性 文章目录 深度学习模型组件之优化器—Lookahead:通过“快/慢”两组优化器协同工作,提升训练稳定性1. Lookahead优化器的背景2. Lookahead优…...
K8s 1.27.1 实战系列(五)Namespace
Kubernetes 1.27.1 中的 Namespace(命名空间)是集群中实现多租户资源隔离的核心机制。以下从功能、操作、配置及实践角度进行详细解析: 一、核心功能与特性 1、资源隔离 Namespace 将集群资源划分为逻辑组,实现 Pod、Service、Deployment 等资源的虚拟隔离。例如,…...
Spring Boot整合ArangoDB教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、环境准备 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11(本地安装或Docker运行) Docker启动ArangoDB docker run -d --name ar…...
虚幻基础:动画层接口
文章目录 动画层:动画图表中的函数接口:名字,没有实现。动画层接口:由动画蓝图实现1.动画层可直接调用实现功能2.动画层接口必须安装3.动画层默认使用本身实现4.动画层也可使用其他动画蓝图实现,但必须在角色蓝图中关联…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
