靓号网站建设,做网站哪里最好,仪表东莞网站建设,wordpress用户登录地址搜索逻辑
代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力#xff1a; 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑#xff1a; 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数#xff1a; 小于6日均线#xff0c;用金叉或…搜索逻辑
代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数 小于6日均线用金叉或死叉后2个交易日的结果判断大于等于6日的n日均线用n/2个交易日判断 判断逻辑 使用判断点金叉 or 死叉后n/2个交易日的收盘价的一次回归线的斜率大于0为上行小于0为下行 补充 把判断点由近似点改成准确点即日线与均线发生交叉后1-压力概率 即为金叉概率1-压力概率 即为死叉概率
数据处理
数据来源 tushare 或 通信达我使用的是通信达导出的2015年至今的日线数据 数据处理 把每只股票的数据按照日期从小到大排列后取出收盘价即可 如果你有分钟数据也可以搜索分钟级别的均线压力和支撑
数据处理代码
def readData(self,r_path):1、r_path: 通信达导出的日线数据所在的目录2、生成函数,每次获取一支股票2015年至今的收盘数据files os.listdir(r_path)for f_path in files:f_path os.path.join(日线_data,f_path)df pd.read_csv(f_path,headerNone,index_colFalse,encodinggbk,names[trade_date,open,high,low,close,vol,amount]).dropna()df df.sort_values(trade_date).reset_index(dropTrue)yield df[close]查找代码
判断金叉和死叉的逻辑
判断金叉和死叉的代码逻辑一开始属实让我难理解看四五遍才清除下面给一个我觉得比较清楚的示例
# 计算均线
ma data.rolling(5).mean() # 计算5日均线
cmp data ma * 0.97 # 有时不触及均线也会有支撑和压力但不会有金叉和死叉所以要适当抬高或降低均线自己设置
计算金叉和死叉,金叉用于计算压力,死叉用于计算支撑金叉计算逻辑cmp: F F F T T T F F F(~cmp).shift(1): T T T F F F T T Tgolden_idx: F F F T F F F F F # 金叉结果反过来就是死叉golden_idx cmp (~cmp).shift(1) #金叉
cmp data ma * 1.03 # 计算死叉抬高均线
death_idx ~cmp cmp.shift(1) # 死叉整体搜索代码
def find_best_ma(self,r_path,days:tuple):assert days[0] days[1],计算均线日期错误,格式(起始,结束)assert days[0] 1,最小天数要大于1datas self.readData(r_path)# 保存结果result pd.DataFrame({MA:[*range(days[0],days[1]1)],支撑成功率:np.zeros(days[1]-days[0]1),支撑成功次数:np.zeros(days[1]-days[0]1),支撑总次数:np.zeros(days[1]-days[0]1),压力成功率:np.zeros(days[1]-days[0]1),压力成功次数:np.zeros(days[1]-days[0]1),压力总次数:np.zeros(days[1]-days[0]1)})result result.set_index(MA)for data in datas:data_len len(data) # 数据长度for day in range(days[0],days[1]1):# 计算均线ma data.rolling(day).mean()计算金叉和死叉,金叉用于计算压力,死叉用于计算支撑金叉计算逻辑cmp: F F F T T T F F F(~cmp).shift(1): T T T F F F T T Tgolden_idx: F F F T F F F F Fcmp data ma * 0.97 # 有时不触及均线也会有支撑和压力但不会有金叉和死叉所以要适当抬高或降低均线golden_idx cmp (~cmp).shift(1)cmp data ma * 1.03 # 计算死叉抬高均线death_idx ~cmp cmp.shift(1)# 转成索引golden_idx golden_idx[golden_idx].indexdeath_idx death_idx[death_idx].index# 把长度加进总数里result.loc[day,[压力总次数]] len(golden_idx)result.loc[day,[支撑总次数]] len(golden_idx)设置参考天数用于判断后续涨跌如果均线小于等于5天则用后2天判断如果均线大于5天则n天均线准确率用后n/2天的涨势判断pre_day 2 if day 5 else int(day/2)支撑成功判断死叉当天到后续pre_day天计算回归斜率大于0死叉成功判断死叉当天到后续pre_day天计算回归斜率大于0for idx in golden_idx:if idx data_len-1:result.loc[day,[压力总次数]] - 1continue # 位置太靠后没有结果参考跳过if data_len-idx pre_day:pre_day data_len-idx # 后续数据不足以参考天数改为用后面剩的几天判断y data[idx:idx pre_day 1]x range(1,len(y)1)k,b np.polyfit(x,y,deg1) # 线性回归预测if k 0:result.loc[day,[压力成功次数]] 1 # 小于0则说明均线有压力for idx in death_idx:if idx data_len-1:result.loc[day,[支撑总次数]] - 1continue # 位置太靠后没有结果参考跳过if data_len-idx pre_day:pre_day data_len-idx # 后续数据不足以参考天数改为用后面剩的几天判断y data[idx:idx pre_day 1]x range(1,len(y)1)k,b np.polyfit(x,y,deg1) # 线性回归预测if k 0:result.loc[day,[支撑成功次数]] 1 # 小于0则说明均线有压力result[压力成功率] round(result[压力成功次数]/result[压力总次数],4) # 更新一次结果result[支撑成功率] round(result[支撑成功次数]/result[支撑总次数],4) # 更新一次结果os.system(cls)max result.idxmax()max_support result[支撑成功率].max()max_presure result[压力成功率].max()print(tabulate(result.head(15), headerskeys, tablefmtpsql),flushTrue) print(当前最优值,flushTrue)print(支撑\t,MA {}\t.format(max[支撑成功率]),max_support,flushTrue)print(压力\t,MA {}\t.format(max[压力成功率]),max_presure,end,flushTrue) result.to_csv(最优均线.csv,encodingutf-8-sig)效果展示以5到30天均线搜索为例