策略验证_指标买点分析技法_运用MACD确定最佳买点

news2025/4/26 4:03:04

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

目录

解说

策略代码

结果


解说

        平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标。MACD是查拉尔·阿佩尔于1979年提出的,它是一项利用短期(常用为12日)移动平均线与长期(常用为26日)移动平均线之间的聚合与分离状况,对买进、卖出时机做出研判的技术指标。

        MACD就是用快速和慢速的两条均线的交叉换位、合并分离的特征,来分析研究股市的走势,从而正确引导投资者合理地判断股票的买点和卖点。

        MACD指标对买点的应用原则如下。【下文中提到的MACD线在本文策略中表达为DEA线】

        1)MACD线的交叉具有一定的中期提示作用。如果处于0轴以下,并出现两次交叉,则是明显的买进信号。

        2)当DIF与MACD都在0轴以上,而DIF向上突破MACD时,表明股市处于一种强势之中,股价将再次上涨,可以继续买进股票或持续待涨,这就是MACD指标“黄金交叉”的另一种形式。

        3)当红柱持续放大时,表明股市处于牛市行情中,股价将继续上涨,这时应持股待涨或短线买入股票,直到红柱无法再放大时才可以考虑卖出。

        4)当绿柱开始消失、红柱开始放出时,这也是股市转市信号之一,表明股市的下跌行情已经结束,股价将开始加速上升,这时应开始继续买入股票或持股待涨。

策略代码

def excute_strategy(base_data,data_dir):
    '''
    指标买点分析技法 - 运用MACD确定最佳买点
    解析:
    1. 处于0轴以下,并出现两次交叉,是明显的买进信号。
    2. DIF和DEA在0轴以上,DIF上穿DEA
    3. 红柱持续放大
    4. 绿柱开始消失,红柱开始放出
    自定义:
    1. 红柱持续放大 =》 连续三日涨跌幅为正
    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 = ['MACD']
    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)

        # DIFF DEA MACD
        df['one_yeah'] = 0
        df.loc[(df['DIFF']<0) & (df['DEA']<0) & (df['DIFF'].shift(1)>df['DEA'].shift(1)) & (df['DIFF']<=df['DEA']),'one_yeah'] = 1
        df.loc[(df['DIFF']<0) & (df['DEA']<0) & (df['DIFF'].shift(1)<df['DEA'].shift(1)) & (df['DIFF']>=df['DEA']),'one_yeah'] = 1
        df['two_yeah'] = 0
        df.loc[(df['DIFF'].shift(1)>0) & (df['DIFF']<=0),'two_yeah'] = 1
        df.loc[(df['DIFF'].shift(1)<0) & (df['DIFF']>=0),'two_yeah'] = 1
        df.loc[(df['DEA'].shift(1)>0) & (df['DEA']<=0),'two_yeah'] = 1
        df.loc[(df['DEA'].shift(1)<0) & (df['DEA']>=0),'two_yeah'] = 1

        zero_list = df.loc[df['two_yeah']==1]['i_row'].values.tolist()
        one_list = df.loc[df['one_yeah']==1]['i_row'].values.tolist()
        target_one_list = []
        for i in range(0,len(one_list)-2):
            pre_node = one_list[i]
            after_node = one_list[i+1]
            enter_yeah = True
            for i0 in zero_list:
                if i0>after_node:
                    break
                if i0>pre_node and i0<after_node:
                    enter_yeah = False
                    break
            if enter_yeah:
                target_one_list.append(after_node)
            pass

        df['target_yeah'] = 0
        if len(target_one_list)>0:
            df.loc[df['i_row'].isin(target_one_list),'target_yeah'] = 1
        df.loc[(df['DIFF']>0) & (df['DEA']>0) & (df['DIFF'].shift(1)<df['DEA'].shift(1)) & (df['DIFF']>=df['DEA']),'target_yeah'] = 1

        df['macd_chg'] = df['MACD'] - df['MACD'].shift(1)
        df['three_yeah'] = 0
        df.loc[(df['MACD'].shift(2)>0) & (df['MACD'].shift(1)>0) & (df['MACD']>0) & (df['macd_chg'].shift(2)>0) & (df['macd_chg'].shift(1)>0) & (df['macd_chg']>0),'three_yeah'] = 1
        df['four_yeah'] = 0
        df.loc[(df['MACD'].shift(1)<0) & (df['MACD']>=0),'four_yeah'] = 1
        four_list = df.loc[df['four_yeah']==1]['i_row'].values.tolist()
        three_list = df.loc[df['three_yeah']==1]['i_row'].values.tolist()
        target_three_list = []
        two_list = four_list + three_list
        two_list.sort()
        for item in four_list:
            i = two_list.index(item)
            if i < len(two_list)-1:
                target_three_list.append(two_list[i+1])

        df.loc[df['MACD'].isin(target_three_list),'target_yeah'] = 1

        df.loc[(df['MACD'].shift(1)<0) & (df['MACD']>0),'target_yeah'] = 1

        i_row_list = df.loc[df['target_yeah']==1]['i_row'].values.tolist()

        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/30045.html

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

相关文章

【node.js】第六章 初识express

目录 1. express简介 1.1 express的概念 1.2 express的作用 2. express的使用 2.1 使用express创建Web服务器 2.2 监听GET/POST请求 2.3 获取URL的请求参数 3. 托管静态资源 3.1 express.static 3.2 托管多个静态资源 3.3 挂载路径前缀 4. nodemon 1. express…

Docker镜像操作、容器操作、数据卷及挂载数据卷

目录 一、镜像操作 案例&#xff1a;从DockerHub中拉取一个nginx镜像并查看 案例&#xff1a;利用docker save将nginx镜像导出磁盘&#xff0c;然后再通过load加载回来 二、容器操作 案例&#xff1a;创建运行一个Nginx容器 案例&#xff1a;创建并进入redis容器&#xf…

随笔记录-看nacos源码

Import注解 Import注解可以导入一些配置类&#xff0c;也就是创建一些指定对象。 使用Import导入普通类 项目结构中&#xff0c;import-consumer和import-provider都是同层级的module&#xff0c;import-consumer的pom文件中有引用import-provider的依赖&#xff1b; import…

baby_web (攻防世界)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 进入网址 解题工具: 一个有F12的键盘 问题解析: 题目说想想初始页面是哪个 一般都是index.php 然后如题分析即可 科普时间叒到 HTTP状态码 &#xff08;英语&#xff1a;HTTP Status Code…

从零开始操作系统-08:计时器

这一节主要主要是计时器。 所需要的文件在Github&#xff1a;https://github.com/yongkangluo/Ubuntu20.04OS/tree/main/Files/Lec7-ExternalInterrupt 计时器&#xff1a; 可编程间隔计时器&#xff1a;PIT&#xff08;Programmalbe Interval Timer&#xff09;8254 使用A…

Windows下文本生成图像AI画图尝鲜体验

工具库 transformers 的开源方 Hugging Face 发布了一个专注于 diffuser 模型的开源库&#xff0c;我们可以基于它&#xff0c;仅仅通过几行代码就开始生成自己的艺术作画。不过这个 diffuser 库是一个基础实现版本&#xff0c;训练和学习的数据也没有 OpenAI 的 DALL-E2、谷歌…

学习docker记录(三)

使用volume 创建一个数据卷 docker volume create test-first-volume创建完之后&#xff0c;可以在 /var/lib/docker/volumes/ 目录下看见新建了一个 test-first-volume文件夹 在Dockerfile中 volume的指定的目录是&#xff1a; /www/wwwroot/pictureManager/deploy原本以为…

三步教你快速入手一个新产品的测试

初入一家公司&#xff0c;当一个全新的产品摆在你的面前&#xff0c;你会如何快速入手呢&#xff1f; 虽说实践是熟悉系统的第一要素&#xff0c;但我们需要静静思考一下。 我是谁&#xff1a;QA 我在哪&#xff1a;产品组 我要做什么&#xff1a;保质量 有多少来熟悉&…

LeetCode 320 周赛

总结 本场周赛太拉跨了&#xff01;T1做完后&#xff0c;T2一直被卡住&#xff0c;还好后面暂时跳过了T2去做T3&#xff0c;T3做完后又回过头来继续调试T2。在最后10分钟调过了&#xff08;虽然后来看运行时长达到了1400ms&#xff08;差点就过不了&#xff09;&#xff09;。 …

vue3 斗兽棋游戏

近来掘金举办前端比赛&#xff0c;所以写了一个小游戏参加&#xff0c;而且熟悉一下vue3,写了一下游戏&#xff0c;思来想去就写了一个斗兽棋游戏。 欢迎去给我加油 点赞评论收藏 &#xff0c;试玩地址 游戏地址 童年斗兽棋 - 码上掘金 https://code.juejin.cn/pen/716…

四川水泥杂志四川水泥杂志社四川水泥编辑部2022年第11期目录

水泥与混凝土 外加剂含固量对混凝土性能影响的分析 金世鑫; 1-4 《四川水泥》投稿&#xff1a;cnqikantg126.com 粉煤灰在干混砂浆中的应用研究 方光旭;古再努尔依明;杨博;陈南希;张琰琦; 5-7 浅析透光混凝土在建筑空间中的应用 李嘉;李嘉鑫; 8-10 研究与探讨…

c++ 智能指针 shared_ptr

C 智能指针 shared_ptr 详解与示例_码农小明的博客-CSDN博客_shared_ptr 一、简介 shared_ptr 是c11的智能类&#xff0c;可以在任何地方都不使用的时候自动删除和相关指针&#xff0c;从而彻底消除内存泄漏和指针悬空的问题。 她遵循共享所有权&#xff0c;即不同的shared_pt…

CVPR‘15 Joint action recognition and pose estimation from video

任务&#xff1a;action recognition and pose estimation 思路&#xff1a;对动作和姿态进行统一建模&#xff0c;将动作分成姿态&#xff0c;再将姿态分成part&#xff0c;学习三种level特征&#xff0c;通过动态规划有效的推断动作标签和姿态。 方法&#xff1a;统一建模…

通俗理解计算机操作系统的作用

“操作系统”&#xff0c;简称“OS”&#xff0c;是一个包含多个部分和多个目标的大型程序。 它的第一项工作是在你第一次打开计算机时启动并运行计算机。它的另一项工作是启动和结束应用程序&#xff0c;并给每个程序一个运行时间。它是那台计算机上所有其他程序的“老大”。当…

【App自动化测试】(一)Appium和移动端自动化

目录1. 目前mobile自动化解决方案1.1 iOS和Android 测试工具1.2 自动化工具的选择1.3 选择自动化工具的考虑因素2. Appium介绍2.1 Appium介绍2.2 多架构支持2.3 推荐Appium的理由2.4. Appium框架介绍2.4.1 Appium引擎列表2.4.2 Appium设计理念前言&#xff1a; 本文为在霍格沃兹…

多智能体强化学习MARL的概念和框架

1.多智能体强化学习 系统里的agents数量大于1&#xff0c;agents彼此之间不是独立的 每个agent的动作都能影响到下一个状态每个agent都能影响到其他agent 除非agent之间是独立的&#xff0c;否则单一agent的RL方法不适合MARL 2.MARL的类型 Fully cooperative&#xff08;完…

智慧医院智慧医疗解决方案

IBM于2009年提出“智慧医疗”这一理念。作为“智慧的地球”战略的重要组成部分&#xff0c;致力于构建一个“以病人为中心”的医疗服务体系。通过在服务成本、服务质量和服务可及性三方面取得一个良好的平衡&#xff0c;从而优化医疗实践成果、创新医疗服务模式和业务市场&…

Unity插件Obi.Rope详解

前言 Obi.Rope插件的使用方法 绳子的创建 创建后的Obi Rope&#xff0c;Inspector面板如下所示&#xff0c;组件比较多&#xff0c;其中Obi Solver是绳子&#xff0c;布料&#xff0c;液体等的总处理器&#xff0c;也可以单独分出来此组件为一个独立的游戏对象。 绳子的形状…

风控标签体系的使用与介绍

随着大数据技术的深入研究与应用&#xff0c;企业的专注点日益聚焦于怎样利用大数据来为精细化运营及精准营销服务&#xff0c;进而深入挖掘潜在的商业价值。于是&#xff0c;用户画像的概念也就应运而生。 在推荐系统中&#xff0c; 【推荐系统内容&#xff0c;详情可以关注番…

弘玑Cyclone2022产品发布会:全新上线智能文档处理交互平台——尚书台

近日&#xff0c;在弘玑Cyclone“智无边界&#xff0c;数字未来”发布会上&#xff0c;弘玑Cyclone2022年超级自动化系列产品全新亮相&#xff0c;首席产品官贾岿博士带领产品团队以创新技术对新时代语境下的数字生产力进行了全新解读。 上期为大家介绍了人人可用的数字化工作…