Example #1
0
    def CDF_c(signal_df, raw_return_df, hold_time, title='CDF Figure', lag=2):
        signal_df = signal_df.shift(lag).replace('np.nan')
        a = np.argsort(signal_df.values)
        return_df = bt.AZ_Rolling_sum(raw_return_df, hold_time).shift(-hold_time + 1)
        f_return_m = return_df - np.nanmean(return_df)
        plt.figure(figsize=(20, 6))
        p1 = plt.subplot(121)
        p2 = plt.subplot(122)

        p1.plot(signal_df.iloc[a].values, np.cumsum(return_df.iloc[a].values))
        # p1.plot(np.cumsum(return_df[a]))

        # p1.set_xticklabels(signal_df[a].values)
        ticks_list = signal_df.iloc[a].values[[int(len(signal_df[a]) / 14) * i - 1 for i in range(1, 15)]]
        print(ticks_list)

        p1.set_xticks(ticks_list)
        # p1.vlines(x='13:30', ymin=np.inf, ymax=np.inf)
        p1.set_title('cumsum return')
        p1.grid(1)

        p2.plot(signal_df.iloc[a].values, np.cumsum(f_return_m.iloc[a]))
        # p2.plot(np.cumsum(f_return_m[a]))
        # p2.set_xticklabels(signal_df[a].values)
        p2.set_xticks(ticks_list)
        p2.set_title('cumsum mean return')
        p2.grid(1)

        plt.suptitle(title)
        savfig_send(subject=title, text='')
Example #2
0
def test_fun(fut_name, CCI_window, CCI_limit):
    result_list = []
    pool = Pool(20)
    if fut_name not in ban_name_list:
        for con_id, part_info_df in fut_data.act_info_df[[
                f'{fut_name}01'
        ]].groupby(f'{fut_name}01'):
            args = [
                con_id,
                part_info_df.index[0] - timedelta(1),
                part_info_df.index[-1] + timedelta(1),
                CCI_window,
                CCI_limit,
            ]
            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)
    print(fut_name, pot, sp)
    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}'
    )
    return data_df
Example #3
0
def test_fun(fut_name, CCI_window, CCI_limit, hold_time):
    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
        ]
        # 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)
    print(fut_name, sp, pot, CCI_window, CCI_limit)
    print(fut_name, pot, sp)
    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)}')

    # if abs(sp) > 1.5 and abs(pot) > 8:
    # 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)}')
    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}'
    )
    return data_df
Example #4
0
def generation(index_name):
    weight_df_new = AZ_Load_csv(root_path.EM_Funda.IDEX_YS_WEIGHT_A / f'SECINDEXR_{index_name}.csv')
    weight_df_old = AZ_Load_csv(root_path.EM_Funda.IDEX_YS_WEIGHT_A / f'SECINDEXR_{index_name}plus.csv')
    weight_df = weight_df_old.combine_first(weight_df_new)

    stock_return_df = AZ_Load_csv(root_path.EM_Funda.DERIVED_14 / 'aadj_r.csv')
    index_count = (weight_df * stock_return_df).sum(1)
    print(index_count)
    plt.plot(index_count.cumsum(), label='count')
    savfig_send()
Example #5
0
def test_fun(fut_name, path_name, file_name):
    root_path = '/mnt/mfs/DAT_PUBLIC/spot_data'
    ####################
    data_df = pd.read_excel(f'{root_path}/{path_name}/{file_name}',
                            index_col=0,
                            skiprows=[0, 1, 3, 4, 5, 6, 7, 8, 9],
                            parse_dates=True)

    ####################
    # data_df = pd.read_excel(f'{root_path}/{path_name}/{file_name}', index_col=0,
    #                         skiprows=[1, 2], parse_dates=True)

    data_df = data_df.dropna(how='all', axis=0)
    data_df.index = pd.to_datetime(data_df.index)

    data_df = data_df.truncate(begin_time, end_time)

    return_df = get_return_df(fut_name)
    data_df = data_df.reindex(return_df.index).fillna(method='ffill')
    # pos_df = SignalSet().fun_1(data_df)

    score_df, _, _ = FutIndex.boll_fun(data_df, 10, return_line=True)
    signal_df = Signal.fun_1(score_df, 0)
    pos_df = Position.fun_1(signal_df)

    pnl_df = pos_df.shift(2).mul(return_df, axis=0)
    pnl_df.name = fut_name

    # plt.figure(figsize=[16, 10])
    # plt.plot(pnl_df.index, pnl_df.cumsum().values)
    # plt.legend()
    # plt.grid()
    # savfig_send(subject=f"{fut_name}|{path_name.encode()}|{file_name.encode()}")

    sharpe_sr = bt.AZ_Sharpe_y(pnl_df)
    sharpe_sr.name = 'sharpe'
    asset_df = pnl_df.sum()
    trade_times = pos_df.diff().abs().sum()
    pot_sr = (asset_df / trade_times) * 10000
    pot_sr.name = 'pot'

    result_df = pd.concat([sharpe_sr, pot_sr], axis=1) \
        .sort_values(by='sharpe', na_position='last')
    result_df = result_df[result_df['sharpe'].abs() > 1]
    if len(result_df) != 0:
        print(fut_name, path_name, file_name)
        print(result_df)
        plt.figure(figsize=[16, 10])
        plt.plot(pnl_df.index, pnl_df[result_df.index].cumsum().values)
        plt.legend()
        plt.grid()
        savfig_send(
            text=f"{fut_name}|{path_name.encode()}|{file_name.encode()}",
            subject=f"{fut_name}|{path_name.encode()}|{file_name.encode()}")
    return pos_df, pnl_df, data_df, result_df
Example #6
0
def part_main(factor_test, industry_df, index_name, q, sector_name, limit,
              begin_d_list, end_d_list):
    print(1)
    plt.figure(figsize=[16, 10])
    for begin_d in begin_d_list:
        for end_d in end_d_list:
            pnl_df, pot = main(factor_test, industry_df, index_name, q,
                               sector_name, limit, begin_d, end_d)
            plt.plot(pnl_df.cumsum().values,
                     label=f'begin_d={begin_d}, end_d={end_d}, pot={pot}')
    plt.legend()
    savfig_send(subject=f'sector_name=REM5_scores, index_name={index_name}, '
                f'Q={q}, limit={limit}')
Example #7
0
 def back_test_c(self, data, file_name, add_info):
     data_c = data * self.sector_df
     a = data_c.rank(axis=1, ascending=False)
     signal_df = (a <= 20).astype(int)
     print(signal_df.iloc[-10].replace(0, np.nan).dropna())
     self.pos_daily_fun(signal_df)
     pos_df = self.signal_to_pos_ls(signal_df, 'l')
     pnl_df = (pos_df.shift(2) * self.return_df).sum(1)
     plt.figure(figsize=[16, 10])
     plt.plot(pnl_df.cumsum())
     savfig_send(
         subject=
         f'{add_info}|{file_name[:-4]}|{self.sector_name}|{self.if_only_long}'
         f'|{self.hold_time}|{bt.AZ_Sharpe_y(pnl_df)}')
Example #8
0
def plot_send(con_id, begin_time, end_time, n=15):
    data_df = fut_data.load_intra_data(con_id, ['Close'])['Close']
    part_df = data_df.truncate(begin_time, end_time)
    plt.figure(figsize=[80, 10])
    plt.plot(range(len(part_df)), part_df.values)
    plt.xticks([
        int(len(part_df.index.strftime('%Y-%m-%d %H:%M')) / (n - 1)) * i
        for i in range(n)
    ],
               part_df.index.strftime('%Y-%m-%d %H:%M')[[[
                   int(len(part_df.index) / (n - 1)) * i for i in range(n)
               ]]],
               rotation=45)
    plt.grid()
    savfig_send()
Example #9
0
    def CDF(raw_signal_df, raw_return_df, hold_time, title='CDF Figure', lag=2, zero_drop=False):
        raw_signal_df = raw_signal_df.shift(lag).values
        if zero_drop:
            filter_mask = pd.notna(raw_signal_df) & (raw_signal_df != 0)
        else:
            filter_mask = pd.notna(raw_signal_df)

        signal_df = raw_signal_df[filter_mask]
        raw_return_df_sum = bt.AZ_Rolling_sum(raw_return_df, hold_time).shift(-hold_time + 1).values
        return_df = raw_return_df_sum[filter_mask]

        f_return_m = return_df - np.nanmean(return_df)
        a = np.argsort(signal_df)
        plt.figure(figsize=(10, 6))
        p1 = plt.subplot(221)
        p2 = plt.subplot(222)
        p3 = plt.subplot(223)
        p4 = plt.subplot(224)
        p1.plot(np.cumsum(return_df[a]))
        p1.set_title('cumsum return')
        p1.grid(1)

        p2.plot(signal_df[a], np.cumsum(return_df[a]))
        p2.set_title('signal and cumsum return')
        p2.grid(1)

        p3.plot(np.cumsum(f_return_m[a]))
        p3.set_title('cumsum mean return')
        p3.grid(1)

        p4.plot(signal_df[a], np.cumsum(f_return_m[a]))
        p4.set_title('signal and cumsum mean return')
        p4.grid(1)

        plt.suptitle(title)
        savfig_send(subject=title, text='')
Example #10
0

if __name__ == '__main__':
    root_path = '/mnt/mfs/DAT_FUT'
    fut_data = FutData(root_path)
    fut_name_list = FutClass['黑色']
    ban_name_list = [
        'WR', 'BB', 'ZC', 'SF', 'SM', 'FU', 'TA', 'SC', 'MA', 'OI', 'RS', 'IC'
    ]
    data_df = main()

    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)}')
    # 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())
Example #11
0
window_list = [10, 20, 40, 100]
limit_list = [1, 1.5, 2]
for instrument in instrument_list:
    # 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)

    adj_return_df = adj_close_df / adj_close_df.shift(1) - 1
    month_signal = pd.DataFrame(adj_return_df.index.strftime('%m'), index=adj_return_df.index, columns=['month'])

    for n in window_list:
        raw_factor = FutIndex.boll_fun(adj_close_df, n)
        for limit in limit_list:
            signal = Signal.fun_1(raw_factor, limit)
            pos = Position.fun_1(signal)
            pnl_df = (pos.shift(2) * adj_return_df).fillna(0)

            sp = bt.AZ_Sharpe_y(pnl_df)
            pot = bt.AZ_Pot(pos, pnl_df.sum())
            print(instrument, sp, pot, n, limit)
            if abs(sp) > 1.4:
                print('!!!!!!!!!!!!!!!!')
            print(f'sum:', sum(pnl_df))
            if abs(sp) > 0.7:
                for x, y in month_signal.groupby(by=['month']):
                    print(x, round(sum(pnl_df.loc[y.index]), 5))
                plt.plot(pnl_df.cumsum())
                savfig_send('{}, {}, {}, {}, {}'.format(instrument, sp, pot, n, limit))
Example #12
0
            fut_name, path_name, file_name, sp_name, way = res
        pos_df, pnl_df, data_df, result_df = test_fun(fut_name, path_name,
                                                      file_name)
        pnl_sr = pnl_df[sp_name] * way
        pos_sr = pos_df[sp_name] * way
        pnl_sr.name = fut_name
        pos_sr.name = fut_name
        pnl_list.append(pnl_sr)
        pos_list.append(pos_sr)
        # 出厂价: 聚丙烯PP(T30S):齐鲁石化
        plt.figure(figsize=[16, 10])
        plt.plot(pnl_df.index, pnl_df[sp_name].cumsum())
        plt.legend()
        plt.grid()
        savfig_send(
            subject=
            f"result {result_df.loc[sp_name]['sharpe']} {result_df.loc[sp_name]['pot']}"
        )
    pnl_sum = pd.concat(pnl_list, axis=1)

    pos_concat = pd.concat(pos_list, axis=1)
    pos_concat.index + timedelta(hours=14, minutes=50)
    plt.figure(figsize=[16, 10])
    pnl_cumsum = pnl_sum.mean(1).cumsum()
    pnl_cumsum = pnl_cumsum.replace(0, np.nan).dropna()
    print(bt.AZ_Sharpe_y(pnl_sum.mean(1)))
    plt.plot(pnl_cumsum.index, pnl_cumsum.values)
    plt.legend()
    plt.grid()
    savfig_send(subject='result')
Example #13
0
    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)
#
#     adj_return_df = adj_close_df/adj_close_df.shift(1) - 1
#
#     for n in window_list:
#         raw_factor = FutIndex.boll_fun(adj_close_df, n)
#         for limit in limit_list:
#             signal = Signal.fun_1(raw_factor, limit)
#             pos = Position.fun_1(signal)
Example #14
0
        'return_df'] = part_data['Close'] / part_data['Close'].shift(1) - 1

    part_data['tmp_df'] = tmp_df.reindex(index=sorted(list(set(part_data.index) & set(tmp_df.index)))) \
        .reindex(index=part_data.index)

    part_data['pos_df_raw'] = tmp_df.reindex(index=sorted(list(set(part_data.index) & set(tmp_df.index)))) \
        .replace(0, np.nan).reindex(index=part_data.index).fillna(method='ffill').reindex(index=part_data.index)

    # part_data['pos_df_raw'] = tmp_df.reindex(index=part_data.index)\
    #     .replace(0, np.nan).reindex(index=part_data.index).fillna(method='ffill').reindex(index=part_data.index)

    # part_data['pos_df_raw'] = part_data['tmp_df'].replace(0, np.nan).fillna(method='ffill')

    part_data['pos_df'] = part_data['pos_df_raw'].reindex(
        index=part_data.index).fillna(method='ffill')
    part_data['pnl_df'] = part_data['pos_df'] * part_data['return_df']

    daily_pnl = part_data.groupby(by=['Date'])['pnl_df'].sum()
    daily_pnl.index = pd.to_datetime(daily_pnl.index)

    sp = bt.AZ_Sharpe_y(daily_pnl)
    pot = part_data['pnl_df'].sum() / part_data['pos_df'].diff().abs().sum(
    ) * 10000

    plt.figure(figsize=[16, 10])
    plt.plot(daily_pnl.cumsum())
    plt.xticks(rotation=45)
    plt.grid()

    savfig_send()
Example #15
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
Example #16
0
def part_test(
        con_id,
        begin_time,
        end_time,
        # p_window, p_limit,
        # v_window, v_limit,
        # voli_window, voli_limit,
        CCI_window,
        CCI_limit,
        # hold_time,
        cut_num):
    # print(con_id, begin_time, end_time)
    try:
        # print(con_id, begin_time, end_time)
        all_min_df = fut_data.load_intra_data(con_id, ['Close'])
        data_df = fut_data.load_intra_reshape_data(
            con_id, ['High', 'Low', 'Close', 'Volume', 'OpenInterest'],
            cut_num=cut_num)

        if con_id == 'J1501.DCE':
            print(1)
        # begin_time = pd.to_datetime('20190101')
        # # end_time = begin_time + timedelta(1)
        # end_time = pd.to_datetime('20190401')

        # p_window = 1
        # p_limit = 1
        # v_window = 20
        # v_limit = 2

        # part_data_df = data_df.truncate(before=begin_time-timedelta(20), after=end_time)
        part_data_df = data_df.truncate(before=begin_time, after=end_time)
        part_data_df['OpenInterest_core'] = FutIndex.boll_fun(
            data_df['OpenInterest'], 100)
        part_data_df['weekday'] = pd.to_datetime(
            part_data_df['Date']).dt.weekday
        part_data_df['weekday_pos'] = (
            (part_data_df['weekday'] != 3)
            # & (part_data_df['weekday'] != 3)
            # & (part_data_df['weekday'] != 3)
            # (part_data_df['weekday'] != 4)
        ).astype(int)
        part_data_df['month'] = part_data_df['Date'].str.slice(5, 7)
        # part_data_df['month_pos'] = ((part_data_df['month'] != '10') & (part_data_df['month'] != '12')).astype(int)
        part_data_df['month_pos'] = (part_data_df['month'] != '1').astype(int)

        # part_data_df['time_pos_cut'] = part_data_df.apply(lambda x: -1 if (((x['Time'] > '14:51')
        #                                                                     & (x['Time'] <= '15:00')
        #                                                                     # | (x['Time'] > '21:00')
        #                                                                     # & (x['Time'] <= '22:00')
        #                                                                     # | (x['Time'] > '21:00')
        #                                                                     # & (x['Time'] <= '22:00')
        #                                                                     )) else 1, axis=1)
        part_data_df[
            'Vol_OI'] = part_data_df['Volume'] / part_data_df['OpenInterest']
        part_data_df['Vol_OI_pos'] = (part_data_df['Vol_OI'] < 0.4).astype(int)
        part_data_df['Volume_boll'] = FutIndex.boll_fun(
            part_data_df[['Volume']], CCI_window)
        part_data_df['past_roll_Volume'] = bt.AZ_Rolling_mean(
            part_data_df[['Volume']], CCI_window)
        v_window = 60
        part_data_df['Volume_zscore'] = bt.AZ_Col_zscore(
            part_data_df[['Volume']], CCI_window)
        part_data_df['Volume_signal'] = Signal.fun_1(
            part_data_df['Volume_zscore'], 0.01)
        # part_data_df['Volume_signal'] = (part_data_df['Volume_zscore'] < 2).astype(int).replace(0, -1)

        p_window = 5
        # part_data_df['past_min_pct_change'] = (part_data_df['Close'] - part_data_df['Close'].shift(p_window)) \
        #                                       / part_data_df['Close'].shift(p_window)

        part_data_df['past_min_pct_change'] = (
            part_data_df['Close'] / part_data_df['Close'].shift(p_window) - 1)
        part_data_df['past_min_pct_signal'] = part_data_df['past_min_pct_change'] \
            .apply(lambda x: 0 if abs(x) < 0.004 else (1 if x > 0.004 else -1))

        test_window = CCI_window
        macd, macdsignal, macdhist = ta.MACD(part_data_df['Close'], 12, 26, 9)
        part_data_df['macd'] = macd
        part_data_df['macd_pos'] = (macd < 25).astype(int)
        RSI = ta.RSI(part_data_df['Close'], test_window)
        RSI = RSI - 50
        RSI[RSI > 20] = 20
        RSI[RSI < -20] = -20
        part_data_df['RSI'] = RSI
        part_data_df['RSI_signal'] = Signal.fun_1(part_data_df['RSI'], 1)
        part_data_df['RSI_pos'] = Position.fun_1(part_data_df['RSI_signal'],
                                                 limit=60)

        # aroondown, aroonup = ta.AROON(part_data_df['High'], part_data_df['Low'], test_window)

        obv = ta.OBV(part_data_df['Close'], part_data_df['Volume'])
        part_data_df['obv'] = obv

        atr = ta.ATR(part_data_df['High'], part_data_df['Low'],
                     part_data_df['Close'], test_window)
        part_data_df['atr'] = atr
        part_data_df['adr_pos'] = (atr < 17).astype(int)

        adx = ta.ADX(part_data_df['High'], part_data_df['Low'],
                     part_data_df['Close'], test_window)
        part_data_df['adx'] = adx

        trix = ta.TRIX(part_data_df['Close'], 60)
        part_data_df['trix'] = trix

        willr = ta.WILLR(part_data_df['High'], part_data_df['Low'],
                         part_data_df['Close'], test_window)
        part_data_df['willr'] = willr

        part_data_df['CCI_score'] = FutIndex.CCI_fun(part_data_df['High'],
                                                     part_data_df['Low'],
                                                     part_data_df['Close'],
                                                     CCI_window)

        part_data_df['CCI_signal'] = Signal.fun_1(part_data_df['CCI_score'],
                                                  CCI_limit)

        part_data_df['CCI_pos'] = Position.fun_1(part_data_df['CCI_signal'])

        part_data_df['boll_score'], ma_n, md_n = FutIndex.boll_fun(
            part_data_df['Close'], CCI_window, return_line=True)
        part_data_df['boll_signal'] = Signal.fun_1(part_data_df['boll_score'],
                                                   CCI_limit)

        part_data_df['boll_pos'] = Position.fun_1(part_data_df['boll_signal'])
        # part_data_df['boll_pos'] = Position.fun_3(part_data_df['boll_signal'], part_data_df['past_min_pct_signal'])

        part_data_df['test_score'] = FutIndex.test_fun(part_data_df['Close'],
                                                       CCI_window,
                                                       cap=5,
                                                       num=3,
                                                       return_line=False)
        part_data_df['test_signal'] = Signal.fun_1(part_data_df['test_score'],
                                                   CCI_limit)

        part_data_df['test_pos'] = Position.fun_1(part_data_df['test_signal'])
        # part_data_df['trend_signal'] = bt.AZ_Rolling(part_data_df['Close'], 500).std()
        # part_data_df['trend_pos'] = (part_data_df['trend_signal'] < 40).astype(int)

        part_data_df['trend_indicator'] = bt.AZ_Rolling(part_data_df['Close'], 100). \
            apply(lambda x: (x[-1] / x[0] - 1) / (max(x) / min(x) - 1), raw=False)
        # part_data_df['trend_pos'] = (part_data_df['trend_indicator'] < 0.5).astype(int)
        # part_data_df['trend_pos'] = (part_data_df['trend_indicator'].abs() > 0.25).astype(int)\
        #     .replace(0, np.nan).fillna(method='ffill', limit=1).fillna(0)
        part_data_df['trend_pos'] = (part_data_df['trend_indicator'].abs() >
                                     0.25).astype(int)
        # part_data_df['position'] = part_data_df['boll_pos'] * part_data_df['weekday_pos'] * part_data_df['month_pos']

        # part_data_df['position'] = part_data_df['CCI_pos']
        # mul_fun(part_data_df['boll_pos'], part_data_df['CCI_pos'])
        part_data_df['signal'] = part_data_df[
            'boll_signal']  # * part_data_df['macd_pos']
        part_data_df['position'] = Position.fun_1(part_data_df['signal']) * part_data_df['adr_pos'] \
                                   * part_data_df['trend_pos'] * part_data_df['Vol_OI_pos'] * part_data_df['macd_pos']

        part_data_df['position_exe'] = part_data_df['position'].shift(1)
        part_data_df['position_sft'] = part_data_df['position'].shift(2)

        # part_data_df['price_return'] = part_data_df['Close'] - part_data_df['Close'].shift(1)
        next_trade_close = all_min_df['Close'].shift(-2).reindex(
            part_data_df.index)
        part_data_df['next_trade_close'] = next_trade_close
        # next_trade_close.iloc[-1] = all_min_df['Close'].iloc[-1]
        part_data_df['next_trade_close'] = next_trade_close
        part_data_df['price_return'] = part_data_df['next_trade_close'] - \
                                       part_data_df['next_trade_close'].shift(1)

        # part_data_df['price_return_sum'] = bt.AZ_Rolling(part_data_df['price_return'], hold_time).sum() \
        #     .shift(-hold_time + 1)
        # part_data_df['pnl'] = part_data_df['position_sft'] * part_data_df['price_return']
        part_data_df['pnl'] = part_data_df['position_exe'] * part_data_df[
            'price_return']

        # part_data_df['pnl_test'] = part_data_df['signal'] * part_data_df['price_return_sum'].shift(-2)

        part_data_df['turnover'] = (part_data_df['position_sft'] - part_data_df['position_sft'].shift(1)) \
                                   * part_data_df['Close']

        # part_data_df = part_data_df.truncate(before=begin_time)
        part_data_df['asset'] = part_data_df['pnl'].cumsum()

        part_data_df['con_id'] = con_id
        part_pnl_df = part_data_df.groupby('Date')['pnl'].sum()
        part_turnover = part_data_df.groupby('Date')['turnover'].apply(
            lambda x: sum(abs(x)))
        # 剔除开盘收盘5min的signal
        # if '1910' in con_id:

        plt.figure(figsize=[64, 64])
        ax1 = plt.subplot(4, 1, 1)
        ax2 = plt.subplot(4, 1, 2)
        ax3 = plt.subplot(4, 1, 3)
        ax1.plot(part_data_df['asset'].values)
        ax2.plot(part_data_df['Close'].values, '--', color='#75bbfd')
        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] > 0)],
                    part_data_df['Close'][part_data_df['position_sft'] > 0],
                    s=0.5,
                    color='red')

        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] == 0)],
                    part_data_df['Close'][part_data_df['position_sft'] == 0],
                    s=0.5,
                    color='black')

        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] < 0)],
                    part_data_df['Close'][part_data_df['position_sft'] < 0],
                    s=0.5,
                    color='blue')

        # ax2.scatter(np.array(range(len(part_data_df.index)))[(part_data_df['past_min_pct_signal'] > 0)],
        #             part_data_df['Close'][part_data_df['past_min_pct_signal'] > 0], s=20, color='y')
        # ax2.scatter(np.array(range(len(part_data_df.index)))[(part_data_df['past_min_pct_signal'] < 0)],
        #             part_data_df['Close'][part_data_df['past_min_pct_signal'] < 0], s=20, color='#f504c9')

        ax3.bar(range(len(part_data_df.index)), part_data_df['Volume'].values)

        ax1.grid()
        ax2.grid()
        ax3.grid()
        plt.title(con_id)
        savfig_send(con_id)

        return part_pnl_df, part_turnover, part_data_df
    except Exception as error:
        print(error)
        return pd.Series(), pd.Series(), pd.Series()
Example #17
0
            print(b - a)
            # target_dict

            vol_signal = bt.AZ_Rolling(return_signal, n=20).std()
            vol_end_end = bt.AZ_Rolling(return_end_end, n=20).std()

            factor_1 = return_signal / vol_signal
            factor_1_m = factor_1.sub(factor_1.mean(1), axis=0)

            factor_2 = return_end_end / vol_end_end
            factor_2_m = factor_2.sub(factor_2.mean(1), axis=0)

            weight_pos_df_1 = factor_1_m
            weight_pos_df_2 = factor_2_m

            pnl_df_1 = (weight_pos_df_1.shift(1) * return_end_end).sum(1)
            pnl_df_2 = (weight_pos_df_2.shift(1) * return_end_end).sum(1)

            pot_1 = pnl_df_1.sum() / weight_pos_df_1.diff().abs().sum().sum(
            ) * 10000
            pot_2 = pnl_df_2.sum() / weight_pos_df_2.diff().abs().sum().sum(
            ) * 10000

            plt.plot(pnl_df_1.cumsum().values, label=round(pot_1, 4))
            plt.plot(pnl_df_2.cumsum().values, label=round(pot_2, 4))
            plt.legend()
            savfig_send(
                subject=
                f'test_1 , {begin_p}, {end_p}, {trade_p} pot_1:{pot_1}, pot_2:{pot_2}'
            )
Example #18
0
def part_test(con_id, begin_time, end_time, CCI_window, CCI_limit):
    try:
        data_df = fut_data.load_intra_data(con_id,
                                           ['High', 'Low', 'Close', 'Volume'])

        part_data_df = data_df.truncate(before=begin_time, after=end_time)

        part_data_df['weekday'] = pd.to_datetime(
            part_data_df['Date']).dt.weekday
        part_data_df['weekday_pos'] = (
            (part_data_df['weekday'] != 2)
            & (part_data_df['weekday'] != 1)
            # & (part_data_df['weekday'] != 3)
            # (part_data_df['weekday'] != 4)
        ).astype(int).shift(-2)

        part_data_df['boll_score'] = FutIndex.boll_fun(part_data_df['Close'],
                                                       CCI_window)
        part_data_df['boll_signal'] = Signal.fun_1(part_data_df['boll_score'],
                                                   CCI_limit)
        part_data_df['boll_pos'] = Position.fun_1(part_data_df['boll_signal'])

        part_data_df['trend_signal'] = bt.AZ_Rolling(part_data_df['Close'],
                                                     500).std()
        part_data_df['trend_pos'] = (part_data_df['trend_signal'] <
                                     20).astype(int)

        part_data_df['position'] = part_data_df['boll_pos'] * part_data_df[
            'trend_pos'] * part_data_df['weekday_pos']
        part_data_df['position_exe'] = part_data_df['position'].shift(
            1).fillna(0)
        part_data_df['position_sft'] = part_data_df['position'].shift(
            2).fillna(0)
        part_data_df['price_return'] = part_data_df['Close'] / part_data_df[
            'Close'].shift(1) - 1

        part_data_df['pnl'] = part_data_df['position_sft'] * part_data_df[
            'price_return']
        part_data_df['asset'] = part_data_df['pnl'].cumsum()

        part_data_df['turnover'] = (part_data_df['position_sft'] -
                                    part_data_df['position_sft'].shift(1))
        part_data_df['con_id'] = con_id
        part_pnl_df = part_data_df.groupby('Date')['pnl'].sum()
        part_turnover = part_data_df.groupby('Date')['turnover'].apply(
            lambda x: sum(abs(x)))
        # 剔除开盘收盘5min的signal
        plt.figure(figsize=[64, 64])
        ax1 = plt.subplot(4, 1, 1)
        ax2 = plt.subplot(4, 1, 2)
        ax3 = plt.subplot(4, 1, 3)
        ax1.plot(part_data_df['asset'].values)
        # ax2.plot(part_data_df['Close'].values, '--', color='#75bbfd')
        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] > 0)],
                    part_data_df['Close'][part_data_df['position_sft'] > 0],
                    s=0.5,
                    color='red')

        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] == 0)],
                    part_data_df['Close'][part_data_df['position_sft'] == 0],
                    s=0.5,
                    color='black')

        ax2.scatter(np.array(range(len(
            part_data_df.index)))[(part_data_df['position_sft'] < 0)],
                    part_data_df['Close'][part_data_df['position_sft'] < 0],
                    s=0.5,
                    color='blue')
        # ax2.scatter(np.array(range(len(part_data_df.index)))[(part_data_df['past_min_pct_signal'] > 0)],
        #             part_data_df['Close'][part_data_df['past_min_pct_signal'] > 0], s=20, color='black')
        # ax2.scatter(np.array(range(len(part_data_df.index)))[(part_data_df['past_min_pct_signal'] < 0)],
        #             part_data_df['Close'][part_data_df['past_min_pct_signal'] < 0], s=20, color='y')

        ax3.bar(range(len(part_data_df.index)), part_data_df['Volume'].values)

        ax1.grid()
        ax2.grid()
        ax3.grid()
        plt.title(con_id)

        savfig_send(con_id)
        return part_pnl_df, part_turnover, part_data_df
    except Exception as error:
        print(error)
        return None