• 策略验证_卖出口诀_三种图线交叉点卖出股票需抢先


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

    目录

    解说

    策略代码

    结果


    解说

            所谓“三种图线交叉点,卖出股票需抢先”,是指均线交叉、MACD线交叉和VOL成交量交叉。在最近两天内连续出现这3种图形交叉,投资者需要尽早抛售手中的股票。

             出现“三种图线交叉点,卖出股票需抢先”的形态后,股票投资者需遵循以下操作原则。

            1)从上图可以看出,5日移动平均线交叉10日移动平均线,5日均量线(VOL:成交量指标)交叉10日均量线,DIF线交叉MACD线。该形态从三种不同角度客观地分析市场动向,为投资者判断行情恶化提供行之有效的脱身依据,属于大跌之前的最佳卖点。

            2)在这种股市形态的实战中,5日均线交叉10日均线,从趋势转化的角度分析上档承接无力,股价只有通过下跌方式寻找新的支撑;5日均量线交叉10日均量线,从上涨缺乏量能配合角度衬托下降的必然;而DIF线交叉MACD线,则从股价顶背离的角度显示弱势状态。

            3)当股价处于高位区域时,出现三种图线的同一天或间隔一两天的时间里交叉的走势,可断定趋势已经彻底转变,此时卖出股票虽然已错过相对高点,但可以躲过随之而来更为凶猛的下跌行情。

    策略代码

    1. 上文解说中MACD使用的是DIFF与MACD的交叉,本策略使用的是DIFF与DEA的交叉

    2. 本策略检测的交叉均为死叉

    1. def excute_strategy(base_data,data_dir):
    2. '''
    3. 卖出口诀 - 三种图线交叉点,卖出股票需抢先
    4. 解析:
    5. 1. 两天内连续出现均线交叉、MACD交叉和VOL成交量交叉
    6. 自定义:
    7. 1. 交叉 =》短线下穿长线
    8. 2. 卖出时点 =》 形态出现后下一交易日
    9. 3. 胜 =》 卖出后第三个交易日收盘价下跌,为胜
    10. 只计算最近两年的数据
    11. :param base_data:股票代码与股票简称 键值对
    12. :param data_dir:股票日数据文件所在目录
    13. :return:
    14. '''
    15. import pandas as pd
    16. import numpy as np
    17. import talib,os
    18. from datetime import datetime
    19. from dateutil.relativedelta import relativedelta
    20. from tools import stock_factor_caculate
    21. def res_pre_two_year_first_day():
    22. pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')
    23. return pre_year_day
    24. caculate_start_date_str = res_pre_two_year_first_day()
    25. dailydata_file_list = os.listdir(data_dir)
    26. total_count = 0
    27. total_win = 0
    28. check_count = 0
    29. list_list = []
    30. detail_map = {}
    31. factor_list = ['VOL','MACD']
    32. ma_list = ['ma5','ma10']
    33. for item in dailydata_file_list:
    34. item_arr = item.split('.')
    35. ticker = item_arr[0]
    36. secName = base_data[ticker]
    37. file_path = data_dir + item
    38. df = pd.read_csv(file_path,encoding='utf-8')
    39. # 删除停牌的数据
    40. df = df.loc[df['openPrice'] > 0].copy()
    41. df['o_date'] = df['tradeDate']
    42. df['o_date'] = pd.to_datetime(df['o_date'])
    43. df = df.loc[df['o_date'] >= caculate_start_date_str].copy()
    44. # 保存未复权收盘价数据
    45. df['close'] = df['closePrice']
    46. # 计算前复权数据
    47. df['openPrice'] = df['openPrice'] * df['accumAdjFactor']
    48. df['closePrice'] = df['closePrice'] * df['accumAdjFactor']
    49. df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']
    50. df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']
    51. if len(df)<=0:
    52. continue
    53. # 开始计算
    54. for item in factor_list:
    55. df = stock_factor_caculate.caculate_factor(df,item)
    56. for item in ma_list:
    57. df = stock_factor_caculate.caculate_factor(df,item)
    58. df.reset_index(inplace=True)
    59. df['i_row'] = [i for i in range(len(df))]
    60. df['ma_point'] = 0
    61. df.loc[(df['ma5'].shift(1)>=df['ma10'].shift(1)) & (df['ma5']'ma10']),'ma_point'] = 1
    62. df['vol_point'] = 0
    63. df.loc[(df['vol5'].shift(1)>=df['vol10'].shift(1)) & (df['vol5']'vol10']),'vol_point'] = 1
    64. df['macd_point'] = 0
    65. df.loc[(df['DIFF'].shift(1)>=df['DEA'].shift(1)) & (df['DIFF']'DEA']),'macd_point'] = 1
    66. df['target_yeah'] = df['macd_point'] + df['ma_point'] + df['vol_point'] + df['macd_point'].shift(-1) + df['ma_point'].shift(-1) + df['vol_point'].shift(-1)
    67. df['three_chg'] = round(((df['close'].shift(-3) - df['close'])/df['close'])*100,4)
    68. df['three_after_close'] = df['close'].shift(-3)
    69. df_target = df.loc[df['target_yeah']==3].copy()
    70. # 临时 start
    71. # df.to_csv('D:/temp006/'+ticker + '.csv',encoding='utf-8')
    72. # 临时 end
    73. node_count = 0
    74. node_win = 0
    75. duration_list = []
    76. table_list = []
    77. i_row_list = df_target['i_row'].values.tolist()
    78. for i,row0 in enumerate(i_row_list):
    79. row = row0 + 2
    80. if row >= len(df):
    81. continue
    82. date_str = df.iloc[row]['tradeDate']
    83. cur_close = df.iloc[row]['close']
    84. three_after_close = df.iloc[row]['three_after_close']
    85. three_chg = df.iloc[row]['three_chg']
    86. table_list.append([
    87. i,date_str,cur_close,three_after_close,three_chg
    88. ])
    89. duration_list.append([row-3,row+3])
    90. node_count += 1
    91. if three_chg<0:
    92. node_win +=1
    93. pass
    94. list_list.append({
    95. 'ticker':ticker,
    96. 'secName':secName,
    97. 'count':node_count,
    98. 'win':0 if node_count<=0 else round((node_win/node_count)*100,2)
    99. })
    100. detail_map[ticker] = {
    101. 'table_list': table_list,
    102. 'duration_list': duration_list
    103. }
    104. total_count += node_count
    105. total_win += node_win
    106. check_count += 1
    107. pass
    108. df = pd.DataFrame(list_list)
    109. results_data = {
    110. 'check_count':check_count,
    111. 'total_count':total_count,
    112. 'total_win':0 if total_count<=0 else round((total_win/total_count)*100,2),
    113. 'start_date_str':caculate_start_date_str,
    114. 'df':df,
    115. 'detail_map':detail_map,
    116. 'factor_list':factor_list,
    117. 'ma_list':ma_list
    118. }
    119. return results_data

    结果

     

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

  • 相关阅读:
    python实现电影院仿真(SimPy)
    【licode】基于webrtc的客户端
    如何在Go中格式化字符串
    双十一客服培训话术
    WZOI-227我家的门牌号
    mobaxterm 中 docker 快速搜索进入 命令
    pb:10个用一条语句写成的有关日期函数
    Typora-Drake主题
    本地存储(LocalStorage)、会话存储(Session)和 Cookie 三者之间的区别
    瑞吉外卖项目剩余功能补充
  • 原文地址:https://blog.csdn.net/m0_37967652/article/details/127934293