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)
from security_data import SecurityData from account_manager import AccountManager from account_metrics import AccountMetrics ''' This file sets up a new account for the following trading strategy: Invest a fixed amount (e.g. 100) of fund into each security where eq>75, arm>90, and rv>50. Only hold those stocks. At the end of each month, replace the stocks in the account by investing a fixed amount (e.g., 100) of fund into new stocks that have the above signals. ''' if __name__=='__main__': con = sqlite3.connect('qse_test.db') security_data = SecurityData(con) account_manager = AccountManager(con) account_metrics = AccountMetrics(con) dates = security_data.get_dates() new_id=account_manager.new_account() #print new_id rows=[] def signal_selection(eq,arm,rv): if eq>75 and arm>90 and rv>50: return True else: return False for d in dates: signals = security_data.get_security_signals(d, signal_selection) security_ids = [s[0] for s in signals] for id in security_ids: