def cat_stk_opt_record(input_str, json_file_url, tc): if opt_record_lock.acquire(): r = '未知错误' try: r = cat_stk_b_opt_sub(stk_name=input_str.split(' ')[1], json_file_url=json_file_url) except Exception as e: r = '读写opt_record.json文件失败!原因:\n' + str(e) finally: opt_record_lock.release() text_append_color(tc, r + '\n')
def cat_stk(kind, tc): """ 查看相关stk列表 :param kind: :return: """ stk_list = read_config()[kind] stk_name = str([code2name(x) for x in stk_list]) text_append_color(tc, stk_name.replace('[', '').replace(']', '').replace(',', '\n'))
def sea_select_thread(tc): try: jq_login() sc = ExecuteSelectRole() sc.sea_select(tc) except Exception as e_: text_append_color(tc, '海选功能执行失败!原因:\n%s\n' % str(e_)) finally: text_append_color(tc, '\n请输入命令:\n', color=wx.YELLOW)
def add_opt(input_str, json_file_url, tc): if opt_record_lock.acquire(): r = ['未知错误'] try: r = add_opt_to_json_sub(input_str, json_file_url, tc) except Exception as e: r = ['读写opt_record.json文件失败!原因:\n' + str(e)] finally: opt_record_lock.release() for str_ in r: text_append_color(tc, str_ + '\n')
def sale_stk_sub(stk_record, s_amount, s_p, tc): """ :param stk_record: :return: """ opt_r_stk = stk_record # 本次盈利 earn_this = 0 if len(opt_r_stk['b_opt']) > 0: p_min = np.min([x['p'] for x in opt_r_stk['b_opt']]) opt_r_stk['b_opt'].sort(key=lambda x: x['p'] == p_min, reverse=False) # 循环清算 while True: if opt_r_stk['b_opt'][-1]['amount'] <= s_amount: # 注销 b_pop = opt_r_stk['b_opt'].pop(-1) # 清算 s_amount = s_amount - b_pop['amount'] # 计算盈利 earn_this = earn_this + b_pop['amount'] * (s_p - b_pop['p']) else: # 清算 opt_r_stk['b_opt'][-1]['amount'] = opt_r_stk['b_opt'][-1]['amount'] - s_amount # 计算盈利 earn_this = earn_this + s_amount * (s_p - opt_r_stk['b_opt'][-1]['p']) break # 判断是否有 if len(opt_r_stk['b_opt']) < 1: if s_amount > 0: text_append_color(tc, '异常: 可卖标的数量超过持有量!\n') break opt_r_stk['total_earn'] = opt_r_stk['total_earn'] + earn_this return opt_r_stk, earn_this
def data_prepare(self, k_kind, tc): """ 根据k线类型检查下载数据 :param k_kind: :return: """ t_s = time.time() text_append_color(tc, '\n开始准备 %s 数据!\n' % k_kind) k_kind = self.k_kind_format(k_kind) if (k_kind == 'd') | (k_kind == '日线'): # 增加日线数据 if not self.day_data_enable: _ = [x.down_day_data() for x in self.stk_list_ss] # 过滤掉空值 self.stk_list_ss = list( filter(lambda x: not x.day_data.empty, self.stk_list_ss)) self.day_data_enable = True text_append_color( tc, '\n%s 数据准备完成!总共耗时%s分钟\n' % (k_kind, minute_reckon(t_s))) return '数据准备完毕!' elif (k_kind == 'w') | (k_kind == 'm') | (k_kind == '周线') | (k_kind == '月线'): # 增加日线数据 if not self.day_data_enable: _ = [x.down_day_data() for x in self.stk_list_ss] # 过滤掉空值 self.stk_list_ss = list( filter(lambda x: not x.day_data.empty, self.stk_list_ss)) self.day_data_enable = True # 增加周/月线数据 if not self.week_month_data_enable: _ = [x.add_week_month_data() for x in self.stk_list_ss] self.week_month_data_enable = True elif (k_kind == 'h') | (k_kind == '半小时线'): # 增加半小时数据 if not self.half_hour_enable: _ = [x.down_hour_data() for x in self.stk_list_ss] self.half_hour_enable = True
def plot_opt(stk_code, opt_record, tc): if len(opt_record) == 0: text_append_color(tc, code2name(stk_code) + ':没有操作记录!') return df = pd.DataFrame(opt_record).set_index('date_time') # 筛选 df = df[df['stk_code'] == stk_code] if df.empty: text_append_color(tc, code2name(stk_code) + ':没有操作记录!') # 计算上下限 df['sale_pot'] = df.apply(lambda x: x['p_last'] + x['sale_reseau'], axis=1) df['buy_pot'] = df.apply(lambda x: x['p_last'] + x['buy_reseau'], axis=1) df.loc[:, ['p_last', 'p_now', 'buy_pot', 'sale_pot']].plot(style=['*', '*', '^--', '^--']) plt.show()
def add_stk(kind, name, tc): """ 增加持仓 :param name: :param tc: :return: """ # 判断输入的是代码是名称 if 'qh' in name: code = name[2:] elif name.isdigit(): code = name else: code = name2code(name) if code == '未知代码': text_append_color(tc, name + ':不识别的股票名字!请尝试使用股票代码!') return # 向配置文件中写入 增加持仓的stk代码 stk_now = read_config()[kind] if code not in stk_now: stk_now.append(code) write_config(kind, stk_now) text_append_color(tc, '增加“' + name + '”成功!') else: text_append_color(tc, '增加“' + name + '”失败!已存在!')
def __init__(self, parent, title): super(DengShen, self).__init__(parent, title=title, size=(700, 500)) # 绑定关闭函数 self.Bind(wx.EVT_CLOSE, self.on_close, parent) panel = wx.Panel(self) hbox3 = wx.BoxSizer(wx.HORIZONTAL) self.t3 = wx.TextCtrl(panel, size=(600, 1000), style=wx.TE_MULTILINE | wx.TE_RICH2) hbox3.Add(self.t3, 1, wx.EXPAND | wx.ALIGN_LEFT | wx.ALL, 5) self.t3.Bind(wx.EVT_TEXT_ENTER, self.on_enter_pressed) self.t3.SetBackgroundColour('Black') self.t3.SetForegroundColour('Red') panel.SetSizer(hbox3) # 打印欢迎语 text_append_color(self.t3, '输入帮助查看详细用法\n') text_append_color(self.t3, '\n请输入命令:\n', color=wx.YELLOW) self.Centre() self.Show() self.Fit()
def on_enter_pressed(self, event): # 获取最后一行 input_str = list(filter(lambda x: x != '', event.GetString().split('\n')))[-1] try: self.input_analysis(input_str) text_append_color(self.t3, '\n请输入命令:\n', color=wx.YELLOW) except Exception as e_: text_append_color(self.t3, '灯神出错了!原因:\n' + str(e_) + '\n\n') text_append_color(self.t3, '\n请输入命令:\n', color=wx.YELLOW)
def predict_tomorrow_index(tc, debug=False): try: with open(rootPath + '\Function\LSTM\AboutLSTM\stk_max_min.json', 'r') as f: max_min_info = json.load(f) stk2name = {'sh': '上证', 'sz': '深证', 'cyb': '创业板'} for stk in ['sh', 'sz', 'cyb']: today_df = ts.get_k_data(stk).tail(1) text_append_color( tc, stk2name.get(stk) + ' 今天数据:\n' + today_df.to_string().replace( 'volume', '成交量').replace('date', '日期').replace( 'open', '开盘价').replace('high', '最高点').replace( 'low', '最低点').replace('close', '收盘价') + '\n\n') close_today = today_df['close'].values[0] r = [(label, '%0.2f' % predict_tomorrow(stk, label, N_STEPS=N_STEPS, feature_cols=feature_cols, HIDDEN_SIZE=HIDDEN_SIZE, NUM_LAYERS=NUM_LAYERS), max_min_info[stk][label + '_acc']) for label in ['high', 'low', 'close']] # 增加与今天收盘价的对比 r_contrast = [ (x[0], x[1], '%0.2f' % ((float(x[1]) - close_today) / close_today * 100) + '%') for x in r ] text_append_color( tc, stk2name[stk] + '明日预测:\n' + str(r_contrast).replace('high', '最高点').replace( 'low', '最低点').replace('close', '收盘价') + '\n\n') except Exception as e: text_append_color(tc, '预测明日大盘操作失败!原因:\n' + str(e))
def delete_stk(kind, name, tc): """ 从持仓中删除 :param name: :param tc: :return: """ # 判断输入的是代码是名称 if name.isdigit(): code = name else: code = name2code(name) if code == '未知代码': text_append_color(tc, name + ':不识别的股票名字!请尝试使用股票代码!') return # 向配置文件中删除 增加持仓的stk代码 stk_now = read_config()[kind] if code in stk_now: stk_now.remove(code) write_config(kind, stk_now) text_append_color(tc, '删除“' + name + '”成功!') else: text_append_color(tc, '删除“' + name + '”失败!原先关注列表中没有 ' + name)
# coding=utf-8
def sea_select(self, tc): """ 执行主函数 :return: """ # 判断规则是否为空! if len(self.rule['filter_rule']) == 0: text_append_color(tc, '尚未设置过滤规则!无法进行海选!\n') return # 判断是否设置的报告存放路径 if self.rule['save_dir'] == '': text_append_color(tc, '尚未设置海选报告的存放路径,请在灯神中输入“规则-设置报告存放路径”来设置!') # 将规则转为dataframe rule_df = pd.DataFrame(self.rule['filter_rule']) # 根据优先级对规则进行执行 rule_priority_group = list(rule_df.groupby(by='priority')) # 对优先级进行排序 rule_list = sorted(rule_priority_group, key=lambda x: x[0], reverse=False) # 根据优先级执行筛选规则 for rule_group_priority in rule_list: # 提取该优先级的规则df df_rule = rule_group_priority[1] for idx in df_rule.index: text_append_color(tc, '\n开始执行过滤规则 <%s> ...\n' % df_rule.loc[idx, 'describe'] ) text_append_color(tc, self.rule_execute(df_rule.loc[idx, 'kind'], df_rule.loc[idx, 'data'], tc)) text_append_color(tc, '\n经过以上筛选后剩余的标的:\n' + self.get_filter_result()) # 打印结果 if len(self.stk_list_ss) == 0: text_append_color(tc, '没有满足所有海选规则的标的,不需要打印结果报告!') else: pdf_gen = SeaSelectPdf() # 生成图片 text_append_color(tc, '\n开始打印pdf所需要的图片...\n') pdf_gen.gen_sea_select_pic(self.stk_list_ss) # 生成pdf text_append_color(tc, '\n开始生成最终的pdf报告...\n') pdf_gen.gen_pdf(self.stk_list_ss, self.rule['save_dir'] + '/') text_append_color(tc, '\n海选结果pdf已经打印,请在:\n' + str(self.rule['save_dir']) + '\n文件夹下查看!\n')
def input_analysis(self, input_str): text_append_color(self.t3, '\n\n') if '增加持仓' in input_str: ipt_split = input_str.split(' ') # 向配置文件中写入 增加持仓的stk代码 StkConfig.add_stk(kind='buy_stk', name=ipt_split[1], tc=self.t3) elif '删除持仓' in input_str: ipt_split = input_str.split(' ') # 向配置文件中写入 增加持仓的stk代码 StkConfig.delete_stk(kind='buy_stk', name=ipt_split[1], tc=self.t3) elif '增加关注' in input_str: ipt_split = input_str.split(' ') # 向配置文件中写入 增加持仓的stk代码 StkConfig.add_stk(kind='concerned_stk', name=ipt_split[1], tc=self.t3) elif '查看记录' in input_str: ipt_split = input_str.split(' ') # 画图该stk的操作记录 plot_opt(stk_code=name2code(ipt_split[1]), tc=self.t3, opt_record=opt_record) elif '删除关注' in input_str: ipt_split = input_str.split(' ') StkConfig.delete_stk(kind='concerned_stk', name=ipt_split[1], tc=self.t3) elif '查看关注' in input_str: StkConfig.cat_stk(kind='concerned_stk', tc=self.t3) elif '查看持仓' in input_str: StkConfig.cat_stk(kind='buy_stk', tc=self.t3) elif '预测明日大盘' in input_str: # 启动数据处理线程,专用于处理数据,防止软件操作卡顿 index_predict_thread = threading.Thread(target=predict_tomorrow_index, args=(self.t3, False)) index_predict_thread.start() elif '清理' == input_str: self.t3.SetValue('') elif '帮助' == input_str: text_append_color(self.t3, total_cmd) elif ('买入' in input_str) | ('卖出' in input_str): add_opt(input_str, opt_record_file_url, self.t3) elif ('真买' in input_str) | ('真卖' in input_str): add_real_trade(input_str, opt_record_file_url, self.t3) elif '查看b记录' in input_str: cat_stk_opt_record( input_str=input_str, json_file_url=opt_record_file_url, tc=self.t3) elif '规则' in input_str: sc = SelectCmd() text_append_color(self.t3, sc.rule_input_pro(input_str)) elif '执行海选' == input_str: def sea_select_thread(tc): try: jq_login() sc = ExecuteSelectRole() sc.sea_select(tc) except Exception as e_: text_append_color(tc, '海选功能执行失败!原因:\n%s\n' % str(e_)) finally: text_append_color(tc, '\n请输入命令:\n', color=wx.YELLOW) # 启动数据处理线程,专用于处理数据,防止软件操作卡顿 sea_select_thread = threading.Thread(target=sea_select_thread, args=(self.t3,)) sea_select_thread.start() else: text_append_color(self.t3, '没听懂,请明示!')