写在前面:
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. 本策略检测的交叉均为死叉
def excute_strategy(base_data,data_dir):'''卖出口诀 - 三种图线交叉点,卖出股票需抢先解析:1. 两天内连续出现均线交叉、MACD交叉和VOL成交量交叉自定义:1. 交叉 =》短线下穿长线2. 卖出时点 =》 形态出现后下一交易日3. 胜 =》 卖出后第三个交易日收盘价下跌,为胜只计算最近两年的数据:param base_data:股票代码与股票简称 键值对:param data_dir:股票日数据文件所在目录:return:'''import pandas as pdimport numpy as npimport talib,osfrom datetime import datetimefrom dateutil.relativedelta import relativedeltafrom tools import stock_factor_caculatedef res_pre_two_year_first_day():pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')return pre_year_daycaculate_start_date_str = res_pre_two_year_first_day()dailydata_file_list = os.listdir(data_dir)total_count = 0total_win = 0check_count = 0list_list = []detail_map = {}factor_list = ['VOL','MACD']ma_list = ['ma5','ma10']for item in dailydata_file_list:item_arr = item.split('.')ticker = item_arr[0]secName = base_data[ticker]file_path = data_dir + itemdf = 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['ma_point'] = 0df.loc[(df['ma5'].shift(1)>=df['ma10'].shift(1)) & (df['ma5']=df['vol10'].shift(1)) & (df['vol5']=df['DEA'].shift(1)) & (df['DIFF']= len(df):continuedate_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-3,row+3])node_count += 1if three_chg<0:node_win +=1passlist_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_counttotal_win += node_wincheck_count += 1passdf = 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个股票