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.动画层也可使用其他动画蓝图实现,但必须在角色蓝图中关联…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
