【暴力量化】查找最优均线

news2024/11/16 2:16:14

搜索逻辑

代码主要以支撑概率和压力概率来判断均线的优劣
判断为压力: 当日线与测试均线发生金叉或即将发生金叉后继续下行
判断为支撑: 当日线与测试均线发生死叉或即将发生死叉后继续上行
判断结果的天数: 小于6日均线,用金叉或死叉后2个交易日的结果判断;大于等于6日的n日均线,用n/2个交易日判断
判断逻辑: 使用判断点(金叉 or 死叉)后n/2个交易日的收盘价的一次回归线的斜率,大于0为上行,小于0为下行
补充: 把判断点由近似点改成准确点(即日线与均线发生交叉)后,1-压力概率 即为金叉概率,1-压力概率 即为死叉概率

数据处理

数据来源: tushare 或 通信达,我使用的是通信达导出的2015年至今的日线数据
数据处理: 把每只股票的数据按照日期从小到大排列后,取出收盘价即可
如果你有分钟数据,也可以搜索分钟级别的均线压力和支撑

数据处理代码
def readData(self,r_path):
        '''
        1、r_path: 通信达导出的日线数据所在的目录
        2、生成函数,每次获取一支股票2015年至今的收盘数据
        '''
        files = os.listdir(r_path)
        for f_path in files:
            f_path = os.path.join('日线_data',f_path)
            df = pd.read_csv(f_path
                             ,header=None
                             ,index_col=False
                             ,encoding='gbk'
                             ,names=['trade_date','open','high','low','close','vol','amount']).dropna()
            df = df.sort_values('trade_date').reset_index(drop=True)
            yield df['close']

查找代码

判断金叉和死叉的逻辑

判断金叉和死叉的代码逻辑一开始属实让我难理解,看四五遍才清除,下面给一个我觉得比较清楚的示例

# 计算均线
ma = data.rolling(5).mean() # 计算5日均线
cmp = data > ma * 0.97 # 有时不触及均线也会有支撑和压力,但不会有金叉和死叉,所以要适当抬高或降低均线,自己设置
'''
    计算金叉和死叉,金叉用于计算压力,死叉用于计算支撑
    金叉计算逻辑
                cmp: F F F T T T F F F
    (~cmp).shift(1):   T T T F F F T T T
         golden_idx: F F F T F F F F F # 金叉结果
    
    反过来就是死叉
'''
golden_idx = cmp & (~cmp).shift(1) #金叉
cmp = data > ma * 1.03 # 计算死叉,抬高均线
death_idx = ~cmp & cmp.shift(1) # 死叉

整体搜索代码

def find_best_ma(self,r_path,days:tuple):
    assert days[0] <= days[1],'计算均线日期错误,格式(起始,结束)'
    assert days[0] > 1,'最小天数要大于1'
    datas = self.readData(r_path)
    # 保存结果
    result = pd.DataFrame({
        'MA':[*range(days[0],days[1]+1)]
        ,'支撑成功率':np.zeros(days[1]-days[0]+1)
        ,'支撑成功次数':np.zeros(days[1]-days[0]+1)
        ,'支撑总次数':np.zeros(days[1]-days[0]+1)
        ,'压力成功率':np.zeros(days[1]-days[0]+1)
        ,'压力成功次数':np.zeros(days[1]-days[0]+1)
        ,'压力总次数':np.zeros(days[1]-days[0]+1)
    })
    result = result.set_index('MA')
    for data in datas:
        data_len = len(data) # 数据长度
        for day in range(days[0],days[1]+1):
            # 计算均线
            ma = data.rolling(day).mean()
            '''
                计算金叉和死叉,金叉用于计算压力,死叉用于计算支撑
                金叉计算逻辑
                            cmp: F F F T T T F F F
                (~cmp).shift(1):   T T T F F F T T T
                     golden_idx: F F F T F F F F F
            '''
            cmp = data > ma * 0.97 # 有时不触及均线也会有支撑和压力,但不会有金叉和死叉,所以要适当抬高或降低均线
            golden_idx = cmp & (~cmp).shift(1)
            cmp = data > ma * 1.03 # 计算死叉,抬高均线
            death_idx = ~cmp & cmp.shift(1)
            # 转成索引
            golden_idx = golden_idx[golden_idx].index
            death_idx = death_idx[death_idx].index
            # 把长度加进总数里
            result.loc[day,['压力总次数']] += len(golden_idx)
            result.loc[day,['支撑总次数']] += len(golden_idx)
            '''
                设置参考天数,用于判断后续涨跌
                如果均线小于等于5天,则用后2天判断
                如果均线大于5天,则n天均线准确率用后n/2天的涨势判断
            '''
            pre_day = 2 if day <=5 else int(day/2)
            '''
                支撑成功判断:死叉当天到后续pre_day天计算回归,斜率大于0
                死叉成功判断:死叉当天到后续pre_day天计算回归,斜率大于0
            '''
            for idx in golden_idx:
                if idx >= data_len-1:
                    result.loc[day,['压力总次数']] -= 1
                    continue # 位置太靠后,没有结果参考,跳过
                if data_len-idx < pre_day:
                    pre_day = data_len-idx # 后续数据不足以参考天数,改为用后面剩的几天判断
                y = data[idx:idx + pre_day + 1]
                x = range(1,len(y)+1)
                k,b = np.polyfit(x,y,deg=1) # 线性回归预测
                if k < 0:
                    result.loc[day,['压力成功次数']] += 1 # 小于0则说明均线有压力
            for idx in death_idx:
                if idx >= data_len-1:
                    result.loc[day,['支撑总次数']] -= 1
                    continue # 位置太靠后,没有结果参考,跳过
                if data_len-idx < pre_day:
                    pre_day = data_len-idx # 后续数据不足以参考天数,改为用后面剩的几天判断
                y = data[idx:idx + pre_day + 1]
                x = range(1,len(y)+1)
                k,b = np.polyfit(x,y,deg=1) # 线性回归预测
                if k > 0:
                    result.loc[day,['支撑成功次数']] += 1 # 小于0则说明均线有压力
        result['压力成功率'] = round(result['压力成功次数']/result['压力总次数'],4) # 更新一次结果
        result['支撑成功率'] = round(result['支撑成功次数']/result['支撑总次数'],4) # 更新一次结果
        os.system('cls')
        max = result.idxmax()
        max_support = result['支撑成功率'].max()
        max_presure = result['压力成功率'].max()
        print(tabulate(result.head(15), headers='keys', tablefmt='psql'),flush=True)         
        print('当前最优值',flush=True)
        print('支撑\t','MA {}\t'.format(max['支撑成功率']),max_support,flush=True)
        print('压力\t','MA {}\t'.format(max['压力成功率']),max_presure,end='',flush=True) 
        result.to_csv('最优均线.csv',encoding='utf-8-sig')

效果展示,以5到30天均线搜索为例

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tensorflow中的多层感知器学习

Tensorflow中的多层感知器学习 在这篇文章中&#xff0c;我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现。 多层感知 多层感知也被称为MLP。它是完全连接的密集层&#xff0c;可以将任何输入维度转化为所需维度。多层感知是一个具有多层的神经网络。为了创…

【黑马SpringCloud(6)】Sentinel解决雪崩问题

微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…

ROS2+nav2+激光雷达导航实践(上)

目录写在前面安装nav2nav2介绍nav2实践map地图保存地图读取状态估计(TF变换)所需TF坐标base_link -> sensor framesodom -> base_linkLaser Scan Matcher for ROS2map -> odomAMCL使用AMCL参数配置文件amcl_config.yaml效果过程中的知识点一、launch文件编写格式及方法…

Python 之 NumPy 切片索引和广播机制

文章目录一、切片和索引1. 一维数组2. 二维数组二、索引的高级操作1. 整数数组索引2. 布尔数组索引三、广播机制1. 广播机制规则2. 对于广播规则另一种简单理解一、切片和索引 ndarray 对象的内容可以通过索引或切片来访问和修改&#xff08;&#xff09;&#xff0c;与 Pytho…

30、基于51单片机交通灯车流量管控数码管显示系统设计

摘要 随着社会主义的建设&#xff0c;城市的规模在不断扩大&#xff0c;城市的交通也在不断的提高和改进&#xff0c;交通的顺畅已经成为制约社会主义建设的一个重要因素。目前&#xff0c;伴随着机动车辆的不断增加&#xff0c;尤其是十字路口的交通建设 颇为关键&#xff0c…

PID控制算法简介

目录 1 简介 2 比例Proportional 3 积分Integral 4 微分Differential 5 公式 6 积分限幅 7 积分限行 8 相关代码 1 简介 PID控制中有P、I、D三个参数&#xff0c;PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#…

【渝偲医药】实验室关于核磁共振波谱NMR的知识(原理、用途、分析、问题)

核磁共振波谱法&#xff08;Nuclear Magnetic Resonance&#xff0c;简写为NMR&#xff09;与紫外吸收光谱、红外吸收光谱、质谱被人们称为“四谱"&#xff0c;是对各种有机和无机物的成分、结构进行定性分析的强有力的工具之一&#xff0c;亦可进行定量分析。 核磁共振&…

目标检测的旋框框文献学习

这是最近打算看完的文献&#xff0c;一天一篇 接下来将记录一下文献阅读笔记&#xff0c;避免过两天就忘了 RRPN 论文题目&#xff1a;Arbitrary-Oriented Scene Text Detection via Rotation Proposals 论文题目&#xff1a;通过旋转方案进行任意方向的场景文本检测&#x…

深度学习刷 SOTA 有哪些 trick?

“深度学习刷 SOTA 有哪些 trick&#xff1f;”&#xff0c;此问题在知乎上有超 1700 人关注&#xff0c;浏览量超 32 万&#xff0c;相信是大家都非常关心的问题&#xff0c;快一起看看下面的分享吧&#xff0c;希望可以帮助到大家~对于图像分类任务&#xff0c;让我们以 Swin…

阿里前端必会手写面试题汇总

实现节流函数&#xff08;throttle&#xff09; 节流函数原理:指频繁触发事件时&#xff0c;只会在指定的时间段内执行事件回调&#xff0c;即触发事件间隔大于等于指定的时间才会执行回调函数。总结起来就是&#xff1a; 事件&#xff0c;按照一段时间的间隔来进行触发 。 像d…

啪,还敢抛出异常

&#x1f649; 作者简介&#xff1a; 全栈领域新星创作者 &#xff1b;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求&#xff0c;把分享变成一种习惯&#xff0c;再小的帆也能远航。 &#x1f3e1; 个人主页&#xff1a;xiezhr的个人主页 前言 去年又重新刷了…

DELL游匣ubuntu2004系统 RTX3060显卡,cuda11.4,cudnn8.2.4安装

1.安装Ubuntu2004的系统2.驱动安装前的准备工作第一步&#xff1a;修改设置下载源~阿里源。在Software Updater在第一栏Ubuntu Software页面中&#xff0c;找到Download from&#xff0c;选择->China->mirrors.aliyun.com,点击确认。第二步&#xff1a;sudo apt-get upda…

都说爱有回音,这次情人节驱动人生宠你!

来了来了&#xff0c;它又来了——那个一波人狂欢&#xff0c;一波人孤单的节日。 眼看着身边人在订花订餐厅&#xff0c;选礼物&#xff0c;空气中弥漫着微妙的氛围&#xff0c;驱动哥脑海里只有明天下班的地铁挤不挤得过这群约会的人。 不过根据哥的观察&#xff0c;发现一个…

【GlobalMapper精品教程】046:空间操作(3)——并集(Union)

本文讲解globalmapper空间操作中一种很重要的工具:并集。 文章目录 一、工具介绍1. 并集原理2. GM并集工具二、案例演示1. 加载数据2. 并集运算三、结果分析1. 空间变化2. 属性表变化3. 空间和属性对应关系一、工具介绍 1. 并集原理 并集(union)操作创建由两个输入图层的所…

80 90后表示真干不过,部门新来的00后已经把我卷奔溃了,不想干了····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;刚开年我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

操作系统开发:启用内存分页机制

目前我们已进入保护模式,但依然会受到限制,虽然地址空间达到了4GB,但此空间是包括操作系统共享的4GB空间&#xff0c;我们把段基址段内偏移地址称为线性地址&#xff0c;线性地址是唯一的&#xff0c;只属于某一个进程。在我们机器上即使只有512MB的内存&#xff0c;每个进程自…

开发微服务电商项目演示(四)

一&#xff0c;网关服务限流熔断降级第1步&#xff1a;启动sentinel-dashboard控制台和Nacos注册中心服务第2步&#xff1a;在网关服务中引入sentinel依赖<!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>sprin…

快速排序基本原理

快速排序基本原理1.快速排序1.1 基本原理1.2 快速排序执行步骤1.2.1 分区包含步骤1.2.1 分区步骤1.3 快速排序大O记法表示2. 将[0,5,2,1,6,3]进行快速排序 【实战】2.1 第一次分区步骤2.2 第二次分区步骤2.3 第三次分区步骤2.4 第四次分区步骤3.快速排序代码实现1.快速排序 1.…

一文盘点,ZBC的应用场景与通缩场景

进入到2023年&#xff0c;Zebec生态正在向新的叙事方向发展。一方面我们看到&#xff0c;流支付生态Zebec在此前正式走向DAO&#xff0c;并上线了DAO治理投票平台Zebec Node&#xff0c;任何持有ZBC的用户都可以参与投票。另一方面我们看到生态正在朝着最初的愿景迸发&#xff…

3.28 haas506 2.0开发教程-example-蓝牙多设备扫描(仅支持M320,HD1)

haas506 2.0开发教程-example-蓝牙多设备扫描案例说明蓝牙信息克隆1.手机蓝牙改名信息克隆代码测试案例说明 开发板扫描蓝牙设备&#xff0c;获取并打印蓝牙设备mac地址。mac地址每个设备不同&#xff0c;且不能更改。本案例仅适用于M320开发板和HD1-RTU。案例使用手机与iBeac…