策略验证_指标买点分析技法_运用boll布林线指标选择买点

news2024/11/16 15:35:51

写在前面:
1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文;
2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》
3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用

目录

解说

策略代码

结果


解说

        布林线(BOLL)是金融市场常用的技术指标之一,属于价格路径指标。它利用统计原理,求出股价的标准差及其信赖区间,从而确定股价的波动范围及未来走势,利用波带显示股价的风险、安全的高低价位,因此也称之为布林带。

        运用布林线指标选择买点的依据如下:

        1)当股价穿越最外面的支撑线时,表示买点出现。

        2)当股价沿着压力线(支撑线)上升,虽然股价并未穿越,但若回头突破支撑线(压力线)即是买点。

        3)股价由下向上穿越下轨线(LOWER)时,可视为买进信号。

        4)股价突破上轨,回探时仍在上轨线附近,表示后市上涨的机会增大,是加仓买进的信号。

        5)波带如果开始收紧,表示股价将会发生变化,此时可结合多个技术参数进行分析,做出正确的判断。

策略代码

书籍中提交的买入点与网上查询到的有些出入,本文只考虑以下三种情况:

 

def excute_strategy(base_data,data_dir):
    '''
    指标买点分析技法 - 运用boll布林线指标选择买点
    解析:
    选择买点依据:
    1. 当股价穿越最外面的支撑线时,表示买点出现
    2. 当股价沿着压力线(支撑线)上升,虽然股价并未穿越,但若回头突破支撑线(压力线)即是买点。
    3. 股价由下向上穿越下轨线(LOWER)时,可视为买进信号
    4. 股价突破上轨,回探时仍在上轨线附近,表示后市上涨的机会增大,是加仓买进的信号。
    5. 波带如果开始收紧,表示股价将会发生变化,此时可结合多个技术参数进行分析,做出正确的判断
    PS: UPER 压力线;LOWER支撑线
    自定义:
    1. 靠近、附近 =》 数值差额小于0.5%
    2. 买入时点 =》 走势确定后下一交易日
    3. 胜 =》 买入后第三个交易日收盘价上升,为胜
    只计算最近两年的数据
    :param base_data:股票代码与股票简称 键值对
    :param data_dir:股票日数据文件所在目录
    :return:
    '''
    import pandas as pd
    import numpy as np
    import talib,os
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    from tools import stock_factor_caculate

    def res_pre_two_year_first_day():
        pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')
        return pre_year_day
    caculate_start_date_str = res_pre_two_year_first_day()

    dailydata_file_list = os.listdir(data_dir)

    total_count = 0
    total_win = 0
    check_count = 0
    list_list = []
    detail_map = {}
    factor_list = ['BOLL']
    ma_list = []
    for item in dailydata_file_list:
        item_arr = item.split('.')
        ticker = item_arr[0]
        secName = base_data[ticker]
        file_path = data_dir + item
        df = pd.read_csv(file_path,encoding='utf-8')
        # 删除停牌的数据
        df = df.loc[df['openPrice'] > 0].copy()
        df['o_date'] = df['tradeDate']
        df['o_date'] = pd.to_datetime(df['o_date'])
        df = df.loc[df['o_date'] >= caculate_start_date_str].copy()
        # 保存未复权收盘价数据
        df['close'] = df['closePrice']
        # 计算前复权数据
        df['openPrice'] = df['openPrice'] * df['accumAdjFactor']
        df['closePrice'] = df['closePrice'] * df['accumAdjFactor']
        df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']
        df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']

        if len(df)<=0:
            continue

        # 开始计算
        for item in factor_list:
            df = stock_factor_caculate.caculate_factor(df,item)
        for item in ma_list:
            df = stock_factor_caculate.caculate_factor(df,item)
        df.reset_index(inplace=True)
        df['i_row'] = [i for i in range(len(df))]
        df['three_chg'] = round(((df['close'].shift(-3) - df['close']) / df['close']) * 100, 4)
        df['three_after_close'] = df['close'].shift(-3)

        # upper mid lower
        # 股价上穿上轨的点
        df['up_close_up'] = 0
        df.loc[(df['closePrice'].shift(1)<df['upper'].shift(1)) & (df['closePrice']>=df['upper']),'up_close_up'] = 1
        df['up_close_down'] = 0
        df.loc[(df['closePrice'].shift(1)>df['upper'].shift(1)) & (df['closePrice']<=df['upper']),'up_close_down'] = 1
        up_point_rows_list = df.loc[(df['up_close_up']==1) | (df['up_close_down']==1)]['i_row'].values.tolist()

        df['distance_upper'] = df['closePrice']-df['upper']
        df['near_upper'] = 0
        df.loc[(df['distance_upper']>0) & (df['distance_upper']/df['upper']<=0.005),'near_upper'] = 1
        df['ext_0'] = df['near_upper'] - df['near_upper'].shift(1)
        df['ext_1'] = df['near_upper'] - df['near_upper'].shift(-1)
        start_i_row_list = df.loc[df['ext_0']==1]['i_row'].values.tolist()
        end_i_row_list = df.loc[df['ext_1']==1]['i_row'].values.tolist()
        nearest_upper_list = []
        if start_i_row_list and end_i_row_list:
            if start_i_row_list[0]>end_i_row_list[0]:
                end_i_row_list = end_i_row_list[1:]
            if start_i_row_list[-1]>end_i_row_list[-1]:
                start_i_row_list = start_i_row_list[:-1]
            near_upper_list = []
            for i,item in enumerate(start_i_row_list):
                start_node = item
                end_node = end_i_row_list[i]
                enter_yeah = True
                for i00 in up_point_rows_list:
                    if i00>=start_node and i00 <=end_node:
                        enter_yeah = False
                        break
                if enter_yeah:
                    near_upper_list.append([start_node,end_node])
                pass
            for item in near_upper_list:
                min_val = None
                min_i = None
                for i in range(item[0],item[1]+1):
                    if min_val is None or min_val > df.iloc[i]['distance_upper']:
                        min_val = df.iloc[i]['distance_upper']
                        min_i = i
                    pass
                if min_i:
                    nearest_upper_list.append(min_i)

        # 股价上穿下轨的点
        df['lower_close_up'] = 0
        df.loc[(df['closePrice'].shift(1)<df['lower'].shift(1)) & (df['closePrice']>=df['lower']),'lower_close_up'] = 1
        df['lower_close_down'] = 0
        df.loc[(df['closePrice'].shift(1)>df['lower'].shift(1)) & (df['closePrice']<=df['lower']),'lower_close_down'] = 1
        target_one_list = df.loc[df['lower_close_up']==1]['i_row'].values.tolist()

        lower_point_rows_list = df.loc[(df['lower_close_up']==1) | (df['lower_close_down']==1)]['i_row'].values.tolist()
        df['distance_lower'] = df['closePrice']-df['lower']
        df['near_lower'] = 0
        df.loc[(df['distance_lower']>0) & (df['distance_lower']/df['lower']<=0.005),'near_lower'] = 1
        df['ext_2'] = df['near_lower'] - df['near_lower'].shift(1)
        df['ext_3'] = df['near_lower'] - df['near_lower'].shift(-1)
        start_i_row_list0 = df.loc[df['ext_2'] == 1]['i_row'].values.tolist()
        end_i_row_list0 = df.loc[df['ext_3'] == 1]['i_row'].values.tolist()
        nearest_lower_list = []
        if start_i_row_list0 and end_i_row_list0:
            if start_i_row_list0[0] > end_i_row_list0[0]:
                end_i_row_list0 = end_i_row_list0[1:]
            if start_i_row_list0[-1] > end_i_row_list0[-1]:
                start_i_row_list0 = start_i_row_list0[:-1]
            near_lower_list = []
            for i, item in enumerate(start_i_row_list0):
                start_node = item
                end_node = end_i_row_list0[i]
                enter_yeah = True
                for i00 in lower_point_rows_list:
                    if i00 >= start_node and i00 <= end_node:
                        enter_yeah = False
                        break
                if enter_yeah:
                    near_lower_list.append([start_node, end_node])
                pass

            for item in near_lower_list:
                min_val = None
                min_i = None
                for i in range(item[0], item[1] + 1):
                    if min_val is None or min_val > df.iloc[i]['distance_lower']:
                        min_val = df.iloc[i]['distance_lower']
                        min_i = i
                    pass
                if min_i:
                    nearest_lower_list.append(min_i)


        i_row_list = nearest_upper_list + target_one_list + nearest_lower_list

        # 临时 start
        # df.to_csv('D:/temp006/'+ticker + '.csv',encoding='utf-8')
        # 临时 end

        node_count = 0
        node_win = 0
        duration_list = []
        table_list = []
        for i,row0 in enumerate(i_row_list):
            row = row0 + 1
            if row >= len(df):
                continue
            date_str = df.iloc[row]['tradeDate']
            cur_close = df.iloc[row]['close']
            three_after_close = df.iloc[row]['three_after_close']
            three_chg = df.iloc[row]['three_chg']

            table_list.append([
                i,date_str,cur_close,three_after_close,three_chg
            ])
            duration_list.append([row-2,row+3])
            node_count += 1
            if three_chg<0:
                node_win +=1
            pass

        list_list.append({
            'ticker':ticker,
            'secName':secName,
            'count':node_count,
            'win':0 if node_count<=0 else round((node_win/node_count)*100,2)
        })
        detail_map[ticker] = {
            'table_list': table_list,
            'duration_list': duration_list
        }

        total_count += node_count
        total_win += node_win
        check_count += 1
        pass
    df = pd.DataFrame(list_list)

    results_data = {
        'check_count':check_count,
        'total_count':total_count,
        'total_win':0 if total_count<=0 else round((total_win/total_count)*100,2),
        'start_date_str':caculate_start_date_str,
        'df':df,
        'detail_map':detail_map,
        'factor_list':factor_list,
        'ma_list':ma_list
    }
    return results_data

结果

 

本文校验的数据是随机抽取的81个股票

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

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

相关文章

基于云原生网关的可观测性最佳实践

作者&#xff1a; 井轶 为什么要进行可观测性建设 可观测性并不是一个新词&#xff0c;该词来源于控制理论&#xff0c;是指系统可以由其外部输出推断其其内部状态的程度&#xff0c;随着 IT 行业几十年的发展&#xff0c;IT 系统的监控&#xff0c;告警&#xff0c;问题排查…

【附源码】计算机毕业设计JAVA学生信息管理系统

【附源码】计算机毕业设计JAVA学生信息管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

联想Filez助力知名生物制药企业 建立业务数据安全体系

苏州某生物制药企业是一家抗体研发企业&#xff0c;其研发生产基地设在苏州。主要从事临床样品&#xff08;原液和成品&#xff09;的开发和生产&#xff0c;致力于通过持之以恒的研发和专业的生产技术&#xff0c;以最快的速度实现生物制品的批准。 随着企业各项业务的快速发展…

Redis——》数据类型

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型5种基本类型3种特殊类型数据类型和底层数据结构5种基本…

第一个 GoWeb 程序,三款主流框架 Beego、Gin 和 Iris 快速入门

1、什么是web应用 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。 一个Web应用程序是由完成特定任务的各种Web组件构成的并通过Web将服务展示给外界。…

网络是怎样连接的--生成HTTP请求消息过程

文章目录1.1 何为网址1.2 解析网址1.3 HTTP在干嘛1.4 生成http请求和响应1.1 何为网址 网址&#xff0c;准确来说应该叫URL,比如以http://开头的那一串东西.但实际上除了“http:”&#xff0c;网址还可以以其他一些文字开头&#xff0c;例如“ftp:”“file:”“mailto:”等。而…

免费申请Jetbrains全家桶

文章目录Jetbrains全家桶免费申请的人群学生和老师申请的要求申请方式申请流程解决收不到邮件的问题编辑内容进行认证申请成功Jetbrains全家桶 Jetbrains是著名的编程工具商业软件提供商&#xff0c;旗下有很多软件。包括IDE、团队开发工具、插件和微软.Net辅助工具、包括自创语…

[附源码]java毕业设计小型银行贷款管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C\C++刷题DAY4

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 1.第一题 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;调转指向关系&#xff0c;使用双指针的思想 1指向2&#xff0c;改成2指向1&#xff0c;以此类推。 参考代码&#xff1a; struct L…

2022年NPDP新版教材知识集锦--【第三章节】(5)

【系统工程】 系统工程的概念 系统工程原理将系统思维和系统工程过程模型的概念结合起来&#xff0c;通过设计、项目管理工具和方法的系统和集成过程将问题转化为解决方案。 所有系统都由具有属性或功能的部分组成&#xff0c;元素之间通过关系相互联系。 系统复杂性由结构…

想学爬虫爬取网页,但是不知道流程?

爬取网页总体概述&#xff1a; 1.使用urllib请求网页&#xff0c;获取网页源码。 2.使用bs4配合re正则表达式进行页面数据解析&#xff0c;获取到自己想要的数据。 3.使用pymysql保存到数据库或xlwt保存成excel文件。 温馨提示&#xff1a;学习之前需要先了解py基础知识&#x…

PTA题目 计算符号函数的值

对于任一整数n&#xff0c;符号函数sign(n)的定义如下&#xff1a; 请编写程序计算该函数对任一输入整数的值。 输入格式: 输入在一行中给出整数n。 输出格式: 在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。 输入样例1: 10输出样例1: sign(10) 1输入样…

住宅代理详细介绍——助您快速入门!

Oxylabs的高级代理池能够为客户提供来自世界各地的1亿多个住宅代理&#xff0c;并且其规模还在不断壮大中&#xff0c;即使是难搞的网络抓取任务也能够处理。住宅代理能轻松从复杂的目标中收集数据&#xff0c;帮助您在无需面对CAPTCHA验证或封锁的情况下实现抓取。 想要全方位…

在 Kubernetes 上最小化安装 KubeSphere

文章目录什么是 KubeSphere搭建环境准备工作部署 KubeSphere卸载 KubeSphere常见问题什么是 KubeSphere KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统&#xff0c;完全开源&#xff0c;支持多云与多集群管理&#xff0c;提供全栈的 IT 自动化运维能力…

免费公众号题库

免费公众号题库 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…

java之《图书管理系统》庖丁解牛

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《java练级之旅》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我…

大数据挖掘建模平台是怎样的?

大数据挖掘建模平台是可视化、一站式、高性能的数据挖掘与人工智能建模服务平台。面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式&#xff0c;通过丰富内置算法&#xff0c;帮助用户快速、一站式地进行数据分析及挖掘建模&#xff0c;可应用于处理海量数据、高复…

初识VisionPro应用开发

文章目录一、引言二、VisionPro应用开发指南1. 上手指南1.1. VisionPro开发概述1.2. 高级开发功能2. 选择应用开发路径&#xff08;方式&#xff09;2.1. 路径1&#xff1a;用QuickBuild和应用程序向导生成的操作接口进行交互式开发2.2. 路径2&#xff1a;用QuickBuild和自定义…

MySQL 经典面试题分析(值得收藏)

MySQL是程序员面试必问题目点之一&#xff0c;因为 MySQL 几乎占据了数据库的半壁江山。数据库的核心与原理基本是相通的&#xff0c;所以有了 MySQL 的基础之后&#xff0c;再去熟悉其他数据库也是非常快的&#xff0c;那么让我们一起来了解一下MySQL 。 MySQL 有很多存储引擎…

铁矿行业BI经营分析框架(二)万能框架-增长性、盈利性、流动性

有关铁矿行业的一些基础业务知识&#xff0c;铁矿行业的竞争本质上就是规模和成本的竞争。从业务角度探、采、选、冶这四块最重要的就是选矿这个过程。因为国内铁矿品位比较低&#xff0c;大部分都是30%左右的贫矿&#xff0c;所以选矿的成本就比较高。 要优化现金成本&#xf…