from commonrandom import arbitrary_timeindex, skew_returns_annualised from matplotlib.pyplot import show, hist from common import DAYS_IN_YEAR, ROOT_DAYS_IN_YEAR, account_curve import pandas as pd import numpy as np import scipy.stats as st length_backtest_years=2 number_of_random_curves=100 annualSR=0.5 want_skew=0.0 length_bdays=length_backtest_years*DAYS_IN_YEAR print length_bdays random_curves=[skew_returns_annualised(annualSR=annualSR, want_skew=want_skew, size=length_bdays) for NotUsed in range(number_of_random_curves)] random_curves_npa=np.array(random_curves).transpose() pddf_rand_data=pd.DataFrame(random_curves_npa, index=arbitrary_timeindex(length_bdays), columns=[str(i) for i in range(number_of_random_curves)]) acccurves_rand_data=[account_curve(pddf_rand_data[x]) for x in pddf_rand_data] #results=[x.worst_drawdown() for x in acccurves_rand_data] #results=[x.avg_drawdown() for x in acccurves_rand_data] #print results
want_skew=want_skew, size=length_bdays) for NotUsed in range(number_of_random_curves) ] ## Turn into a dataframe random_curves_npa = np.array(random_curves).transpose() pddf_rand_data = pd.DataFrame( random_curves_npa, index=arbitrary_timeindex(length_bdays), columns=[str(i) for i in range(number_of_random_curves)]) ## This is a nice representation as well acccurves_rand_data = [ account_curve(pddf_rand_data[x]) for x in pddf_rand_data ] """ Plot the curves, just for interest """ plot_random_curves(pddf_rand_data) show() """ Get the statistic we are interested in Change 'function_to_apply' to get what you want """ function_to_apply = np.percentile
(adj_want_mean, adj_want_skew, adj_want_stdev)=adj_moments_for_rho(want_rho, want_mean, want_skew, want_stdev) avg_annual_returns_this_scenario=[] avg_drawdowns_this_scenario=[] max_drawdowns_this_scenario=[] avg_avg_ratio_this_scenario=[] avg_max_ratio_this_scenario=[] ## Window '1000' is no ovelay at all for N_length in N_windows: print "N_length: %d" % N_length ## Generate a lot of random data many_curves_raw=[arbitrary_timeseries(autocorr_skewed_returns(want_rho, adj_want_mean, adj_want_stdev, adj_want_skew, size=curve_length)) for notused in range(monte_runs)] ## Apply the overlay many_curves=[account_curve(apply_overlay(x, N_length, period_stdev, costs_SR)) for x in many_curves_raw] ## Calc statistics annual_returns_these_curves=[np.mean(x)*period_adj for x in many_curves] avg_drawdowns_these_curves=[x.avg_drawdown() for x in many_curves] max_drawdowns_these_curves=[x.worst_drawdown() for x in many_curves] ## Add results avg_annual_returns_this_scenario.append(np.mean(annual_returns_these_curves)) avg_drawdowns_this_scenario.append(np.nanmean(avg_drawdowns_these_curves)) max_drawdowns_this_scenario.append(np.nanmean(max_drawdowns_these_curves)) avg_avg_ratio_this_scenario.append(np.nanmean([divxx(x) for x in zip(annual_returns_these_curves, avg_drawdowns_these_curves)])) avg_max_ratio_this_scenario.append(np.nanmean([divxx(x) for x in zip(annual_returns_these_curves, max_drawdowns_these_curves)])) avg_annual_returns.append(avg_annual_returns_this_scenario) avg_drawdowns.append(avg_drawdowns_this_scenario)
for N_length in N_windows: print "N_length: %d" % N_length ## Generate a lot of random data many_curves_raw = [ arbitrary_timeseries( autocorr_skewed_returns(want_rho, adj_want_mean, adj_want_stdev, adj_want_skew, size=curve_length)) for notused in range(monte_runs) ] ## Apply the overlay many_curves = [ account_curve(apply_overlay(x, N_length, period_stdev, costs_SR)) for x in many_curves_raw ] ## Calc statistics annual_returns_these_curves = [ np.mean(x) * period_adj for x in many_curves ] avg_drawdowns_these_curves = [x.avg_drawdown() for x in many_curves] max_drawdowns_these_curves = [x.worst_drawdown() for x in many_curves] ## Add results avg_annual_returns_this_scenario.append( np.mean(annual_returns_these_curves)) avg_drawdowns_this_scenario.append( np.nanmean(avg_drawdowns_these_curves))