Exemple #1
0
    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
Exemple #2
0
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
Exemple #3
0
 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)
Exemple #4
0
    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()
Exemple #5
0
    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
Exemple #6
0
    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()
Exemple #7
0
# encoding=utf-8
Exemple #8
0
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
Exemple #9
0
    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
Exemple #10
0
    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, '增加网格')
Exemple #11
0
 def add_day_index(self):
     """
     向日线数据中增加常用指标
     :return:
     """
     self.day_data = add_stk_index_to_df(self.day_data)