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


    写在前面:
    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时,代表股价已经见底,是较好的买点。

    策略代码

    1. def excute_strategy(base_data,data_dir):
    2. '''
    3. 指标买点分析技法 - 运用KDJ随机指标选择买点
    4. 解析:
    5. 1. K值在50以下的低水平,并且呈现上涨的趋势,并且K线由下向上和D线有交叉现象,此时为买点,后期股票会产生大的上涨行情
    6. 2. K线由下向上交叉D点失败转而向下探底后,K线再次向上交叉D线,两线所夹的空间叫做向上反转风洞。当出现向上反转风洞时股价将上涨
    7. 3. 当K值小于20时,股价极容易短期内上涨,此时一般为较好的买点。
    8. 4. 在一般情况下,D值小于20时,股价很容易短期内回弹。如果D值继续减少到15时,股价会在极短时间内快速上涨,但这只是短期回弹上涨,这种瞬间回档或反弹不代表行情已经反转。
    9. 5. J线信号一般不出现,一旦出现,可靠性最强。当J值小于0时,代表股价已经见底,是较好的买点
    10. 通俗翻译:
    11. 1. K线上穿D线,且K<50
    12. 2. 比较麻烦,本策略不实现
    13. 3. K线上穿20
    14. 4. 本策略不实现
    15. 5. J线上穿0
    16. 自定义:
    17. 1. 买入时点 =》 走势确定后下一交易日
    18. 2. 胜 =》 买入后第三个交易日收盘价上升,为胜
    19. 只计算最近两年的数据
    20. :param base_data:股票代码与股票简称 键值对
    21. :param data_dir:股票日数据文件所在目录
    22. :return:
    23. '''
    24. import pandas as pd
    25. import numpy as np
    26. import talib,os
    27. from datetime import datetime
    28. from dateutil.relativedelta import relativedelta
    29. from tools import stock_factor_caculate
    30. def res_pre_two_year_first_day():
    31. pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')
    32. return pre_year_day
    33. caculate_start_date_str = res_pre_two_year_first_day()
    34. dailydata_file_list = os.listdir(data_dir)
    35. total_count = 0
    36. total_win = 0
    37. check_count = 0
    38. list_list = []
    39. detail_map = {}
    40. factor_list = ['KDJ']
    41. ma_list = []
    42. for item in dailydata_file_list:
    43. item_arr = item.split('.')
    44. ticker = item_arr[0]
    45. secName = base_data[ticker]
    46. file_path = data_dir + item
    47. df = pd.read_csv(file_path,encoding='utf-8')
    48. # 删除停牌的数据
    49. df = df.loc[df['openPrice'] > 0].copy()
    50. df['o_date'] = df['tradeDate']
    51. df['o_date'] = pd.to_datetime(df['o_date'])
    52. df = df.loc[df['o_date'] >= caculate_start_date_str].copy()
    53. # 保存未复权收盘价数据
    54. df['close'] = df['closePrice']
    55. # 计算前复权数据
    56. df['openPrice'] = df['openPrice'] * df['accumAdjFactor']
    57. df['closePrice'] = df['closePrice'] * df['accumAdjFactor']
    58. df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']
    59. df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']
    60. if len(df)<=0:
    61. continue
    62. # 开始计算
    63. for item in factor_list:
    64. df = stock_factor_caculate.caculate_factor(df,item)
    65. for item in ma_list:
    66. df = stock_factor_caculate.caculate_factor(df,item)
    67. df.reset_index(inplace=True)
    68. df['i_row'] = [i for i in range(len(df))]
    69. df['three_chg'] = round(((df['close'].shift(-3) - df['close']) / df['close']) * 100, 4)
    70. df['three_after_close'] = df['close'].shift(-3)
    71. # kdj_k kdj_d kdj_j
    72. df['target_yeah'] = 0
    73. df.loc[(df['kdj_k']<50) & (df['kdj_k'].shift(1)'kdj_d'].shift(1)) & (df['kdj_k']>=df['kdj_d']),'target_yeah'] = 1
    74. df.loc[(df['kdj_k'].shift(1)<20) & (df['kdj_k']>=20),'target_yeah'] = 1
    75. df.loc[(df['kdj_j'].shift(1)<0) & (df['kdj_j']>=0),'target_yeah'] = 1
    76. i_row_list = df.loc[df['target_yeah']==1]['i_row'].values.tolist()
    77. node_count = 0
    78. node_win = 0
    79. duration_list = []
    80. table_list = []
    81. for i,row0 in enumerate(i_row_list):
    82. row = row0 + 1
    83. if row >= len(df):
    84. continue
    85. date_str = df.iloc[row]['tradeDate']
    86. cur_close = df.iloc[row]['close']
    87. three_after_close = df.iloc[row]['three_after_close']
    88. three_chg = df.iloc[row]['three_chg']
    89. table_list.append([
    90. i,date_str,cur_close,three_after_close,three_chg
    91. ])
    92. duration_list.append([row-2,row+3])
    93. node_count += 1
    94. if three_chg<0:
    95. node_win +=1
    96. pass
    97. list_list.append({
    98. 'ticker':ticker,
    99. 'secName':secName,
    100. 'count':node_count,
    101. 'win':0 if node_count<=0 else round((node_win/node_count)*100,2)
    102. })
    103. detail_map[ticker] = {
    104. 'table_list': table_list,
    105. 'duration_list': duration_list
    106. }
    107. total_count += node_count
    108. total_win += node_win
    109. check_count += 1
    110. pass
    111. df = pd.DataFrame(list_list)
    112. results_data = {
    113. 'check_count':check_count,
    114. 'total_count':total_count,
    115. 'total_win':0 if total_count<=0 else round((total_win/total_count)*100,2),
    116. 'start_date_str':caculate_start_date_str,
    117. 'df':df,
    118. 'detail_map':detail_map,
    119. 'factor_list':factor_list,
    120. 'ma_list':ma_list
    121. }
    122. return results_data

    结果

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

  • 相关阅读:
    Python编辑器和Pycharm的傻瓜式安装部署
    【毕业设计】基于单片机无线充电的4轴飞行器 -物联网 嵌入式 stm32
    Tinker源码解析
    RocketMQ(14)——发送带Key的消息
    [请回答C++] C++11&&类默认函数&&final&&override&&可变参数模板&&emplace
    【每周CV论文推荐】初学模型蒸馏值得阅读的文章
    AUTOSAR从入门到精通-汽车CAN网络信息安全研究
    将nginx注册为Windows系统服务
    Ubuntu系统操作指南——命令行挂载U盘
    一起Talk Android吧(第四百三十二回:Java8中的时间类)
  • 原文地址:https://blog.csdn.net/m0_37967652/article/details/127998332