量化交易学习3(量化择时策略)

1 什么是量化择时

量化择时策略,简单来说,就是采用数量化分析方法利用单个或多个技术指标的组合,来对交易标的股票或股票指数进行低买高卖的操作,期望获得超越简单买入持有策略的收益风险表现。

量化择时策略的核心是技术分析,更准确地来说,是客观型技术分析。客观型技术分析,是指其分析过程中所用到的分析方法,具有100%客观的定义标准,不含有任何主观定义的部分。

基于客观型技术分析的量化择时策略,对普通投资者具有一个很重要的意义,那就是具有很强的可传授性和可复制性 ,任何人只要花费时间精力去理解、去掌握了这些有效的量化择时策略,都可以将它们付之于实盘,获得同样令人满意的投资业绩。
正如巴菲特在谈论市场时说:“我们所经历的上个世纪反复证明,股票市场的非理性是周期性爆发的。这强烈暗示投资者应尽力去学会应对下一个股票市场的非理性爆发。而这需要的是一剂解毒剂,我认为这剂解毒剂就是量化分析。如果你定量分析,你并不一定会出色,但是你也不会坠入疯狂。”,所谓量化择时即为:根据量化指标,来选择买卖的时机。量化择时分市场整体择时、板块行业轮动择时及个股的择时。

量化择时的意义重大,如果能选择牛市、规避熊市,将能够获得非常高超额收益。尤其是在系统性风险较高、波动性比较大的、相关性较强的新兴A股市场,尤为有效。根据A股市场数据计算,从1991年1月到2010年7月的234个月月平均收益为2.18%,去掉最差的十个月(占总时间的4.27%),则收益提高到4.23%;如果去掉最好的10个月,则收益降到0.01%。如果投资者从2006年初的市场底部进入,则收益巨大;如果从2008年初进入,则亏损很多。可见选择时机进入是投资决策的首要目标,低风险区域进入能增大安全边际。

2 量化择时的策略

常见的客观性技术分析有:均线、MACD、RSI等,它们都具有一个共同点,就是都有明确的数学计算公式,只要给出计算公式,任何人计算出来的结果都是一样的,比如20日简单均线,不管是谁画出来的均线都是一样的。

这些客观型技术分析指标按性能及设计特征,归纳了八种量化择时方法: 趋势择时、 Hurst指数、SWARCH模型、异常指标择时、市场情绪择时、SVM分类、有效资金模型、牛熊线。

2.1 均线计算

我们结合金融软件具体查看一下该指标。目前各大金融软件基本都提供移动平均值的计算,如下截图展示了平安银行(000001.SZ) 2023年4月到6月的估价走势,在右上角展示了5日移动平均值(M5)、10日移动平均值(M10)、20日移动平均值(M20)、30日移动平均值(M30)。 为了进一步计算验证,本文拉取了20230501 - 20230630 交易日每天的日行情数据,根据收盘价计算,可以看出该计算结果与金融产品上展示的数据一致。

在这里插入图片描述

"""
使用tushare库来获取股票数据,并对数据进行处理和计算移动平均值。
"""

import tushare as ts

# https://tushare.pro/user/token
tushare_token = '0858b935f4518d9e56ffeb19910dc13e296291364ea1d7bd574eb84b'
ts.set_token(tushare_token)
pro = ts.pro_api(tushare_token)

# 个股数据 https://tushare.pro/document/2?doc_id=27
# 从tushare获取个股数据,从2023年5月1日到2023年6月30日期间获取股票代码为000001.SZ的数据,字段包括交易代码、交易日期和收盘价。
df = pro.daily(ts_code='000001.SZ', start_date='20230501', end_date='20230630', fields='ts_code,trade_date,close')
df = df.sort_values(by='trade_date')

# 使用.rolling()函数计算收盘价的移动平均值,分别为5天、10天、20天和30天,并将结果存储在M5、M10、M20和M30列中。
df['M5'] = df.close.rolling(window=5).mean().round(2)
df['M10'] = df.close.rolling(window=10).mean().round(2)
df['M20'] = df.close.rolling(window=20).mean().round(2)
df['M30'] = df.close.rolling(window=30).mean().round(2)

# 对数据按交易日期进行降序排序,以便按照日期从新到旧的顺序显示数据。
df = df.sort_values(by='trade_date', ascending=False)
print("前10条数据:\n", df.head(10))
df.to_csv('result.csv', index=False)

在这里插入图片描述

2.2 双均线策略

策略原理:使用两根均线,一根长周期均线,一根短周期均线。当短期均线从下往上穿越长周期均线的时候,买入;当短期均线从上往下穿越长周期均线的时候,卖出。前文介绍的Granville 八大法则也是一种双均线策略,其短周期均线为M1(当日收盘价)。均线根据不同周期有以下分类:

短期均线:5、7、10,用于预测短期走势,MA5 和 MA10 又称为短期监测线;
中期均线:20、30、60,用于预测中期走势,MA20 和 MA30 又称为警戒线, MA60 则称之为生死线;
长期均线:120、250,用于长期走势,MA120 又称为确认线,MA250 则通常被看做反转线,又称为牛熊分界线。

策略缺陷

滞后性:均线归根到底是一种平均值,在应用中存在的最大问题就是滞后性。当出现买入卖出信号时,最佳时机早已过去。举例来说,如果A股票最新价格出现了较大的涨幅,股价和均线都上涨,但均线的速度慢于股价上涨速度。此时,从形态上来看,金叉出现,为买入信号。次日,股价回调,股价下降的速度快于均线下降的速度,形成死叉,为卖点。这样一买一卖不仅没有盈利,反而出现亏损。
长短周期难以选择:如果两根均线的周期接近,比如5日线,10日线,这种非常容易缠绕,不停的产生买点卖点,会有大量的无效交易,交易费用很高。如果两根均线的周期差距较大,比如5日线,60日线,这种交易周期很长,趋势性已经不明显了,趋势转变以后很长时间才会出现买卖点。也就是说可能会造成很大的亏损。所以两个参数选择的很重要,趋势性越强的品种,均线策略越有效。
策略优化尝试方向:

使用加权移动平均值:均线策略的一大缺陷是指标具有滞后性,因此可以使用加权移动平均值代替移动平均值。计算时将短期(如昨天)的权重增大,以加强指标的敏感性。
不局限于收盘价:可以尝试将最高价、最低价等加入到加权移动平均值的计算中。
自适应调整均线周期:价格走势进入单边上涨趋势,自适应均线自动缩短周期,采用短期均线,转为向上移动;市场走势进入横盘震荡,自适应均线自动延长周期,采用长期均线,转为横向移动。

双均线择时策略代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts

# 设置tushare token
# tushare_token = 'your_tushare_token'
tushare_token = '0858b935f4518d9e56ffeb19910dc13e296291364ea1d7bd574eb84b'
ts.set_token(tushare_token)
pro = ts.pro_api()

# 获取股票数据
df = pro.daily(ts_code='000001.SZ', start_date='20210101', end_date='20230630', fields='trade_date,close')

# 计算短期均线和长期均线
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()

# 生成交易信号
df['signal'] = np.where(df['MA5'] > df['MA20'], 1, -1)

# 计算当天持仓状态
df['position'] = df['signal'].diff()

# 回测策略
df['return'] = df['close'].pct_change()  # 计算每日收益率
df['strategy_return'] = df['position'].shift() * df['return']  # 计算每日持仓收益

# 计算累计收益率
df['cumulative_return'] = (1 + df['strategy_return']).cumprod()
df["trade_date"]=pd.to_datetime(df["trade_date"],format="%Y%m%d")
df= df.set_index(df.columns[0])
# 可视化结果
plt.plot(df['cumulative_return'])
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.title('Dual Moving Average Strategy')
plt.xticks(rotation=100)
plt.show()

在这里插入图片描述
在这个示例代码中,我们使用了tushare库获取了股票代码为000001.SZ的股票数据。然后,计算了其中的短期均线(5日均线)和长期均线(20日均线)。根据这两条均线的交叉情况,生成了买入和卖出的信号。如果短期均线在长期均线之上,产生买入信号(1),如果短期均线在长期均线之下,产生卖出信号(-1)。

接下来,我们根据这些信号计算了每天的持仓状态,持仓状态的变化显示了买入和卖出的时机。然后,通过计算每日收益率和策略的收益率,我们可以回测该策略的表现。最后,我们计算了累计收益率,并使用Matplotlib可视化了策略的表现。

请注意,这只是一个示例代码,你可以根据自己的需求和策略进行修改和优化。在实际应用时,还需要考虑交易成本、滑点、止损和止盈等因素。投资有风险,建议在实际操作之前进行充分的研究和回测。

2.3 MACD均线择时策略

MACD称为异同移动平均线(Moving Average Convergence and Divergence),是由指数均线演变而来的,由Gerald Appel在1979年提出,是一个比较常见的技术指标。MACD指标通过对金融资产价格的收盘价进行平滑处理,生成了两线一柱组合,其中两线是快速线DIF(Difference Line)和慢速线DEA(Signal Line),一柱是柱状图MACD。MACD指标是快速线DIF与慢速线DEA的差,可以反映出股票近期价格走势的变化强弱和能量,用于把握股票的准确买卖点。

短期EMA:短期(如,12天)的收盘价指数移动平均值,一般采用EMA(price, 12)
长期EMA:长期(如,26天)的收盘价指数移动平均值,一般采用EMA(price, 26)
DIF:短期EMA与长期EMA的差值,即DIF=EMA(price, 12)-EMA(price, 26)
DEA:DIF的多日(如,9天)指数移动平均值,即DEA=EMA(DIF, 9)
MACD:DIF线与DEA线的差,即MACD=DIF-DEA

依据MACD进行择时
当MACD从负数转向正数,快速线DIF自下而上穿过慢速线DEA时,形成金叉,即买入信号。

当MACD从正数转向负数,快速线DIF自上而下穿过慢速线DEA时,形成死叉,即卖出信号。

当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变

上述用法是MACD指标最直接且最经典的用法,具有完全的客观判断标准,可以很方便的用计算机来实现,并对其进行历史测试。MACD还有其他许多用法,比如底背离、顶背离等,但这些用法中的主观判断成份很重,没有统一客观的使用标准,不同的人使用的结果可能大不一样,也难以用计算机来实现。

中证500ETF在2022年12月到2023年6月的走势如下图,MACD指标在下方的窗格。

相比双均线策略,MACD将两条线转换成了单个指标,更容易观察,并且避免了双均线策略里两条均线经常在震荡行情下经常发生交叉的现象出现,减少频繁发出假信号的缺陷,MACD适用于研判中长期走势。
在这里插入图片描述

MACD指标的核心功能在于度量均线势能的变化,或者说是股价的二阶差变化,当股价上涨开始乏力时,MACD指标往往能较早的发出卖出信号,使得策略能在股价开始拐头下跌时及时离场,这是MACD指标具有较好风险控制能力的原因。

但是,当遇到大型的趋势上涨行情时,MACD指标可能会错误地过早离场,虽然根据策略逻辑,之后还会继续发出买入信号,但难免错失一段利润,所以在趋势上涨行情中,MACD策略的投资收益会不如股票指数的自身涨幅。

import numpy as np
import pandas as pd
import talib as ta 
# Joinquant数据下载API
from jqdatasdk import *
# 登录验证
auth("Your_phonenum", "Your_passwd")
import matplotlib.pyplot as plt

# 下载数据
# 下载2015-2018年的沪深300指数,频率为每天,只要收盘价
price = get_price("000300.XSHG", start_date="2015-01-01", end_date="2018-12-31", frequency="daily", fields=['close'])['close']
# 用python自带的tseries库中的pct_change()函数计算日收益率
ret = price.pct_change()

# 用talib库中的相应函数计算MACD指标
dif, dea, macd = ta.MACD(price)
# 只考虑MACD指标,MACD转正时开仓买入,转负时清仓
sig = (macd>0)

# sig滞后一期、去除空值、转换成整数
sig_lag = sig.shift(1).fillna(0).astype(int)
# sig_lag与股票日收益率相乘,即可得策略日收益率。python能自动对齐时间序列的日期。
sig_ret = sig_lag*ret
# 计算策略累计收益
cum_sig_ret = (1+sig_ret).cumprod()

# 把股票价格转换成从1开始,方便比较
price_norm = price/price[0]

# 简单起见,这里不考虑手续费,作图比较该策略和“买入-持有”策略的表现。
plt.figure(figsize=(18,8))
plt.plot(price_norm)
plt.plot(cum_sig_ret)
plt.legend(["benchmark", "strategy cumulative return"], loc="upper left")
plt.show()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络防御安全知识(第三版)

配置黑洞路由 --- 黑洞路由即空接口路由,在NAT地址池中的地址,建议配置达到这个地址指 向空接口的路由,不然,在特定环境下会出现环路。(主要针对地址池中的地址和出接口地址 不再同一个网段中的场景。) …

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

档案数字化转型面临问题

档案数字化转型面临以下问题: 1. 技术问题:档案数字化需要借助先进的技术手段和设备,包括扫描仪、存储设备和数据管理软件等。这些技术的成本高、操作复杂,需要专业的人员进行操作和维护。 2. 安全问题:档案数字化后的…

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 前言 sylar是…

[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!

一,题目 遇到的一道算法题: 1,已知有一个数字矩阵(row行,col列),矩阵的每行 从左到右 递增,每列 从上到下 递增。 2,现输入一个数字 num ,判断数字矩阵中…

Python列表中的append功能及用法举例

Python列表中的append功能及用法举例 🌵文章目录🌵 🌳引言🌳🌳append()🌳🍀功能介绍🍀🍀语法🍀🍀示例🍀🍀注意事项&#x…

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案 大家好 我是寸铁👊 总结了一篇Windows11下启动rpc服务报错panic解决方案的文章✨ 喜欢的小伙伴可以点点关注 💝 问题来源 今天在编写完proto文件后,使用goctl生成…

jenkins pipeline配置maven可选参数

1、在Manage Jenkins下的Global Tool Configuration下对应的maven项添加我们要用得到的不同版本的maven安装项 2、pipeline文件内容具体如下 我们maven是单一的,所以我们都是配置单选参数 pipeline {agent anyparameters {gitParameter(name: BRANCH_TAG, type: …

【算法Hot100系列】合并区间

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快,为什么不用它做主数据库,只用它做缓存? 2.Redis 一般在什么场合下使用? 3.redis为什么这么快? 4.Redis为什么要引入了多线程? 1.既然redis那么快,为什么不用它做主数据…

电路笔记 :MOS场效应晶体管+红外遥控+AMS1117 电源模块

三极管(BJT,Bipolar Junction Transistor)和 MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor)是两种不同类型的晶体管,它们在工作原理、性能特性和应用方面有一些重要的区别。 结构和工作原理…

基于.NET+FreeSql实现的仿掘金专栏前后端分离的CMS

前言 今天分享一款基于.NETFreeSql实现的仿掘金专栏前后端分离、支持Docker部署、集成了OAtuh2授权登录、QQ、Github、Gitee快速登录、简单实用的CMS:lin-cms-dotnetcore。 什么是 Lin CMS? 林间有风团官方团队Gitee地址:https://gitee.com/…

数据库管理-第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事(20240125)1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事(20240125) 作者:胖头鱼的鱼缸(尹海文) Oracle A…

【硬件产品经理】避免硬件产品失败 | 技术维度

目录 简介 技术维度一:低估产品开发 技术维度二:低估规模生产的复杂性 技术维度三:测试不足 技术维度四:产品太复杂 技术维度五:对客户承诺太高 推荐内容 简介 这节内容主要从技术维度来谈谈避免硬件产品失败这…

指针的深入了解5

1.二维数组传参本质 在此之前我们学习了一维数组传参&#xff0c;传的是它的首元素地址。那么二维数组也是这样的吗&#xff1f; 我们来看一串代码&#xff1a; void print(int(*pt)[5]) {for (int i 0; i < 3; i){for (int j 0; j < 5; j){printf("%d ",…

bert提取词向量比较两文本相似度

使用 bert-base-chinese 预训练模型做词嵌入&#xff08;文本转向量&#xff09; 模型下载&#xff1a;bert预训练模型下载-CSDN博客 参考文章&#xff1a;使用bert提取词向量 下面这段代码是一个传入句子转为词向量的函数 from transformers import BertTokenizer, BertMod…

2024年了,是谁还在学C++11?(没错,是我)

今天要聊的这本书&#xff0c; 是真正畅行全球20年的C入门必读经典&#xff0c;各版本全球总销量超1300万册&#xff01; 它惠及了数百万高校师生&#xff0c;启蒙了5代国产程序员&#xff0c; 令全球数千万C开发者全部为之疯狂的大&#xff01;师&#xff01;名&#xff01…

实现Crm系统的灵活配置,满足不同行业客户需求

目录 一&#xff1a;数据模型配置 二&#xff1a;流程配置 三&#xff1a;扩展性配置 实现CRM系统的可配置性需要关注以下几个方面&#xff1a; 一&#xff1a;数据模型配置 为了满足企业的个性化需求&#xff0c;CRM系统需要提供灵活的数据模型配置。用户可以根据自己的业…

秋招面试—计算机网络安全

2021 计算机网络安全 1.Get 和 Post 的区别 get 用于获取数据&#xff0c;post用于提交数据&#xff1b; get 的缓存保存在浏览器和web服务器日志中&#xff1b; get 使用明文传输&#xff0c;post请求保存在请求体中&#xff1b; get 长度限制在2048以内 2.常见的HTTP请…

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案&#xff0c;开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞&#xff0c;该漏洞源于文件server/application/api/contr…