Esempio n. 1
0
def ana_fun(data_df, fut_name, col_name):
    raw_return_df = data_df['price_return']
    # raw_return_df = data_df['pnl']
    signal_df = data_df[col_name]
    SignalAnalysis.CDF(signal_df,
                       raw_return_df,
                       hold_time=1,
                       title=f'{fut_name} {col_name} CDF Figure',
                       lag=1)
Esempio n. 2
0
def main():
    fut_name = 'RB'
    data_df = test_fun(fut_name, 400, 1)
    # part_data_df = data_df[(data_df['Time'] > '14:51') & (data_df['Time'] <= '21:10')]
    col_name = 'Time'
    raw_return_df = data_df['pnl']
    signal_df = data_df[col_name].shift(2).replace(np.nan, '00:00')
    SignalAnalysis.CDF_c(signal_df,
                         raw_return_df,
                         hold_time=1,
                         title=f'{fut_name} {col_name} CDF Figure',
                         lag=0)

    ana_fun(data_df, fut_name, 'Volume_zscore')
    ana_fun(data_df, fut_name, 'past_min_pct_change')
    ana_fun(data_df, fut_name, 'trend_signal')

    return data_df
Esempio n. 3
0
def single_main():
    fut_name, window, limit, cut_num = 'J', 40, 1, 20
    data_df = test_fun(fut_name, window, limit, cut_num)
    part_data_df = data_df
    col_name = 'Time'
    raw_return_df = part_data_df['pnl']
    signal_df = part_data_df[col_name].shift(2).replace(np.nan, '00:00')
    SignalAnalysis.CDF_c(signal_df,
                         raw_return_df,
                         hold_time=1,
                         title=f'{fut_name} {col_name} CDF Figure',
                         lag=0)

    # ana_fun(data_df, fut_name, 'OpenInterest_core')
    # ana_fun(data_df, fut_name, 'Volume_zscore')
    # ana_fun(data_df, fut_name, 'Volume_boll')
    # ana_fun(data_df, fut_name, 'past_min_pct_change')
    # ana_fun(data_df, fut_name, 'trend_indicator')
    ana_fun(data_df, fut_name, 'boll_score')
    ana_fun(data_df, fut_name, 'CCI_score')
    ana_fun(data_df, fut_name, 'OpenInterest_core')

    ana_fun(data_df, fut_name, 'Volume_zscore')

    ana_fun(data_df, fut_name, 'past_min_pct_change')
    ana_fun(data_df, fut_name, 'trend_indicator')

    ana_fun(data_df, fut_name, 'macd')
    ana_fun(data_df, fut_name, 'RSI')
    ana_fun(data_df, fut_name, 'obv')
    ana_fun(data_df, fut_name, 'atr')
    ana_fun(data_df, fut_name, 'adx')

    ana_fun(data_df, fut_name, 'trix')
    ana_fun(data_df, fut_name, 'willr')

    ana_fun(data_df, fut_name, 'Vol_OI')
    return data_df
Esempio n. 4
0
    def generation(self, fut_name, window, limit, concat=True, test=False):
        result_list = []
        pool = Pool(20)
        for con_id, part_info_df in self.active_df[[
                f'{fut_name}01'
        ]].groupby(f'{fut_name}01'):
            # active_begin = self.next_trade_date(part_info_df.index[0]) + timedelta(hours=17)
            # active_end = part_info_df.index[-1] + timedelta(hours=17)
            args = [fut_name, con_id, window, limit]
            result_list.append(
                pool.apply_async(self.part_generation, args=args))
            # self.part_generation(*args)
        pool.close()
        pool.join()
        print(123)
        pnl_df = pd.concat([res.get()[0] for res in result_list], axis=0)
        turnover_df = pd.concat([res.get()[1] for res in result_list], axis=0)
        data_df = pd.concat([res.get()[2] for res in result_list], axis=0)

        pot = pnl_df.sum() / turnover_df.sum() * 10000
        sp = bt.AZ_Sharpe_y(pnl_df)
        print(fut_name, sp, pot, window, limit, cut_num)

        Close_p = pd.read_csv(f'/mnt/mfs/DAT_FUT/day/{fut_name}/Close',
                              sep='|',
                              index_col=0,
                              parse_dates=True)
        Open_p = pd.read_csv(f'/mnt/mfs/DAT_FUT/day/{fut_name}/Open',
                             sep='|',
                             index_col=0,
                             parse_dates=True)
        jump_diff = Open_p / Close_p.shift(1) - 1
        self.jump_diff = jump_diff.reindex(self.active_df.index)
        act_info_sr = self.active_df[f'{fut_name}01']
        fut_jump = self.jump_diff.apply(lambda x, y: x * (y == x.name),
                                        args=(act_info_sr, )).sum(1)

        if (abs(sp) > 1.2 and pot > 4) or test:
            # if (sp < -1.2) or test:
            plt.figure(figsize=[16, 8])
            pnl_df.index = pd.to_datetime(pnl_df.index)
            plt.plot(pnl_df.cumsum())
            plt.grid()
            savfig_send(
                f'{fut_name} sp:{sp} pot={pot} CCI_window:{window}, CCI_limit:{limit} cut_num={self.cut_num}'
            )

            part_data_df = data_df
            col_name = 'Time'
            raw_return_df = part_data_df['pnl']
            signal_df = part_data_df[col_name].shift(2).replace(
                np.nan, '00:00')
            SignalAnalysis.CDF_c(signal_df,
                                 raw_return_df,
                                 hold_time=1,
                                 title=f'{fut_name} {col_name} CDF Figure',
                                 lag=0)

            ana_fun(data_df, fut_name, 'test_score')
            ana_fun(data_df, fut_name, 'boll_score')
            ana_fun(data_df, fut_name, 'CCI_score')

            ana_fun(data_df, fut_name, 'trend_indicator')

            ana_fun(data_df, fut_name, 'macd')
            ana_fun(data_df, fut_name, 'RSI')
            ana_fun(data_df, fut_name, 'obv')
            ana_fun(data_df, fut_name, 'atr')
            ana_fun(data_df, fut_name, 'adx')

            ana_fun(data_df, fut_name, 'trix')
            ana_fun(data_df, fut_name, 'willr')
            ana_fun(data_df, fut_name, 'past_min_pct_change')

            ana_fun(data_df, fut_name, 'Vol_OI')
            ana_fun(data_df, fut_name, 'OI_boll')
            ana_fun(data_df, fut_name, 'adosc')
            ana_fun(data_df, fut_name, 'cmo')
            ana_fun(data_df, fut_name, 'mfi')

            # raw_return_df = data_df.groupby(by=['Date'])['pnl'].apply(lambda x: x.iloc[1:].sum())
            # signal_df = fut_jump
            # SignalAnalysis.CDF(signal_df, raw_return_df, hold_time=1, title=f'{fut_name} jump CDF Figure', lag=1)

            self.pos_to_bkt(data_df, concat)
        return data_df, sp, pot
Esempio n. 5
0
    def generation(self, fut_name, window, limit, concat=True):
        result_list = []
        pool = Pool(20)
        for con_id, part_info_df in self.active_df[[
                f'{fut_name}01'
        ]].groupby(f'{fut_name}01'):
            # active_begin = self.last_trade_date(part_info_df.index[0]) + timedelta(hours=17)
            # active_end = part_info_df.index[-1] + timedelta(hours=17)
            args = [fut_name, con_id, window, limit]
            result_list.append(
                pool.apply_async(self.part_generation, args=args))
            # self.part_generation(*args)
        pool.close()
        pool.join()

        pnl_df = pd.concat([res.get()[0] for res in result_list], axis=0)
        turnover_df = pd.concat([res.get()[1] for res in result_list], axis=0)
        data_df = pd.concat([res.get()[2] for res in result_list], axis=0)

        pot = pnl_df.sum() / turnover_df.sum() * 10000
        sp = bt.AZ_Sharpe_y(pnl_df)
        print(fut_name, sp, pot, window, limit, cut_num)
        if abs(sp) > 1.2 and abs(pot) > 6:
            plt.figure(figsize=[16, 8])
            pnl_df.index = pd.to_datetime(pnl_df.index)
            plt.plot(pnl_df.cumsum())
            plt.grid()
            savfig_send(
                f'{fut_name} sp:{sp} pot={pot} CCI_window:{window}, CCI_limit:{limit} cut_num={self.cut_num}'
            )

            part_data_df = data_df
            col_name = 'Time'
            raw_return_df = part_data_df['pnl']
            signal_df = part_data_df[col_name].shift(2).replace(
                np.nan, '00:00')
            SignalAnalysis.CDF_c(signal_df,
                                 raw_return_df,
                                 hold_time=1,
                                 title=f'{fut_name} {col_name} CDF Figure',
                                 lag=0)

            ana_fun(data_df, fut_name, 'test_score')
            ana_fun(data_df, fut_name, 'boll_score')
            ana_fun(data_df, fut_name, 'CCI_score')

            ana_fun(data_df, fut_name, 'trend_indicator')

            ana_fun(data_df, fut_name, 'macd')
            ana_fun(data_df, fut_name, 'RSI')
            ana_fun(data_df, fut_name, 'obv')
            ana_fun(data_df, fut_name, 'atr')
            ana_fun(data_df, fut_name, 'adx')

            ana_fun(data_df, fut_name, 'trix')
            ana_fun(data_df, fut_name, 'willr')

            ana_fun(data_df, fut_name, 'Vol_OI')

        self.pos_to_bkt(data_df, concat)
        return data_df, sp, pot
Esempio n. 6
0
def send_cdf_fun(window, bar_num):
    for fut_name in list(fut_name_dict.keys()):
        print(fut_name)
        # print(fut_data.act_info_df[fut_name.upper() + '01'])

        if fut_name.upper() + '01' not in fut_data.act_info_df.columns:
            continue

        active_df = fut_data.act_info_df[fut_name.upper() + '01'] \
            .truncate(datetime(2019, 6, 1), datetime(2019, 6, 30))
        sub_dict = fut_name_dict[fut_name]
        signal_list = []
        return_list = []
        for target_date, target_id in list(active_df.dropna().items()):
            con_intra_data = fut_data.load_intra_data(target_id,
                                                      usecols_list=['Close'])
            con_time_range = con_intra_data.index
            # target_date = datetime(2019, 6, 27)
            target_id_low = target_id.split('.')[0].lower()
            # print(target_id)
            # print(sub_dict)
            # print(sub_dict[target_id_low])
            daily_path = f"{root_path}/{target_id_low}_{target_date.strftime('%Y%m%d')}.csv"
            data = pd.read_csv(daily_path, encoding='gbk')
            data['way'] = data['方向'].apply(lambda x: 1 if x == 'B' else
                                           (-1 if x == 'S' else 0))
            data.index = pd.to_datetime(data['时间'])

            today_begin = pd.to_datetime(
                f"{data.index[0].strftime('%Y%m%d')} 21:00")
            today_end = pd.to_datetime(
                f"{data.index[-1].strftime('%Y%m%d')} 16:00")
            today_min_range = con_time_range[(con_time_range > today_begin)
                                             & (con_time_range < today_end)]
            # print(target_id_low, target_date)

            # tick_data = data[['时间', '最新', '成交量', '持仓', '增仓', '买一价', '买一量', '卖一价', '卖一量', '方向']]
            # tick_data.index = pd.to_datetime(tick_data['时间'])

            # print(big_vol)

            # for i in range(int(len(today_min_range) / bar_num)):
            #     # print(today_min_range[bar_num * i:bar_num * (i + 1)])
            #     tmp_begin = today_min_range[bar_num * i] - timedelta(minutes=1)
            #     tmp_end = today_min_range[bar_num * (i + 1) - 1]
            #     bs_rt = get_big_vol_and_rt(data, tmp_begin, tmp_end)
            #     print(tmp_begin, tmp_end, bs_rt)

            # bs_rt_list_1 = [get_big_vol_and_rt(data, today_min_range[bar_num * i] - timedelta(minutes=1),
            #                                    today_min_range[bar_num * (i + 1) - 1])
            #                 for i in range(int(len(today_min_range) / bar_num))]

            bs_rt_list = [
                get_big_vol_and_rt(
                    data, i_time + timedelta(minutes=-(window - bar_num) - 1),
                    i_time + timedelta(minutes=bar_num - 1))
                for i_time in today_min_range[::bar_num]
            ]
            # bs_rt_list = np.array(bs_rt_list)
            trade_time_list = today_min_range[::bar_num]
            # return_df = con_intra_data['']
            price_diff = con_intra_data['Close'].shift(-bar_num).loc[trade_time_list] - \
                         con_intra_data['Close'].loc[trade_time_list]
            price_diff_list = list(price_diff.values)
            signal_list += bs_rt_list[:-1]
            return_list += price_diff_list[1:]

            SignalAnalysis.CDF(
                pd.Series(signal_list),
                pd.Series(return_list),
                hold_time=1,
                title=f'{fut_name} {window} {bar_num}{target_date} CDF Figure',
                lag=1)
Esempio n. 7
0
def test_fun(fut_name, CCI_window, CCI_limit, hold_time, cut_num):
    result_list = []
    pool = Pool(20)
    for con_id, part_info_df in active_df[[f'{fut_name}01'
                                           ]].groupby(f'{fut_name}01'):
        active_begin = fut_data.last_trade_date(
            part_info_df.index[0]) + timedelta(hours=17)
        active_end = part_info_df.index[-1] + timedelta(hours=17)
        args = [
            con_id, active_begin, active_end, CCI_window, CCI_limit, hold_time,
            cut_num
        ]
        # part_test(*args)
        # print(part_info_df.index[0], part_info_df.index[-1])
        result_list.append(pool.apply_async(part_test, args=args))
    pool.close()
    pool.join()

    pnl_df = pd.concat([res.get()[0] for res in result_list], axis=0)
    turnover_df = pd.concat([res.get()[1] for res in result_list], axis=0)
    data_df = pd.concat([res.get()[2] for res in result_list], axis=0)

    pot = pnl_df.sum() / turnover_df.sum() * 10000
    sp = bt.AZ_Sharpe_y(pnl_df)

    # for x, part_data_df in data_df.groupby(['weekday']):
    #     part_pnl = part_data_df['pnl'].fillna(0).values
    #     print(x, part_pnl.sum())
    #     plt.plot(part_pnl.cumsum())
    #     savfig_send(subject=f'{x}  {bt.AZ_Sharpe_y(part_pnl)}')
    #
    # for x, part_data_df in data_df.groupby(['month']):
    #     part_pnl = part_data_df['pnl'].fillna(0).values
    #     print(x, part_pnl.sum())
    #     plt.plot(part_pnl.cumsum())
    #     savfig_send(subject=f'{x}  {bt.AZ_Sharpe_y(part_pnl)}')
    print(fut_name, sp, pot, CCI_window, CCI_limit, hold_time, cut_num)
    if abs(sp) > 1. and abs(pot) > 10:
        plt.figure(figsize=[16, 8])
        pnl_df.index = pd.to_datetime(pnl_df.index)
        plt.plot(pnl_df.cumsum())
        plt.grid()
        savfig_send(
            f'{fut_name} sp:{sp} pot={pot} CCI_window:{CCI_window}, CCI_limit:{CCI_limit}, cut_num={cut_num}'
        )

        part_data_df = data_df
        col_name = 'Time'
        raw_return_df = part_data_df['pnl']
        signal_df = part_data_df[col_name].shift(2).replace(np.nan, '00:00')
        SignalAnalysis.CDF_c(signal_df,
                             raw_return_df,
                             hold_time=1,
                             title=f'{fut_name} {col_name} CDF Figure',
                             lag=0)

        ana_fun(data_df, fut_name, 'test_score')
        ana_fun(data_df, fut_name, 'boll_score')
        ana_fun(data_df, fut_name, 'CCI_score')
        ana_fun(data_df, fut_name, 'OpenInterest_core')

        ana_fun(data_df, fut_name, 'Volume_zscore')

        ana_fun(data_df, fut_name, 'past_min_pct_change')
        ana_fun(data_df, fut_name, 'trend_indicator')

        ana_fun(data_df, fut_name, 'macd')
        ana_fun(data_df, fut_name, 'RSI')
        ana_fun(data_df, fut_name, 'obv')
        ana_fun(data_df, fut_name, 'atr')
        ana_fun(data_df, fut_name, 'adx')

        ana_fun(data_df, fut_name, 'trix')
        ana_fun(data_df, fut_name, 'willr')

        ana_fun(data_df, fut_name, 'Vol_OI')
    return data_df
Esempio n. 8
0
                                            'adj_r',
                                            act_info_df,
                                            active_num='01').fillna(0)
    # Close_01 = fut_data.load_act_fut_data_r(fut_name, 'Close', act_info_df, active_num='01')

    # sig_rtn = adj_r_01  # - bt.AZ_Rolling_mean(adj_r_01, 5)
    sig_rtn = bt.AZ_Rolling_mean(adj_r_01, 5)
    # sig_rtn = Close_01/bt.AZ_Rolling_mean(Close_01, 5) - 1

    cond2 = sig_rtn.apply(lambda x: 0 if abs(x) == 0 else (1 if x > 0 else 0))
    signal = cond1 * cond2
    pnl_df = signal.shift(1) * adj_r_01
    asset_df = pnl_df.cumsum()
    SignalAnalysis.CDF(sig_rtn * cond1,
                       adj_r_01,
                       hold_time=1,
                       title=f'{fut_name} CDF Figure',
                       lag=1,
                       zero_drop=True)

    plt.figure(figsize=[16, 10])
    plt.plot(asset_df.index, asset_df.values)
    plt.legend()
    plt.grid()
    savfig_send(fut_name)
    # Close = fut_data.load_fut_data(fut_name, 'Close')
    # OpenInterest = fut_data.load_fut_data(fut_name, 'OpenInterest')

# def part_test_fun(instrument):
#     adj_close_df = FutData().load_act_adj_fut_data(instrument, 'Close', active_df, aadj_factor_df)
#     adj_high_df = FutData().load_act_adj_fut_data(instrument, 'High', active_df, aadj_factor_df)
#     adj_low_df = FutData().load_act_adj_fut_data(instrument, 'Low', active_df, aadj_factor_df)