def sendConcernedStkPicToSelf_T(): """ 将自己关心的数据打印出图,发送到qq :return: """ towho = '影子2' send_qq(towho, '以下是已入的stk的形势图:') stk_buy = readConfig()['buy_stk'] for x in stk_buy + ['sh', 'sz', 'cyb']: df = get_k_data_JQ(x, 400) fig, _, attention = genStkPicForQQ(df, x) if attention: send_pic_qq(towho, fig) send_W_M_MACD(x, towho) plt.close() # 打印第二张套图 fig, _, attention = genStkIdxPicForQQ(df, x) if attention: send_pic_qq(towho, fig) plt.close()
def sendConcernedStkPicToSelf_V2(): """ 将自己关心的数据打印出图,发送到qq 相较于之前版本,本次改进为: 1、使用json文件中的code列表代替数据库中的列表 2、进行判断,出发发送条件再予以发送 :return: """ towho = '影子2' send_qq(towho, '以下是已入的stk的形势图:') code_list = readConfig()['buy_stk'] for x in code_list + ['sh', 'sz', 'cyb']: df = get_k_data_JQ(x, 400) fig, _ = genStkPicForQQ(df) plt.title(str(x)) send_pic_qq(towho, fig) # plt.show() plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(x)) send_pic_qq(towho, fig) # plt.show() plt.close() send_W_M_MACD(x, towho)
def sendPLevel2QQ(df, towho): """ 将stk的价格水平发送到qq :df: code, level :return: """ r_df = df # 按level从低到高进行排序 r_df_sort = r_df.sort_values(by='level', ascending=True).head(12) fig, ax = plt.subplots(ncols=1, nrows=1) ax.bar(range(0, len(r_df_sort)), r_df_sort['level']) # ax.plot(range(0, len(r_df_sort)), [0.1 for x in r_df_sort['level']], 'r--') # ax.plot(range(0, len(r_df_sort)), [0.5 for x in r_df_sort['level']], 'r--') # 获取code2name字典 c2n = code2name_dict() ax.set_xticks(range(0, len(r_df_sort))) ax.set_xticklabels([c2n[x] for x in r_df_sort['code']], rotation=45) plt.ylim((0, 1)) plt.grid() plt.title('注意低位囤货!') send_pic_qq(towho, fig) plt.close()
def sendM305Pic(win_qq_name, stk_code): df = ts.get_k_data(stk_code, start=add_date_str(get_current_date_str(), -400)) # 测试相对均值偏移度 df['m5'] = df['close'].rolling(window=5).mean() df['m30'] = df['close'].rolling(window=30).mean() df['diff_m305'] = df.apply(lambda x: x['m5'] - x['m30'], axis=1) df['rank'] = df.apply(lambda x: relativeRank(df['diff_m305'], x['diff_m305']), axis=1) df = df.dropna(axis=0) df.plot('date', ['close', 'diff_m305', 'rank'], subplots=True) plt.title(stk_code+'M5-M30 分数') output = BytesIO() # BytesIO实现了在内存中读写byte buf_save = BytesIO() plt.savefig(output) output.seek(0) img = Image.open(output) # Image.open可以打开网络图片与本地图片。 img.convert("RGB").save(buf_save, "BMP") # 以RGB模式保存图像 data = buf_save.getvalue()[14:] buf_save.close() output.close() plt.close() send_pic_qq(win_qq_name, data)
def checkWeekStrayForAll(): win_qq_name = '影子' df_total = ts.get_stock_basics() for stk in df_total.index: if int(str(df_total.loc[stk, 'timeToMarket'])[:4]) >= int(get_current_date_str()[:4]) - 4: print('函数 checkWeekStrayForAll:'+stk+'年龄不够4岁!') continue try: stray_flag = week_macd_stray_judge(stk, win_qq_name) except: print('函数 checkWeekStrayForAll:' + stk + '判断翻转出错!') stray_flag = False if stray_flag: df = get_k_data_JQ(stk, count=400, end_date=get_current_date_str()) fig, _ = genStkPicForQQ(df) plt.title(str(stk)) send_pic_qq(win_qq_name, fig) plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(stk)) send_pic_qq(win_qq_name, fig) plt.close() else: print('No weed-stray in '+stk)
def checkWeekStrayForAll(): towho = '影子2' send_qq(towho, '以下是今晚海选结果:') df_total = ts.get_stock_basics() # 过滤掉年龄小于四岁的 df_age_filter = df_total[df_total.apply(lambda x: int( str(x['timeToMarket'])[:4]) <= int(get_current_date_str()[:4]) - 4, axis=1)] # 根据week反转情况进行过滤,保留有反转的单位 df_age_filter_stray = list(df_age_filter.reset_index().apply( lambda x: (x['code'], week_MACD_stray_judge(x['code'], towho)), axis=1)) # 过滤掉非反转的情况 df_age_f2 = list(filter(lambda x: x[1][0], df_age_filter_stray)) # 增加stk的水平信息 df_level = [(x[0], x[1][1], calStkPlevel(x[1][1]['close'].values)) for x in df_age_f2] # 按总体水平排序,筛选优异者 df_level.sort(key=lambda x: x[2]['total_last']) df_level = df_level[:math.floor(len(df_level) / 3 * 2)] # 按照近30的波动率进行排序,筛选优异者 df_level.sort(key=lambda x: x[2]['std'], reverse=True) df_level = df_level[:math.floor(len(df_level) / 3 * 2)] # 按照近30的水平排序,留下最后8只 df_level.sort(key=lambda x: x[2]['t30_last'], reverse=False) df_level = df_level[:np.min([math.floor(len(df_level) / 3 * 2), 15])] # 打印信息 stk_list = [k[0] for k in df_level] for stk in stk_list: # 打印周与月信息 send_W_M_MACD(stk_code=stk, towho=towho) # 打印日线信息 df = get_k_data_JQ(stk, count=400, end_date=get_current_date_str()) fig, _, _ = genStkPicForQQ(df) plt.title(str(stk)) send_pic_qq(towho, fig) plt.close() fig, _, _ = genStkIdxPicForQQ(df) plt.title(str(stk)) send_pic_qq(towho, fig) plt.close()
def printStkListPic2QQ(code_list, win_qq_name, title=None): if title is not None: title_str = title else: title_str = '' for x in code_list: df = get_k_data_JQ(x, 400) fig, _ = genStkPicForQQ(df) plt.title(str(x) + title_str) send_pic_qq(win_qq_name, fig) plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(x) + title_str) send_pic_qq(win_qq_name, fig) plt.close()
def sendMainIndexStkPic2Public(): """ 将自己关心的数据打印出图,发送到qq :return: """ for x in ['sh', 'sz', 'cyb']: df = get_k_data_JQ(x, 400) fig, _ = genStkPicForQQ(df) plt.title(str(x)) send_pic_qq('大盘上涨概率公示', fig) plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(x)) send_pic_qq('大盘上涨概率公示', fig) plt.close()
def sendConcernedStkPicToSelf_T(): """ 将自己关心的数据打印出图,发送到qq :return: """ for x in stk_list: df = get_k_data_JQ(x, 400) fig, _ = genStkPicForQQ(df) plt.title(str(x)) send_pic_qq('影子2', fig) plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(x)) send_pic_qq('影子2', fig) plt.close()
def sendMainIndexPicToPublic(): """ 不准,因为历史数据获取的不够 :return: """ for x in ['sh', 'sz', 'cyb']: # df = ts.get_k_data(x, start=add_date_str(get_current_date_str(), -400)) stk_code_normal = { 'sh': '000001.XSHG', 'sz': '399001.XSHE', 'cyb': '399006.XSHE' }[x] df = jqdatasdk.get_price(stk_code_normal, frequency='daily', count=100, end_date=get_current_date_str()) df['datetime'] = df.index df['date'] = df.apply(lambda x: str(x['datetime'])[:10], axis=1) # 计算MACD df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD( df.close, fastperiod=12, slowperiod=26, signalperiod=9) # 测试相对均值偏移度 df['m9'] = df['close'].rolling(window=9).mean() df['diff_m9'] = df.apply(lambda x: x['close'] - x['m9'], axis=1) df['rank'] = df.apply( lambda x: relativeRank(df['diff_m9'], x['diff_m9']), axis=1) df_plot = df.tail(50) # df.tail(50).plot('date', ['close', 'rank', 'MACD'], # subplots=True, # title=['历史收盘价', '历史分数', 'MACD指标'], # legend=True) fig, ax = subplots(ncols=1, nrows=3) ax[0].plot(range(0, len(df_plot)), df_plot['close'], 'g--', label='收盘价') ax[1].plot(range(0, len(df_plot)), df_plot['rank'], 'r--', label='上涨概率') ax[2].bar(range(0, len(df_plot)), df_plot['MACD']) for ax_sig in ax: ax_sig.set_xticks(range(0, len(df_plot))) ax_sig.set_xticklabels( [x[-5:] for x in list(df_plot['date'].values)], rotation=90) ax_sig.legend(loc='best') ax[0].set_title({'sh': "上证", 'sz': '深证', 'cyb': '创业板'}[x]) # ----------------------- 将图片发到qq ----------------------------------- send_pic_qq('大盘上涨概率公示', fig) plt.close()
def send_W_M_MACD(stk_code, towho): """ :param stk_code: :param towho: :return: """ # 获取今天的情况,涨幅没有超过3%的不考虑 # df_now = get_k_data_JQ(stk_code, count=2, end_date=get_current_date_str()).reset_index() # # if (df_now.tail(1)['close'].values[0]-df_now.head(1)['close'].values[0])/df_now.head(1)['close'].values[0] < 0.03: # print('函数week_MACD_stray_judge:' + stk_code + '涨幅不够!') # return False df = get_k_data_JQ(stk_code, count=400, end_date=get_current_date_str()).reset_index() if len(df) < 350: print('函数week_MACD_stray_judge:' + stk_code + '数据不足!') return False # 规整 df_floor = df.tail(math.floor(len(df) / 20) * 20 - 19) # 增加每周的星期几 df_floor['day'] = df_floor.apply( lambda x: calendar.weekday(int(x['date'].split('-')[ 0]), int(x['date'].split('-')[1]), int(x['date'].split('-')[2])), axis=1) # 增加每周的星期几 df_floor['day'] = df_floor.apply( lambda x: calendar.weekday(int(x['date'].split('-')[ 0]), int(x['date'].split('-')[1]), int(x['date'].split('-')[2])), axis=1) # 隔着5个取一个 if df_floor.tail(1)['day'].values[0] != 4: df_floor_slice_5 = pd.concat( [df_floor[df_floor.day == 4], df_floor.tail(1)], axis=0) else: df_floor_slice_5 = df_floor[df_floor.day == 4] # 获取最后的日期 date_last = df_floor_slice_5.tail(1)['date'].values[0] # 计算指标 df_floor_slice_5['MACD'], df_floor_slice_5['MACDsignal'], df_floor_slice_5[ 'MACDhist'] = talib.MACD(df_floor_slice_5.close, fastperiod=6, slowperiod=12, signalperiod=9) # 隔着20个取一个(月线) df_floor_slice_20 = df_floor.loc[::20, :] # 计算指标 df_floor_slice_20['MACD'], df_floor_slice_20[ 'MACDsignal'], df_floor_slice_20['MACDhist'] = talib.MACD( df_floor_slice_20.close, fastperiod=4, slowperiod=8, signalperiod=9) """ --------------------------------------- 生成图片 -------------------------------------""" fig, ax = plot_W_M(df_floor_slice_5, df_floor_slice_20) # 增加标题 plt.title(stk_code + 'month-stray' + date_last) # 发送图片 send_pic_qq(towho, fig) # 关闭图片 plt.close()
def week_MACD_stray_judge(stk_code, towho, debug_plot=False): try: # 获取今天的情况,涨幅没有超过3%的不考虑 df_now = get_k_data_JQ(stk_code, count=2, end_date=get_current_date_str()).reset_index() if (df_now.tail(1)['close'].values[0] - df_now.head(1) ['close'].values[0]) / df_now.head(1)['close'].values[0] < -0.05: print('函数week_MACD_stray_judge:' + stk_code + '涨幅不够!') return False, pd.DataFrame() df = get_k_data_JQ(stk_code, count=400, end_date=get_current_date_str()).reset_index() if len(df) < 350: print('函数week_MACD_stray_judge:' + stk_code + '数据不足!') return False, pd.DataFrame() # 规整 df_floor = df.tail(math.floor(len(df) / 20) * 20 - 19) # 增加每周的星期几 df_floor['day'] = df_floor.apply(lambda x: calendar.weekday( int(x['date'].split('-')[0]), int(x['date'].split('-')[1]), int(x['date'].split('-')[2])), axis=1) # 增加每周的星期几 df_floor['day'] = df_floor.apply(lambda x: calendar.weekday( int(x['date'].split('-')[0]), int(x['date'].split('-')[1]), int(x['date'].split('-')[2])), axis=1) # 隔着5个取一个 if df_floor.tail(1)['day'].values[0] != 4: df_floor_slice_5 = pd.concat( [df_floor[df_floor.day == 4], df_floor.tail(1)], axis=0) else: df_floor_slice_5 = df_floor[df_floor.day == 4] # 计算指标 df_floor_slice_5['MACD'], df_floor_slice_5[ 'MACDsignal'], df_floor_slice_5['MACDhist'] = talib.MACD( df_floor_slice_5.close, fastperiod=6, slowperiod=12, signalperiod=9) # 隔着20个取一个(月线) df_floor_slice_20 = df_floor.loc[::20, :] # 计算指标 df_floor_slice_20['MACD'], df_floor_slice_20[ 'MACDsignal'], df_floor_slice_20['MACDhist'] = talib.MACD( df_floor_slice_20.close, fastperiod=4, slowperiod=8, signalperiod=9) # 获取最后的日期 date_last = df_floor_slice_5.tail(1)['date'].values[0] # 判断背离 MACD_5 = df_floor_slice_5.tail(3)['MACD'].values MACD_20 = df_floor_slice_20.tail(4)['MACD'].values if (MACD_5[1] == np.min(MACD_5)) & (MACD_20[1] != np.max(MACD_20)) & ( MACD_20[2] != np.max(MACD_20)): if debug_plot: """ --------------------------------------- 生成图片 -------------------------------------""" fig, ax = plot_W_M(df_floor_slice_5, df_floor_slice_20) # 增加标题 plt.title(stk_code + 'month-stray' + date_last) # 发送图片 send_pic_qq(towho, fig) # 关闭图片 plt.close() return True, df else: return False, pd.DataFrame() except Exception as e: send_qq(towho, stk_code + '出错:\n' + str(e)) return False, pd.DataFrame()
# encoding=utf-8 """ 将原先使用email发送的图转为使用qq发送 """ from CornerDetectAndAutoEmail.Sub import genStkPicForQQ, genStkIdxPicForQQ from SDK import plot_agg from General.AutoStkConfig import stk_list import tushare as ts from pylab import * from SendMsgByQQ.SendPicByQQ import send_pic_qq for stk in stk_list[:3]: df = ts.get_k_data(stk) fig, _ = genStkPicForQQ(df) plt.title(str(stk)) send_pic_qq('影子2', fig) plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(stk)) send_pic_qq('影子2', fig) plt.close()
def checkSingleStkHourMACD(stk_code, source='jq'): if source == 'jq': df_30 = get_k_data_JQ(stk_code, start_date=add_date_str(get_current_date_str(), -20), freq='30m') df_60 = get_k_data_JQ(stk_code, start_date=add_date_str(get_current_date_str(), -20), freq='60m') elif source == 'ts': df_30 = my_pro_bar(stk_code, start=add_date_str(get_current_date_str(), -20), freq='30min') df_60 = my_pro_bar(stk_code, start=add_date_str(get_current_date_str(), -20), freq='60min') # 去掉volume为空的行 df_30 = df_30.loc[df_30.apply(lambda x: not (x['volume'] == 0), axis=1), :] df_60 = df_60.loc[df_60.apply(lambda x: not (x['volume'] == 0), axis=1), :] df_30['MACD'], _, _ = talib.MACD(df_30.close, fastperiod=12, slowperiod=26, signalperiod=9) df_60['MACD'], _, _ = talib.MACD(df_60.close, fastperiod=12, slowperiod=26, signalperiod=9) l_60 = df_60.tail(3)['MACD'].values l_30 = df_30.tail(3)['MACD'].values print('函数 checkSingleStkHourMACD:'+stk_code+':\n30min:'+str(l_30)+'\n60min:'+str(l_60)+'\n') if l_60[1] == np.min(l_60): title_str = '60分钟开始上涨' sts = 1 elif l_60[1] == np.max(l_60): title_str = '60分钟开始下跌' sts = 2 elif l_30[1] == np.max(l_30): title_str = '30分钟开始下跌' sts = 3 elif l_30[1] == np.min(l_30): title_str = '30分钟开始上涨' sts = 4 else: title_str = '当前无拐点' sts = 0 # 避免重复发图! if stk_code in MACD_min_last.keys(): if MACD_min_last[stk_code] != sts: send_pic = True MACD_min_last[stk_code] = sts else: send_pic = False else: send_pic = True MACD_min_last[stk_code] = sts print('函数 checkSingleStkHourMACD:' + stk_code + ':\nsend_pic标志位:' + str(send_pic) + '\nsts标志位:' + str(sts) + '\n') # 生成图片 df_30 = df_30.dropna() df_60 = df_60.dropna() fig, ax = subplots(ncols=1, nrows=4) ax[0].plot(range(0, len(df_30)), df_30['close'], 'g*--', label='close_30min') ax[1].bar(range(0, len(df_30)), df_30['MACD'], label='macd_30min') ax[2].plot(range(0, len(df_60)), df_60['close'], 'g*--', label='close_60min') ax[3].bar(range(0, len(df_60)), df_60['MACD'], label='macd_60min') for ax_sig in ax: ax_sig.legend(loc='best') plt.title(stk_code + '-' + title_str) if send_pic & (sts != 0): send_pic_qq('影子', fig) # send_pic_qq('影子', fig) plt.close()
# encoding=utf-8