This is an old revision of the document!
# coding: utf-8 import timeit def calc_returns (): df['returns'] = df['close'] / df['close'].shift(1) #df['cum_returns'] = df['returns'].cumprod() cum_returns = df['returns'].prod() def calc_log_returns (): df['log_returns'] = np.log( df['close'] / df['close'].shift(1) ) #df['cum_log_returns'] = np.exp(df['log_returns'].cumsum()) cum_log_returns = np.exp( df['log_returns'].sum() ) print(timeit.timeit(stmt='calc_returns()',setup='from __main__ import calc_returns',number=10000)) print(timeit.timeit(stmt='calc_log_returns()',setup='from __main__ import calc_log_returns',number=10000))
# coding: utf-8 df = pd.read_csv('https://raw.githubusercontent.com/brulint/backtesting/main/btceur-2h.csv') df['fast'] = ta.EMA(df['close'], timeperiod = 20) df['slow'] = ta.SMA(df['close'], timeperiod = 200)
df['position'] = df['fast'] > df['slow']
df['r_hodl'] = df['close'] / df['close'].shift() df['logr_hodl'] = np.log( df['r_hodl'] )
df['r_strat'] = np.where(df['position'].shift() == 1, df['r_hodl'], 1) df['logr_strat'] = np.where(df['position'].shift() == 1, df['logr_hodl'], 0)
df['r_fee'] = np.where(df['position'] != df['position'].shift(), 1/1.0025, 1) df['logr_fee'] = np.where(df['position'] != df['position'].shift(), -0.0025, 0)
df['r_net'] = df['r_strat'] * df['r_fee'] df['logr_net'] = df['logr_strat'] + df['logr_fee']
df['R_net'] = df['r_net'].cumprod() df['logR_net'] = np.exp( df['logr_net'].cumsum() )