Notebook
In [20]:
import pyfolio as pf
import empyrical as ep
import numpy as np
import pandas as pd
import datetime

A disqualified algo out of sample backtest 07/29/2016 - 08/14/2019

In [21]:
bt = get_backtest('5d55118d4a208c60d6636539')
returns = bt.daily_performance['returns']
100% Time:  0:00:01|##########################################################|
In [22]:
cum_returns = ep.cum_returns(returns)
ax = cum_returns.plot(figsize=(14,5))
ax.set(title='Cumulative Returns', ylabel='returns', xlabel='date');
In [23]:
benchmark_rets = pf.utils.get_symbol_rets('SPY')
pf.plotting.show_perf_stats(returns, benchmark_rets)
Start date2016-07-29
End date2019-08-14
Total months36
Backtest
Annual return 25.8%
Cumulative returns 101.1%
Annual volatility 12.0%
Sharpe ratio 1.98
Calmar ratio 2.62
Stability 0.98
Max drawdown -9.8%
Omega ratio 1.42
Sortino ratio 2.87
Skew -0.60
Kurtosis 3.72
Tail ratio 1.01
Daily value at risk -1.4%
Alpha 0.19
Beta 0.43

A disqualified algo live trading 07/29/2016 - 08/14/2019

In [24]:
def initialize_log(algo_dict):
    return pd.DataFrame(pd.Series(algo_dict), columns=['id']).transpose()
In [25]:
def record_returns(log):
    log.loc[pd.Timestamp(datetime.datetime.now())] = \
        log.loc['id'].apply(lambda algo_id:
                                 get_live_results(algo_id).cumulative_performance.ix[-1, 'returns'])
In [26]:
def sorted_log(log):
    return log[log.loc[log.last_valid_index()].argsort()]
In [27]:
algos = {'Disqualified Algo' : '57949d107e11f595a7000270',
         }
       
df = initialize_log(algos)
In [28]:
record_returns(df)
sorted_log(df)
100% Time:  0:01:32|##########################################################|
Out[28]:
Disqualified Algo
id 57949d107e11f595a7000270
2019-08-15 08:57:13.218771 1.03885
Return 103.89
Alpha 0.19
Beta 0.43
Sharpe 2.01
Sortino 2.91
Volatility 0.11

Classic dollar neutral WML_10 in the same period (for comparison)

In [29]:
bt = get_backtest('5d5512876a94c5604b998139')
returns = bt.daily_performance['returns']
100% Time:  0:00:16|##########################################################|
In [30]:
cum_returns = ep.cum_returns(returns)
ax = cum_returns.plot(figsize=(14,5))
ax.set(title='Cumulative Returns', ylabel='returns', xlabel='date');
In [31]:
benchmark_rets = pf.utils.get_symbol_rets('SPY')
pf.plotting.show_perf_stats(returns, benchmark_rets)
Start date2016-07-29
End date2019-08-14
Total months36
Backtest
Annual return 4.3%
Cumulative returns 13.8%
Annual volatility 8.1%
Sharpe ratio 0.56
Calmar ratio 0.47
Stability 0.67
Max drawdown -9.1%
Omega ratio 1.10
Sortino ratio 0.79
Skew -0.32
Kurtosis 0.85
Tail ratio 0.88
Daily value at risk -1.0%
Alpha 0.04
Beta 0.09
In [ ]: