def simulate(start, end, symbols, weights, data_path) : import pandas as pd # check data available, refresh if necessary get_history(symbols, start, end, data_path) pdata = pd.Panel(dict((symbols[i], pd.read_csv(data_path + symbols[i] + '.csv',\ index_col='Date', parse_dates=True).sort(ascending=True)) for i in range(len(symbols))) ) starting_cash = 1000000 # create empty dataframe with index = dates start-end df = pd.DataFrame(index=pdata.major_axis).ix[start:end] for i in range(len(symbols)): ticker = symbols[i] allocation = weights[i] df[ticker] = pdata[ticker]['Adj Close'] df[ticker + ' C'] = df[ticker] / df[ticker][0] df[ticker + ' C'][0] = 1. df[ticker + ' I'] = 0. df[ticker + ' I'][0] = starting_cash * allocation df[ticker + ' I'] = [df[ticker + ' C'][j] * df[ticker + ' I'][0] for j in range(len(df))] df['Total'] =pd.DataFrame([df[ticker + ' I'] for ticker in symbols]).sum() df['Daily Rets'] = df.Total / df.Total.shift(1) - 1 return df[['Daily Rets', 'Total']]
def analyze(values, data_path, index_ticker='SPY', p_print='No'): import pandas as pd from finlib.get_history import get_history from math import sqrt idx_ticker = index_ticker values = values start = values.index.min() end = values.index.max() market_index = get_history([idx_ticker], start, end, data_path).ix[:,:,'Adj Close'] market_index['d_rets'] = market_index[idx_ticker] / market_index[idx_ticker].shift(1) - 1 values['d_rets'] = values['Total'] / values['Total'].shift(1) - 1 metrics = [''] * 8 metrics[0] = values['d_rets'].mean() metrics[4] = market_index['d_rets'].mean() metrics[1] = values['d_rets'].std() * sqrt(252) metrics[5] = market_index['d_rets'].std() * sqrt(252) metrics[2] = sqrt(len(values['d_rets'])) * values['d_rets'].mean() / values['d_rets'].std() metrics[6] = sqrt(len(market_index['d_rets'])) * market_index['d_rets'].mean() / market_index['d_rets'].std() metrics[3] = values['Total'][-1] / values['Total'][0] metrics[7] = market_index['SPY'][-1] / market_index['SPY'][0] if p_print == 'Yes': print '\nPortfolio Metrics' print '#################\n' print 'Date Range: ', start , 'to', end print print 'Final Value of Portfolio: ', "{0:,.2f}".format(values['Total'][-1]) print print 'Sharpe Ratio: ', metrics[2] print 'Index Sharpe Ratio: ', metrics[6] print print 'Period Return: ', "{0:.3f}".format(metrics[3] * 100), '%' print 'Index Period Return: ', "{0:.3f}".format(metrics[7] * 100), '%' print print 'Period Volatilty: ', "{0:.2f}".format(metrics[1]), '%' print 'Period Index Volatility: ', "{0:.2f}".format(metrics[5]), '%' print print 'Average Daily Return :', "{0:.3f}".format(metrics[0] * 100), '%' print 'Index Average Daily Return :', "{0:.3f}".format(metrics[4] * 100), '%' return metrics
def marketsim(starting_cash, orders, data_path): import datetime as dt import pandas as pd import pandas.io.data as web from finlib.get_history import get_history symbols = list(set(orders.symbol)) startday = min(orders.index) endday= max(orders.index) raw_data = get_history(symbols, startday, endday, data_path) prices = raw_data.ix[:,:,'Adj Close'] # empty dfs for holdings and port_value holdings = pd.DataFrame(0, columns=symbols, index=prices.index) port_value = pd.DataFrame(0, columns=['Cash', 'Value', 'Total'], index=prices.index) for i in range(len(orders)): if orders.ix[i]['action'] == 'Buy': holdings.ix[orders.index[i]][orders.symbol[i]] += orders['qty'][i] port_value.ix[orders.index[i]]['Cash'] -= orders['qty'][i] * prices.ix[orders.index[i]][orders.symbol[i]] elif orders.ix[i]['action'] == 'Sell': holdings.ix[orders.index[i]][orders.symbol[i]] -= orders['qty'][i] port_value.ix[orders.index[i]]['Cash'] += orders['qty'][i] * prices.ix[orders.index[i]][orders.symbol[i]] else: print 'Bad order' raise port_value['Cash'][0] += starting_cash port_value = port_value.cumsum() holdings = holdings.cumsum() port_value['Value'] = (prices * holdings).sum(axis=1) port_value['Total'] = port_value.sum(axis=1) return port_value