Beispiel #1
0
    def _find(cls, data, stocks, num_portfolios, risk_free_rate, period):
        data.sort_index(inplace=True)
        returns = FINANCE.findDailyReturns(data)

        #set up array to hold results
        #We have increased the size of the array to hold the weight values for each stock
        size = len(stocks)
        ret = np.zeros((3 + size, num_portfolios))

        #calculate mean daily return and covariance of daily returns
        mean = returns.mean()
        cov_matrix = returns.cov()
        for weights, i in cls._weights(size, num_portfolios):
            returns, risk, sharpe = cls._sharpe(cov_matrix, mean, period,
                                                risk_free_rate, weights)
            #store results in results array
            ret[0, i] = returns
            ret[1, i] = risk
            ret[2, i] = sharpe
            for j in range(len(weights)):
                ret[j + 3, i] = weights[j]

        #convert results array to Pandas DataFrame
        columns = cls.columns + stocks
        ret = pd.DataFrame(ret.T, columns=columns)
        logging.info(ret.head(3))
        logging.info(ret.tail(3))
        return ret
Beispiel #2
0
 def transformReturns(cls, returns) :
     ret = FINANCE.findDailyReturns(returns)
     mean = ret.mean()
     cov_matrix = ret.cov()
     #logging.info(cov_matrix)
     #logging.info(ret)
     #logging.info(mean)
     return ret, mean, cov_matrix
Beispiel #3
0
 def t01(cls, baseline, test):
     baseline = baseline.reindex(test.index)
     test = FINANCE.findDailyReturns(baseline)
     ret = test / baseline
     ret = ret.replace([np.inf, -np.inf], np.nan)
     ret = ret.fillna(0)
     ret = ret.dropna(how='all')
     return ret
Beispiel #4
0
 def test_04_(self) :
     msg = {}
     for stock, ret in T.extract() :
         daily = HELPER.findDailyReturns(ret)
         _risk, _returns = HELPER.findRiskAndReturn(daily, period=HELPER.YEAR)
         value = [_returns,_risk,_returns/_risk]
         value = dict(zip(['returns','risk','sharpe'],value))
         msg[stock] = value
     msg = pd.DataFrame(msg).T
     logging.info(msg)
def main(file_list, portfolio_ini, ini_list):
    local_enrich = enrich(*ini_list)
    bench_list = benchmark(*ini_list)

    SNP = 'SNP500'
    snp = bench_list[SNP]
    gcps = snp[0]
    name_list, snp_returns, snp_sharpe = prototype(file_list, snp)
    snp_returns.rename(columns={gcps: SNP}, inplace=True)

    FUNDS = 'NASDAQMUTFUND'
    funds = bench_list[FUNDS]
    fund_name_list, fund_returns, fund_sharpe = prototype(file_list, funds)

    portfolio_list = prep(*portfolio_ini)
    portfolio_list = pd.DataFrame(portfolio_list.values())
    portfolio_list = portfolio_list.sort_values(['risk'])
    logging.info(portfolio_list)
    ret_detail_list = []
    ret_name_return_list = []
    ret_summary_list = {}
    ret_diversified_list = []
    ret_name_diversified_list = []
    ret_sharpe_list = {}
    for weights, sharpe, diversified, name_diversified, name_returns in find(
            local_enrich, portfolio_list):
        stock_list = sorted(weights.index)
        name_list, ret = load(file_list, stock_list)
        ret = FINANCE.findDailyReturns(ret)
        logging.info(weights)
        logging.info(stock_list)
        logging.info(sharpe)
        portfolio_return = weights.dot(ret.T).dropna(how="all")
        ret[name_returns] = portfolio_return
        ret = 1 + ret
        ret.iloc[0] = 1  # set first day pseudo-price
        ret = ret.cumprod()
        print ret.head(2)
        print ret.tail(2)
        print name_diversified, name_returns
        ret_detail_list.append(ret)
        ret_summary_list[name_returns] = ret[name_returns]
        ret_sharpe_list[name_returns] = sharpe
        ret_diversified_list.append(diversified)
        ret_name_return_list.append(name_returns)
        ret_name_diversified_list.append(name_diversified)
    ret_summary_list[SNP] = snp_returns
    ret_sharpe_list[SNP] = snp_sharpe[gcps]
    for name in fund_name_list:
        ret_summary_list[name] = fund_returns[name]
        ret_sharpe_list[name] = fund_sharpe[name]

    return ret_detail_list, ret_name_return_list, ret_summary_list, ret_diversified_list, ret_name_diversified_list, ret_sharpe_list
Beispiel #6
0
 def by_month(cls, name, data):
     year_to_year = {}
     many_years = {}
     for month, year, dataSeries in cls.group_by_month(data):
         percent = FINANCE.findDailyReturns(dataSeries)
         if len(percent) == 0: continue
         if month not in year_to_year:
             year_to_year[month] = pd.DataFrame(percent)
         else:
             init = len(year_to_year[month])
             year_to_year[month] = year_to_year[month].append(percent)
             if init == len(year_to_year[month]):
                 raise ValueError("dataframe did not append")
         label = '{},{}-{}'.format(month, year, name)
         many_years[label] = cls.many_years(month, year, percent)
     return year_to_year, many_years
Beispiel #7
0
    def find(cls, data, **kwargs):
        target = "period"
        period = kwargs.get(target, 0)
        target = "risk_free_rate"
        risk_free_rate = kwargs.get(target, 0.02)
        target = "span"
        span = kwargs.get(target, 2 * FINANCE.YEAR)

        data, risk_free_rate, period, span = cls.validate(
            data, risk_free_rate, period, span)
        data = FINANCE.findDailyReturns(data, period)
        if data is None:
            ret = dict(zip(cls.key_list, [0, 0, 0, 0]))
            return ret
        risk, returns = FINANCE.findRiskAndReturn(data, span)
        sharpe = 0
        if risk != 0:
            sharpe = (returns - risk_free_rate) / risk
        ret = dict(zip(cls.key_list, [returns, risk, sharpe, len(data)]))
        return ret
Beispiel #8
0
 def summarizeReturns(cls, data):
     stock_list = cls.parseStockList(data)
     ret = map(lambda stock: FINANCE.findDailyReturns(data[stock]),
               stock_list)
     ret = dict(zip(stock_list, ret))
     return ret
Beispiel #9
0
 def test_01_(self) :
     for stock, ret in T.extract() :
         logging.info (stock)
         logging.info (ret.describe().round(2))
         daily = HELPER.findDailyReturns(ret)
         logging.info (daily.describe().round(2))