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
duanqs