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
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
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
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
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
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
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
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))