Exemplo n.º 1
0
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']]
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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