예제 #1
0
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
        ]
예제 #4
0
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)
예제 #5
0
"""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)


예제 #6
0
 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))
예제 #8
0
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]