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.动画层也可使用其他动画蓝图实现,但必须在角色蓝图中关联…...

从 GitHub 批量下载项目各版本的方法
一、脚本功能概述 这个 Python 脚本的主要功能是从 GitHub 上下载指定项目的各个发布版本的压缩包(.zip 和 .tar.gz 格式)。用户需要提供两个参数:一个是包含项目信息的 CSV 文件,另一个是用于保存下载版本信息的 CSV 文件。脚本…...

一、对lora_sx1278v1.2模块通信记录梳理
一、通信测试: 注意: 1、检查供电是否满足。 2、检测引脚是否松动或虚焊。 3、检测触发是否能触发。 引脚作用: SPI:通信(仅作一次初始化,初始化后会进行模块通信返回测试,返回值和预定值相否即…...

Java在word中动态增加表格行并写入数据
SpringBoot项目中在word中动态增加表格行并写入数据,不废话,直接上配置和代码: 模板内容如下图所示: 模板是一个空word表格即可,模板放在resources下的自定义目录下,如下图示例。 实体类定义如下: @Data @AllArgsConstructor @NoArgsConstructor public class Person …...

[通讯协议]232通信
RS-232 简介 RS-232是一种广泛应用的串行通信接口标准,使用的协议就是串口协议。 通信能力 单端信号传输:信号以地线为参考,逻辑“1”为-3V至-15V,逻辑“0”为3V至15V。点对点通信:仅支持两个设备之间的通信&#x…...

Refreshtoken 前端 安全 前端安全方面
网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…...

EasyRTC嵌入式音视频通话SDK:基于ICE与STUN/TURN的实时音视频通信解决方案
在当今数字化时代,实时音视频通信技术已成为人们生活和工作中不可或缺的一部分。无论是家庭中的远程看护、办公场景中的远程协作,还是工业领域的远程巡检和智能设备的互联互通,高效、稳定的通信技术都是实现这些功能的核心。 EasyRTC嵌入式音…...

AI终章.展望未来2026-2030年预测与DeepSeek的角色
人工智能(AI)近年来发展迅速,正在改变行业、商业模式以及我们与技术互动的方式。展望2026-2030年,预计在多模态AI、自主代理和自动化驱动的新职业创造方面将出现革命性发展。本章将探讨这些趋势,以及DeepSeek将如何在这…...

PyTorch系列教程:编写高效模型训练流程
当使用PyTorch开发机器学习模型时,建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件,并演示如何构建一个精细的训练循环流程,有效地处理数据处理,向前和向后…...

【面试】Zookeeper
Zookeeper 1、ZooKeeper 介绍2、znode 节点里面的存储3、znode 节点上监听机制4、ZooKeeper 集群部署5、ZooKeeper 选举机制6、何为集群脑裂7、如何保证数据一致性8、讲一下 zk 分布式锁实现原理吧9、Eureka 与 Zk 有什么区别 1、ZooKeeper 介绍 ZooKeeper 的核心特性 高可用…...

电力系统中各参数的详细解释【智能电表】
一、核心电力参数 电压 (Voltage) 单位:伏特(V) 含义:电势差,推动电流流动的动力 类型:线电压(三相系统)、相电压,如220V(家用)或380Vÿ…...