class AccountMetrics: def __init__(self,con): self.account_manager=AccountManager(con) self.security_data=SecurityData(con) def compare_vs_sharpe(self, acct1, acct2, acct2_vals): #acct1=S&P500 (unless comparing against S&P 500, where acct1=4% fixed rate); acct2=strategy acct1_returns = self.all_returns(acct1) acct2_returns = self.all_returns(acct2) acct1_total = sum(acct1_returns) acct2_total = sum(acct2_returns) stdev_val = stdev(acct2_vals) sharpe = (acct2_total - acct1_total) / stdev_val return sharpe def month_returns(self,account_id,as_of_date): my_stocks=self.account_manager.get_holdings(account_id,as_of_date) stock_ids=[ h[0] for h in my_stocks ] stock_returns=self.security_data.get_returns(stock_ids,as_of_date) my_value=0 my_base=0 for i in range(len(my_stocks)): if stock_returns[i] is not None: my_value=my_value+my_stocks[i][1]*(1+stock_returns[i]) else: my_value=my_value+my_stocks[i][1] my_base=my_base+my_stocks[i][1] return (my_value - my_base) def all_returns(self,account_id): dates=self.security_data.get_dates() annual=[] for d in dates: month=self.month_returns(account_id,d) annual.append(month) return annual def show_stats(self,vals): mean_val=mean(vals); variance_val=variance(vals) stdev_val=stdev(vals) mdd_val=mdd(vals) print("Average Return: %s" %mean_val) #print("The variance: %s" %variance_val) #print("The stdev: %s" %stdev_val) print("Maximum drawdown: %s" %mdd_val)
for d in dates: sp500_ids=security_data.get_sp500(d) if len(sp500_ids)<500: print("Warning! There are only %s securities on %s" %(len(sp500_ids), d)) for id in sp500_ids: row=[new_id, id, 100, d] rows.append(row) account_manager.add_holdings(rows) account_manager.add_account(new_id,0,"Invest 100 each month in stocks in the SP500 index") all_acct=account_manager.get_accounts() print "... All Accounts ..." pprint(all_acct) print stocks_071231=account_manager.get_holdings(new_id,"2007-12-31") num=len(stocks_071231) print("The number of stocks in the account %s is %s on 2007-12-31" %(new_id,num)) #### Show performance metrics for the new account #### rslt=account_metrics.all_returns(new_id) total=sum(rslt) up_months = 0 down_months = 0 for result in rslt: if result > 0: up_months += 1 else: down_months += 1 print("Account %s Monthly Returns: " %new_id)