monte_runs = 1000 for want_rho in np.arange(-0.8, 0.8, 0.1): for want_sharpe in [0.0, 0.5, 1.0, 2.0]: for want_stdev in [1.0]: for want_skew in [-2.0, -1.0, 0.0, 0.5, 1.0]: want_mean = want_stdev * want_sharpe / 16.0 ## autocorrelation introduces biases (adj_want_mean, adj_want_skew, adj_want_stdev) = adj_moments_for_rho(want_rho, want_mean, want_skew, want_stdev) manyans = [ autocorr_skewed_returns(want_rho, adj_want_mean, adj_want_stdev, adj_want_skew) for notused in range(monte_runs) ] sample_mean = np.mean([np.mean(x) for x in manyans]) sample_std = np.mean([np.std(x) for x in manyans]) sample_skew = np.mean([st.skew(x) for x in manyans]) sample_rho = np.mean([autocorr(x) for x in manyans]) print "****************************" print "Mean, wanted %.2f got %.6f" % (want_mean, sample_mean) print "Stdev, wanted %.2f got %.4f" % (want_stdev, sample_std) print "Skew, wanted %.2f got %.4f" % (want_skew, sample_skew) print "Rho, wanted %.2f got %.4f" % (want_rho, sample_rho)
want_skew=0.0 want_Sharpes=[0.5, 1.0] length_period_years=20 # calculations length_period=length_period_years*DAYS_IN_YEAR want_ann_stdev=0.2 want_ann_mean=[ann_SR*want_ann_stdev for ann_SR in want_Sharpes] want_mean_list=[this_ann_mean/DAYS_IN_YEAR for this_ann_mean in want_ann_mean] want_stdev=want_ann_stdev/ROOT_DAYS_IN_YEAR happywithcurve=False while not happywithcurve: ## generate a new Curve equitycurves=[arbitrary_timeseries(autocorr_skewed_returns(rho, want_mean, want_stdev, want_skew, size=length_period), index_start=pd.datetime(1995,1,1)) for want_mean in want_mean_list] equitycurves_pd=pd.concat(equitycurves, axis=1) equitycurves_pd.columns=["A", "B"] equitycurves_pd.cumsum().plot() show() ans=raw_input("Happy with this? Y / N? ") if ans=="Y": happywithcurve=True sliced_data=slices_for_ts(equitycurves[0]) start_point=sliced_data[0] for idx in range(len(sliced_data))[1:]: sliced_curves=[eq_curve[start_point:sliced_data[idx]] for eq_curve in equitycurves] equitycurves_pd=pd.concat(sliced_curves, axis=1)
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 ]
"""This code verifies that the single frequency method for generating returns with a given distribution skew, autocorrelation; all works... """ monte_runs=1000 for want_rho in np.arange(-0.8, 0.8, 0.1): for want_sharpe in [0.0, 0.5, 1.0, 2.0]: for want_stdev in [1.0]: for want_skew in [-2.0, -1.0, 0.0, 0.5, 1.0]: want_mean=want_stdev*want_sharpe/16.0 ## autocorrelation introduces biases (adj_want_mean, adj_want_skew, adj_want_stdev)=adj_moments_for_rho(want_rho, want_mean, want_skew, want_stdev) manyans=[autocorr_skewed_returns(want_rho, adj_want_mean, adj_want_stdev, adj_want_skew) for notused in range(monte_runs)] sample_mean=np.mean([np.mean(x) for x in manyans]) sample_std=np.mean([np.std(x) for x in manyans]) sample_skew=np.mean([st.skew(x) for x in manyans]) sample_rho=np.mean([autocorr(x) for x in manyans]) print "****************************" print "Mean, wanted %.2f got %.6f" % (want_mean, sample_mean) print "Stdev, wanted %.2f got %.4f" % (want_stdev, sample_std) print "Skew, wanted %.2f got %.4f" % (want_skew, sample_skew) print "Rho, wanted %.2f got %.4f" % (want_rho, sample_rho)
print "Scenario:" print scenario (notUsed, want_mean, want_stdev, want_skew, want_rho)=scenario (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)]))
(notUsed, want_mean, want_stdev, want_skew, want_rho) = scenario (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))
length_period = length_period_years * DAYS_IN_YEAR want_ann_stdev = 0.2 want_ann_mean = [ann_SR * want_ann_stdev for ann_SR in want_Sharpes] want_mean_list = [ this_ann_mean / DAYS_IN_YEAR for this_ann_mean in want_ann_mean ] want_stdev = want_ann_stdev / ROOT_DAYS_IN_YEAR happywithcurve = False while not happywithcurve: ## generate a new Curve equitycurves = [ arbitrary_timeseries(autocorr_skewed_returns(rho, want_mean, want_stdev, want_skew, size=length_period), index_start=pd.datetime(1995, 1, 1)) for want_mean in want_mean_list ] equitycurves_pd = pd.concat(equitycurves, axis=1) equitycurves_pd.columns = ["A", "B"] equitycurves_pd.cumsum().plot() show() ans = raw_input("Happy with this? Y / N? ") if ans == "Y": happywithcurve = True sliced_data = slices_for_ts(equitycurves[0]) start_point = sliced_data[0]