예제 #1
0
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')
예제 #2
0
    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'))
예제 #3
0
            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)
예제 #4
0
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')
예제 #5
0
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
예제 #6
0
    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
예제 #7
0
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()
예제 #8
0
    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 + '”失败!已存在!')
예제 #9
0
    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()
예제 #10
0
    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)
예제 #11
0
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))
예제 #12
0
    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)
예제 #13
0
# coding=utf-8
예제 #14
0
    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')
예제 #15
0
    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, '没听懂,请明示!')