pandas df.apply

剔除星期四

代码

def delThursday_strat(df):
    ''' 4. 制定策略,执行回测,评估性能: "剔除星期四"策略: 星期四收盘买入, 下个星期三收盘卖出'''
    df['roc1_delThursday'] = df.apply(
        lambda x: 0 if x.weekday==4 else x.roc1, axis=1) # 逐行计算, 零佣金
    df['eq_delThurs'] = (1+df.roc1_delThursday).cumprod()
    
    # 考虑佣金损失: 
    # a. 近似算法
    #    一轮交易的佣金损失近似为:星期四的收益率设置为佣金的2倍
    df['roc1_delThursdayA'] = df.apply(
        lambda x: -2*cfg.commission if x.weekday==4 else x.roc1, axis=1) # 逐行计算, 考虑佣金
    df['eq_delThursA'] = (1+df.roc1_delThursdayA).cumprod()
    '''
    b. 实际情况
        b1. 不够严谨的算法
            周四收盘价买入, 下周三的收盘价卖出
            策略的roc1的算法: 
                周三的roc -= 佣金
                周四的roc = -佣金
                其它交易日的维持不变
            结论: 经过测试发现b1结果与a结果几乎一样
        b2. 严谨算法
            周四收盘买入, 下一个周四的前一个交易日卖出
            结论: 经过测试发现b2结果与a结果也几乎一样
    '''
    # b1 算法代码    
    # def fun_del4(x):
    #     roc1 = 0
    #     if x.weekday==3:
    #         roc1 = x.roc1 - cfg.commission
    #     elif x.weekday==4:
    #         roc1 = -cfg.commission
    #     else: 
    #         roc1 = x.roc1
    #     return roc1
    # df['roc1_delThursB'] = df.apply(fun_del4, axis=1)
    # df['eq_delThursB'] = (1+df.roc1_delThursB).cumprod()
        
    # b2 algo:
    loc = df[df.weekday==4].shift(-1).index #下一个星期四的时间戳
    iloc = [df.index.get_loc(dt)-1 for dt in loc]
    # df.iloc[ iloc, df.columns.get_loc('weekday')].value_counts()
    df['ssig'] = df.iloc[ iloc, df.columns.get_loc('weekday')]
    def fun_del4(x):
        roc1 = 0
        if x.ssig>0: # sell signal
            roc1 = x.roc1 - cfg.commission
            # if x.weekday==3:
            #     print(f'Sell {roc1:+8.4%}, {x.weekday}, {x.roc1:+8.4%}' )
            # else:
            #     print(f'Sell {roc1:+8.4%}, {x.weekday}, {x.roc1:+8.4%} 卖出日不是星期三' )
        elif x.weekday==4:
            roc1 = -cfg.commission
            # print(f'Buyy {roc1:+8.4%}, {x.weekday}, {x.roc1:+8.4%}' )
        else: 
            roc1 = x.roc1
        return roc1
    df['roc1_delThursB'] = df.apply(fun_del4, axis=1)
    df['eq_delThursB'] = (1+df.roc1_delThursB).cumprod()

    perf = pd.DataFrame()
    ilist = 'eq_bnh eq_delThurs eq_delThursA eq_delThursB'.split()
    for i in ilist:
        odict = ttr.perf_measure(df[i], False)
        perf = perf.append(pd.DataFrame(odict, index=[i,], columns=odict.keys()))
    perf.index.name='strategy'
    perf.columns.name='performance'
    # pd.set_option('display.precision', 2)
    # print('\n>>> "perf df"'); print(perf)
    # pd.set_option('display.precision', 6) # set back
    return df, perf
posted @ 2021-12-13 21:13  duanqs  阅读(356)  评论(0编辑  收藏  举报