def prepare_data(self): """ 准备数据 :return: """ if self.debug: print('开始准备数据...') jq_login() # 准备数据 df_m = get_k_data_JQ(self.stk_code, start_date=self.start_date, end_date=self.end_date, freq=str(self.retest_span) + 'm') df_m['date'] = df_m.apply(lambda x: str(x['datetime'])[:10], axis=1) df_day = get_k_data_JQ( self.stk_code, start_date=self.start_date, end_date=self.end_date).sort_index(ascending=True) if len(df_day) < self.max_days: if self.debug: print('max_days:%d day_data_length:%d minute_data_length:%d' % (self.max_days, len(df_day), len(df_m))) return False # 向day data 中 增加必要index self.data_day = add_stk_index_to_df(df_day).reset_index().reset_index() # 增加必要index self.data_minute = add_stk_index_to_df( df_m).reset_index().reset_index() logout() return True
def check_single_stk_hour_idx_wx(stk_code, source='jq', debug=False): """ 打印常用指标 """ stk_df = get_k_data_JQ(stk_code, count=120, end_date=add_date_str(get_current_date_str(), 1), freq='30m') # 按升序排序 stk_df = stk_df.sort_values(by='datetime', ascending=True) """ 增加指标 'RSI5', 'RSI12', 'RSI30' 'SAR' 'slowk', 'slowd' 'upper', 'middle', 'lower' 'MOM' """ # 删除volume为空值的情况! stk_df = stk_df.loc[ stk_df.apply(lambda x: not (int(x['volume']) == 0), axis=1), :] # 计算index stk_df = add_stk_index_to_df(stk_df).tail(60) result_analysis = [] # 检查SAR sar_tail_origin = stk_df.tail(2) sar_tail = sar_tail_origin.copy() sar_tail['compare'] = sar_tail_origin.apply( lambda x: x['SAR'] - x['close'], axis=1) if sar_tail.head(1)['compare'].values[0] * sar_tail.tail( 1)['compare'].values[0] < 0: if sar_tail.tail(1)['SAR'].values[0] < sar_tail.tail( 1)['close'].values[0]: title_tmp = stk_code + ' ' + code2name( stk_code) + ' 注意 SAR 指标翻转,后续数小时可能上涨!' result_analysis.append(title_tmp) GenPic.set_background_color(bc='b_r') else: title_tmp = stk_code + ' ' + code2name( stk_code) + ' 注意 SAR 指标翻转,后续数小时可能下跌!' result_analysis.append(title_tmp) # 打印过程日志 if debug: txt_name = 'hour_index' # 打印原始数据 debug_print_txt(txt_name, stk_code, stk_df.to_string() + '\n\n') # 打印结果 debug_print_txt(txt_name, stk_code, '结果:\n' + str(result_analysis) + '\n\n') return result_analysis
def add_idx(self): self.data = add_stk_index_to_df(self.data) # 增加排名 self.data = cal_df_col_rank(self.data, 'MACD') # 增加乖离度排名 self.data = BIAS.add_bias_rank_public(self.data, span_q=3, span_s=9) self.data = BIAS.add_bias_rank_public(self.data, span_q=9, span_s=30)
def prepare_data(self, period='5m', count=48 * 100): """ 准备数据 :return: """ jq_login() # 准备数据 df_5m = get_k_data_JQ(self.stk_code, count=count, freq=period) df_5m['date'] = df_5m.apply(lambda x: str(x['datetime'])[:10], axis=1) df_day = get_k_data_JQ(self.stk_code, count=8 * 100, freq='30m').sort_index(ascending=True) # 想day data 中 增加必要index self.data_day = add_stk_index_to_df(df_day) # 增加必要index self.data_minute = add_stk_index_to_df(df_5m) logout()
def add_index(self): """ 向日线数据中增加常用指标 :return: """ self.data = add_stk_index_to_df(self.data) # 增加其他指标 idx = Index(self.data) idx.add_cci(5) idx.add_cci(20) self.data = idx.stk_df
def down_minute_data(stk_code, freq): try: df = get_k_data_JQ(stk_code, count=300, end_date=add_date_str(get_current_date_str(), 1), freq=freq) # 去掉volume为空的行 df = df.loc[df.apply(lambda x: not (x['volume'] == 0), axis=1), :] # 增加指标计算 df = add_stk_index_to_df(df) if str(df.index[-1]) > get_current_datetime_str(): df = df[:-1] return df except Exception as e_: # self.log = self.log + '函数down_minute_data:\n %s\n' % str(e_) print('函数down_minute_data:\n %s\n' % str(e_)) return pd.DataFrame()
# encoding=utf-8
def rpl_stk_hour_page(canvas_para, stk_code): """ 函数功能:在pdf中增加bk信息,篇幅为一整页,或者更多,以页为单位 :param stk_code: :param days: 用于指示近期的期限,比如近30天 :return: """ # 插入字符串,用以表明stk代码及名称 canvas_para.setFont("song", 10) if stk_code in ['sh', 'sz', 'cyb']: stk_name = stk_code else: stk_name = code2name(stk_code) # 打印stk代码和名字 canvas_para.drawString(20, letter[1] - 10, stk_code + ' ' + stk_name + ' ' + '小时数据') # 准备数据 df_stk = get_k_data_JQ(stk_code, start_date=add_date_str(get_current_date_str(), -200), freq='30m') df_stk['date'] = df_stk.reset_index().index df_stk = df_stk.reset_index(drop=True) close = extract_point_from_df_date_x(df_stk, 'date', 'close', timeAxis='year') data = [tuple(close)] data_name = ['close'] drawing_ave = gen_lp_drawing(data=data, data_note=data_name, height=letter[1] * 0.1, line_width=0.5, marker_size=2, time_axis='year') renderPDF.draw(drawing=drawing_ave, canvas=canvas_para, x=10, y=letter[1] * 0.85) # 按时间降序排序,方便计算MACD df_stk = df_stk.sort_values(by='date', ascending=True) # 加入各种指标 df_stk = add_stk_index_to_df(df_stk) # 去除空值,截取最新数据 df_stk = df_stk.dropna(axis=0, how='any').tail(40) close = extract_point_from_df_date_x(df_stk, 'date', 'close', timeAxis='year') sar = extract_point_from_df_date_x(df_stk, 'date', 'SAR', timeAxis='year') MACD = extract_point_from_df_date_x(df_stk, 'date', 'MACD', timeAxis='year') data = [tuple(close), tuple(sar)] data_name = ['close', 'sar'] drawing_ave = gen_lp_drawing(data=data, data_note=data_name, height=letter[1] * 0.1, line_width=1.5, marker_size=5, time_axis='year') renderPDF.draw(drawing=drawing_ave, canvas=canvas_para, x=10, y=letter[1] * 0.7) drawing_MACD = gen_bar_drawing(data=MACD, data_note=['MACD'], height=letter[1] * 0.1) renderPDF.draw(drawing=drawing_MACD, canvas=canvas_para, x=10, y=letter[1] * 0.5) # 整理kdj信息 slowk = extract_point_from_df_date_x(df_stk, 'date', 'slowk', timeAxis='year') slowd = extract_point_from_df_date_x(df_stk, 'date', 'slowd', timeAxis='year') data_kdj = [tuple(slowk), tuple(slowd)] data_kdj_note = ['k', 'd'] drawing_kdj = gen_lp_drawing(data=data_kdj, data_note=data_kdj_note, height=letter[1] * 0.1, time_axis='year') renderPDF.draw(drawing=drawing_kdj, canvas=canvas_para, x=10, y=letter[1] * 0.4) # 画图RSI信息 RSI5 = extract_point_from_df_date_x(df_stk, 'date', 'RSI5', timeAxis='year') RSI12 = extract_point_from_df_date_x(df_stk, 'date', 'RSI12', timeAxis='year') RSI30 = extract_point_from_df_date_x(df_stk, 'date', 'RSI30', timeAxis='year') data_RSI = [tuple(RSI5), tuple(RSI12), tuple(RSI30)] data_RSI_note = ['RSI5', 'RSI12', 'RSI30'] drawing_RSI = gen_lp_drawing(data=data_RSI, data_note=data_RSI_note, height=letter[1] * 0.1, time_axis='year') renderPDF.draw(drawing=drawing_RSI, canvas=canvas_para, x=10, y=letter[1] * 0.25) # 画图布林线 upper = extract_point_from_df_date_x(df_stk, 'date', 'upper', timeAxis='year') middle = extract_point_from_df_date_x(df_stk, 'date', 'middle', timeAxis='year') lower = extract_point_from_df_date_x(df_stk, 'date', 'lower', timeAxis='year') data_BOLL = [tuple(upper), tuple(middle), tuple(lower)] data_BOLL_note = ['上线', '中线', '下线'] drawing_BOLL = gen_lp_drawing(data=data_BOLL, data_note=data_BOLL_note, height=letter[1] * 0.1, time_axis='year') renderPDF.draw(drawing=drawing_BOLL, canvas=canvas_para, x=10, y=letter[1] * 0.1) canvas_para.showPage() return canvas_para
def gen_idx_pic(stk_df, stk_code=''): """ 打印常用指标 """ # 按升序排序 stk_df = stk_df.sort_values(by='date', ascending=True) """ 增加指标 'RSI5', 'RSI12', 'RSI30' 'SAR' 'slowk', 'slowd' 'upper', 'middle', 'lower' 'MOM' """ stk_df_ = add_stk_index_to_df(stk_df).tail(60) GenPic.set_background_color(bc='w') result_analysis = [] # 检查SAR attention = False sar_tail_origin = stk_df_.tail(2) sar_tail = sar_tail_origin.copy() sar_tail['compare'] = sar_tail_origin.apply( lambda x: x['SAR'] - x['close'], axis=1) title_tmp = stk_code + ' ' + code2name(stk_code) if sar_tail.head(1)['compare'].values[0] * sar_tail.tail( 1)['compare'].values[0] < 0: if sar_tail.tail(1)['SAR'].values[0] < sar_tail.tail( 1)['close'].values[0]: title_tmp = stk_code + ' ' + code2name( stk_code) + ' 注意 SAR 指标翻转,后续数天可能上涨!' result_analysis.append(title_tmp + RankNote.print_day_close_rank(stk_df)) GenPic.set_background_color(bc='b_r') else: title_tmp = stk_code + ' ' + code2name( stk_code) + ' 注意 SAR 指标翻转,后续数天可能下跌!' result_analysis.append(title_tmp + RankNote.print_day_close_rank(stk_df)) GenPic.set_background_color(bc='b_g') attention = True fig, ax = plt.subplots(nrows=5, ncols=1) ax[0].plot(range(0, len(stk_df_['date'])), stk_df_['RSI5'], 'b--', label='RSI5线', linewidth=1) ax[0].plot(range(0, len(stk_df_['date'])), stk_df_['RSI12'], 'r--', label='RSI12线', linewidth=1) ax[0].plot(range(0, len(stk_df_['date'])), stk_df_['RSI30'], 'g*--', label='RSI30', linewidth=0.5, markersize=1) ax[0].plot(range(0, len(stk_df_['date'])), [20 for a in range(len(stk_df_['date']))], 'b--', linewidth=0.3) ax[0].plot(range(0, len(stk_df_['date'])), [80 for a in range(len(stk_df_['date']))], 'b--', linewidth=0.3) ax[0].set_ylim(0, 100) ax[1].plot(range(0, len(stk_df_['date'])), stk_df_['SAR'], 'r--', label='SAR', linewidth=0.5, markersize=1) ax[1].plot(range(0, len(stk_df_['date'])), stk_df_['close'], 'g*--', label='close', linewidth=0.5, markersize=1) ax[2].plot(range(0, len(stk_df_['date'])), stk_df_['slowk'], 'g*--', label='slowk', linewidth=0.5, markersize=1) ax[2].plot(range(0, len(stk_df_['date'])), stk_df_['slowd'], 'r*--', label='slowd', linewidth=0.5, markersize=1) ax[2].plot(range(0, len(stk_df_['date'])), [20 for a in range(len(stk_df_['date']))], 'b--', linewidth=0.3) ax[2].plot(range(0, len(stk_df_['date'])), [80 for a in range(len(stk_df_['date']))], 'b--', linewidth=0.3) ax[2].set_ylim(0, 100) ax[3].plot(range(0, len(stk_df_['date'])), stk_df_['upper'], 'r*--', label='布林上线', linewidth=0.5, markersize=1) ax[3].plot(range(0, len(stk_df_['date'])), stk_df_['middle'], 'b*--', label='布林均线', linewidth=0.5, markersize=1) ax[3].plot(range(0, len(stk_df_['date'])), stk_df_['lower'], 'g*--', label='布林下线', linewidth=0.5, markersize=1) ax[4].plot(range(0, len(stk_df_['date'])), stk_df_['MOM'], 'g*--', label='MOM', linewidth=0.5, markersize=1) # 准备下标 xlabel_series = stk_df_.apply(lambda x: x['date'][2:].replace('-', ''), axis=1) ax[4] = add_axis(ax[4], xlabel_series, 40, rotation=45, fontsize=10) # 设置默认标题 title_tmp = stk_code + ' ' + code2name(stk_code) + '/上次更新时间:%s' % str( get_current_datetime_str()) ax[0].set_title(title_tmp) for ax_sig in ax: ax_sig.legend(loc='best', fontsize=5) fig.tight_layout() # 调整整体空白 plt.subplots_adjust(wspace=0, hspace=0) # 调整子图间距 ax[0].set_title(title_tmp) return fig, ax, attention, result_analysis
def add_reseau(self): """ 计算动态网格,并添加到数据当中 :return: """ if self.debug: print('开始增加网格信息...') t_s = time.time() # 想day data 中 增加必要index self.data_day = add_stk_index_to_df(self.data_day) # 增加必要index self.data_minute = add_stk_index_to_df(self.data_minute) # 增加rsv数据 self.data_day = RSV.add_rsv(self.data_day, self.rsv_span) # 最初的数天数据不进行回测,开始的部分数据因为数据量原因计算不出网格大小 max_days = self.max_days i_start = self.i_start i = len(self.data_minute) - i_start data_day = self.data_day.set_index(keys='date') # 大循环 for idx in self.data_minute[i_start:].index: # 获取当天数据 df_today = self.cal_today_ochl( self.data_minute.loc[idx - int(60 * 4 / self.retest_span):idx, :]) # 获取时间 date = self.data_minute.loc[idx, 'date'] # 获取该日期之前数天的数据 df_day_data = self.data_day[ self.data_day['date'] < date][1 - self.reseau_slow:] # 增加今天的数据 df_day_complete = df_day_data.append(df_today, ignore_index=True) # 计算rsv和波动情况 # rsv = RSV.cal_rsv_rank_sub(df_day_complete, self.rsv_span) try: rsv = data_day.loc[date, 'RSV'] except: print() reseau_object = Reseau() reseau = reseau_object.get_single_stk_reseau_sub( df_=df_day_complete, slow=self.reseau_slow, quick=self.reseau_quick) self.data_minute.loc[idx, 'rsv'] = rsv self.data_minute.loc[idx, 'reseau'] = reseau # 调节 buy 和 sale 的 threshold self.data_minute.loc[idx, 'thh_sale'] = reseau * 2 * rsv self.data_minute.loc[idx, 'thh_buy'] = reseau * 2 * (1 - rsv) if self.debug: i = i - 1 print('还剩%d行' % i) minute_reckon_print(t_s, '增加网格')
def add_day_index(self): """ 向日线数据中增加常用指标 :return: """ self.day_data = add_stk_index_to_df(self.day_data)