策略验证_指标买点分析技法_运用KDJ随机指标选择买点

news2024/11/23 19:32:02

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

目录

解说

策略代码

结果


解说

        KDJ随机指标,是威廉指标的一种延伸工具,最早起源于期货市场,由乔治·莱恩首创。它通过计算当日或最近几日最高价、最低价及收盘价等价格波动的幅度,来反映价格趋势的强弱,及超买超卖的状态。

        随机指标在图表上共有3根线,K线、D线和J线。随机指标在计算中考虑了计算周期内的最高随机指标价、最低价,兼顾了股价波动中的随机振幅,因而随机指标更能真实地反映股价的波动,其提示作用更加明显。随机指标KD线中,K为快速指标,D为慢速指标。当K线向上突破D线时,表示为上升趋势,可以买进;当K线向下突破D线时,可以卖出。又当KD值升到90以上时表示偏高,跌到20以下时表示偏低。太高就有下跌的可能,而太低就有上涨的机会。

        KDJ随机指标对买点的应用原则如下。

        1)K值在50以下的低水平,并且呈现上涨的趋势,并且K线由下向上和D线有交叉现象,此时为买点,后期股票会产生大的上涨行情。

        2)K线由下向上交叉D线失败转而向下探底后,K线再次向上交叉D线,两线所夹的空间叫做向上反转风洞。当出现向上反转风洞时股价将上涨。

        3)当K值小于20时,股价极容易短期内上涨,此时一般为较好的买点。

        4)在一般情况下,D值小于20时,股价很容易短期内回弹。如果D值继续减少到15时,股价会在极短时间内快速上涨,但这只是短期回弹上涨,这种瞬间回档或反弹不代表行情已经反转。

        5)J线信号一般不出现,一旦出现,可靠性最强。当J值小于0时,代表股价已经见底,是较好的买点。

策略代码

def excute_strategy(base_data,data_dir):
    '''
    指标买点分析技法 - 运用KDJ随机指标选择买点
    解析:
    1. K值在50以下的低水平,并且呈现上涨的趋势,并且K线由下向上和D线有交叉现象,此时为买点,后期股票会产生大的上涨行情
    2. K线由下向上交叉D点失败转而向下探底后,K线再次向上交叉D线,两线所夹的空间叫做向上反转风洞。当出现向上反转风洞时股价将上涨
    3. 当K值小于20时,股价极容易短期内上涨,此时一般为较好的买点。
    4. 在一般情况下,D值小于20时,股价很容易短期内回弹。如果D值继续减少到15时,股价会在极短时间内快速上涨,但这只是短期回弹上涨,这种瞬间回档或反弹不代表行情已经反转。
    5. J线信号一般不出现,一旦出现,可靠性最强。当J值小于0时,代表股价已经见底,是较好的买点
    通俗翻译:
    1. K线上穿D线,且K<50
    2. 比较麻烦,本策略不实现
    3. K线上穿20
    4. 本策略不实现
    5. J线上穿0
    自定义:
    1. 买入时点 =》 走势确定后下一交易日
    2. 胜 =》 买入后第三个交易日收盘价上升,为胜
    只计算最近两年的数据
    :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 = ['KDJ']
    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)

        # kdj_k kdj_d kdj_j
        df['target_yeah'] = 0
        df.loc[(df['kdj_k']<50) & (df['kdj_k'].shift(1)<df['kdj_d'].shift(1)) & (df['kdj_k']>=df['kdj_d']),'target_yeah'] = 1
        df.loc[(df['kdj_k'].shift(1)<20) & (df['kdj_k']>=20),'target_yeah'] = 1
        df.loc[(df['kdj_j'].shift(1)<0) & (df['kdj_j']>=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/28455.html

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

相关文章

tftp服务配置的详细过程,简单快速

主机端编译的Linux内核影像必须有至少一种方式下载到目标板上执行。通常是目标板的引导程序负责把主机端的影像文件下载到内存中。根据不同的连接方式&#xff0c;可以有多种文件传输方式&#xff0c;每一种方式都需要相应的传输软件和协议。 在linux开发中最常用的传输方式为网…

打破汽车零部件企业供应链壁垒,数商云SCM供应链系统实现一体化采购协同

随着疫情反复&#xff0c;包括芯片在内的关键零部件短缺&#xff0c;以及原材料成本和物流费用飙升&#xff0c;使得零部件企业利润大幅压缩甚至亏损。当前&#xff0c;在亚洲、欧洲、北美等地&#xff0c;国际零部件厂商正迎来一波“破产潮”&#xff0c;汽车零部件企业举步维…

数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)

目录 4.1.树 4.2.二叉树 4.2.1.概述 4.2.3.存储结构 4.2.3.遍历 1.逻辑简介 2.代码示例 4.1.树 树&#xff0c;由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件&#xff1a; 任何结点的子节点不相交。任何子结点只有一个父节点。N个结点&am…

carsim 2020 安装说明及多个版本冲突问题解决

在E盘新建一个文件夹&#xff0c;命名为Carsim 2020在Carsim 2020文件夹中&#xff0c;再新建两个文件夹&#xff0c;分别命名为carsim 2020.0_Data和carsim 2020.0_Prog以管理员的身份运行Setup_CarSim_2020.0_r125554.exe&#xff0c;并将安装目录分别选择第2步中的carsim 20…

【LeetCode每日一题:1742. 盒子中小球的最大数量~~~Map+遍历模式+计数】

题目描述 你在一家生产小球的玩具厂工作&#xff0c;有 n 个小球&#xff0c;编号从 lowLimit 开始&#xff0c;到 highLimit 结束&#xff08;包括 lowLimit 和 highLimit &#xff0c;即 n highLimit - lowLimit 1&#xff09;。另有无限数量的盒子&#xff0c;编号从 1 到…

如何设置网络访问 SQL Express?

网络访问 SQL Express 安全和连接SQL Server 配置Windows 防火墙配置连接服务器一旦在本地计算机上设置了 SQL Express,就可以允许网络成员进行远程连接。有不同的方法可以做到这一点,这些步骤可能不适用于现有的网络环境或身份验证方法。下面是在本地计算机上设置的 SQL Ser…

语音前处理技术在会议场景中的应用及挑战

编者按&#xff1a; 随着在线会议的普及&#xff0c;用户已经不再满足于能听到&#xff0c;而是要有更为极致的听感体验&#xff0c;如何能够在复杂多变的应用场景中依旧保证声音清晰流畅是对会议系统的极大挑战。LiveVideoStackCon2022上海站大会邀请到了全时 音视频研发部经理…

网页大作业代码自取【HTML+CSS制作美味糖果网站】

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【2015】408联考数据结构真题整理

2015 1 题目 答案&#xff1a;A 解析 2 题目 解析 3 题目 解析 4 题目 解析 5 题目 答案&#xff1a;D 解析 6 题目 解析 7 题目 答案&#xff1a;A 解析 8 题目 答案&#xff1a;C 解析 9 题目 解析 10 题目 解析 11 题目 解析 41 题目 答案&#xff1a; 3&a…

Android 深入理解View.post()获取宽高、Window加载View原理

文章目录背景&#xff1a;如何在onCreate()中获取View的宽高&#xff1f;View.post()原理Window加载View流程setContentView()ActivityThread#handleResumeActivity()总结扩展Window、Activity及View三者之间的关系是否可以在子线程中更新UI资料背景&#xff1a;如何在onCreate…

从React源码分析看useEffect

热身准备 这里不再讲useLayoutEffect&#xff0c;它和useEffect的代码是一样的&#xff0c;区别主要是&#xff1a; 执行时机不同&#xff1b;useEffect是异步&#xff0c; useLayoutEffect是同步&#xff0c;会阻塞渲染&#xff1b; 初始化 mount mountEffect 在所有hook…

day34 文件上传黑白盒审计逻辑中间件外部引用

前言 #知识点&#xff1a; 1、白盒审计三要素 2、黑盒审计四要素 3、白黑测试流程思路 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c;二次渲染等 3、检测后缀&#xff1a;黑名单&am…

强化学习 马尔科夫决策过程(价值迭代、策略迭代、雅克比迭代、蒙特卡洛)

文章目录一、马尔科夫过程Markov Decision Process&#xff08;MDP&#xff09;1.简介2、Markov 特性3、Markov 奖励过程符号表示MRPs的贝尔曼方程4、Markov决策过程符号表示转化MRPs的贝尔曼方程优化问题贝尔曼最优方程二、价值迭代求解1、回顾2、算法3、案例案例1案例2三、策…

Linux学习笔记13 - 进程间通信(IPC)(四)

消息队列 消息队列(message queue)即消息的列表,亦称报文队列&#xff0c;也叫做信箱。是Linux的一种通信机制&#xff0c;这种通信机制传递的数据具有某种结构&#xff0c;而不是简单的字节流[1]。消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#…

有限元仿真分析误差来源之边界条件设置-动载荷

作者&#xff1a;青梅煮酒 导读&#xff1a;前不久&#xff0c;笔者在仿真秀平台分享一篇关于有限元仿真分析误差来源之边界条件&#xff0c;约束和point mass&#xff0c;引发了工程师朋友们广泛关注和思考。通过与他们交流和讨论&#xff0c;我也有所所获。今天继续开展有限…

【强化学习论文合集】AAAI-2022 | 人工智能CCF-A类会议(附链接)

人工智能促进会(AAAI)成立于1979年&#xff0c;前身为美国人工智能协会(American Association for Artificial Intelligence)&#xff0c;是一个非营利性的科学协会&#xff0c;致力于促进对思想和智能行为及其在机器中的体现的潜在机制的科学理解。AAAI旨在促进人工智能的研究…

利用HbuilderX制作简单网页: HTML5期末大作业——html5漫画风格个人主页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

用JAVA详解冒泡排序

1.代码段实现&#xff1a;&#xff08;混的只需要把第一个拿走即可&#xff09; public static void main(String[]args){int []arr new int [] {99,68,97,86,65,94,33,72};System.out.println("排序前的数组为&#xff1a;");for (int i 0;i < arr.length;i){…

Java入门

文章目录数组一维数组多维数组Arrays工具类数组中常见异常String、StringBuilder、StringBufferString类String的特性String对象的创建String常用方法StringBuilder类StringBuffer类StringBuffer对象的创建StringBuffer类的常用方法String、StringBuffer、StringBuilder区别日期…

Go:日志滚动(rolling)记录器 lumberjack 简介

文章目录简介简单使用1. Logger 结构体2. backup日志文件的文件名3. 获取文件句柄4. 日志文件backup5. 日志滚动后处理6. 收集旧日志文件7. 后处理小结简介 lumberjack是一个日志滚动记录器。写入lumberjack的日志达到一定的条件后会进行存档&#xff08;普通文件的形式&#…