def action(file_list, ini_list): for sector, portfolio_list in prep(*ini_list): portfolio_list = pd.DataFrame(portfolio_list) logging.debug(portfolio_list) logging.info(sector) ret = {} for key, data in HELPER.partition(portfolio_list): results = HELPER.transform(key, data) logging.info(results) key_list = sorted(results) value_list = map(lambda x: results[x], key_list) key_list = map(lambda x: "{}_{}".format(sector, x), key_list) results = dict(zip(key_list, value_list)) ret.update(results) yield sector, ret
def load(file_list, value_list): ret = {} for name, data in STOCK_TIMESERIES.read(file_list, value_list): if len(data) < 7 * FINANCE.YEAR: logging.info( "{} of length {} rejected for being less than {}".format( name, len(data), 7 * FINANCE.YEAR)) continue data = MONTECARLO.find(data['Adj Close'], period=FINANCE.YEAR) #filter stocks that have less than a year sharpe = data.get('sharpe', 0) if sharpe == 0: continue #filter stocks that have negative returns returns = data.get('returns', 0) if returns <= 0: logging.info( "{} of returns {} rejected for being unprofitable".format( name, returns)) continue key_list = data.keys() value_list = map(lambda x: data[x], key_list) value_list = map(lambda x: round(x, 2), value_list) msg = dict(zip(key_list, value_list)) logging.info((name, msg)) ret[name] = data return ret
def getSharpe(cls, stock_list, data): ret = map(lambda d: SHARPE.find(data[d], period=FINANCE.YEAR), stock_list) ret = dict(zip(stock_list, ret)) ret = pd.DataFrame(ret).T logging.info(ret.head(3)) logging.info(ret.tail(3)) return ret
def prototype(file_list, stock_list): name_list, _ret = load(file_list, stock_list) ret = FINANCE.graphDailyReturns(_ret) value_list = map(lambda x: _ret[x], name_list) value_list = map(lambda data: data.sort_index(inplace=True), value_list) value_list = map( lambda data: MONTECARLO.find( data, risk_free_rate=0.02, period=FINANCE.YEAR, span=0), value_list) sharpe = dict(zip(name_list, value_list)) return name_list, ret, sharpe
def is_stock_invalid(cls, name, data) : ret = MONTECARLO.find(data['Adj Close'], period=FINANCE.YEAR) sharpe = ret.get('sharpe',0) if sharpe <= 1.01 : logging.info("{} of sharpe ratio {} rejected for being less stable than SPY".format(name,sharpe)) return True, None returns = ret.get('returns',0) if returns <= 0.04 : logging.info("{} of returns {} rejected for being less profitable than bonds".format(name,returns)) return True, None return False, ret
def process(file_list, value_list): ret = {} for name, data in STOCK_TIMESERIES.read(file_list, value_list): data.sort_index(inplace=True) data = data['Adj Close'] data = MONTECARLO.find(data, risk_free_rate=0.02, period=FINANCE.YEAR, span=0) # filter stocks that have less than a year sharpe = data.get('sharpe', 0) if sharpe == 0: continue ret[name] = data return ret
def load(file_list, value_list): ret = {} for name, data in STOCK_TIMESERIES.read(file_list, value_list): data = MONTECARLO.find(data['Adj Close'], period=FINANCE.YEAR) #filter stocks that have less than a year sharpe = data.get('sharpe', 0) if sharpe == 0: continue #filter stocks that have negative returns returns = data.get('returns', 0) if returns <= 0: continue key_list = data.keys() value_list = map(lambda x: data[x], key_list) value_list = map(lambda x: round(x, 2), value_list) msg = dict(zip(key_list, value_list)) logging.info((name, msg)) ret[name] = data return ret
def main(stock_list): name, spy_data, file_list = prep() annual = MONTECARLO.YEAR() _ret, _dev, _sharpe, _length = annual.single(spy_data['Adj Close']) logging.info("{} return {}, dev {}, sharpe {} length {}".format( name, _ret, _dev, _sharpe, _length)) perf_list = init(*ini_list) for name, data in action(perf_list): ret, dev, sharpe, length = annual.single(data['Adj Close']) flag_long = length > 250 flag_stable = dev < 3 * _dev flag_profit = ret > _ret flag_sharpe = sharpe > _sharpe if flag_long and flag_stable and flag_profit and flag_sharpe: logging.info("{} return {}, dev {}, sharpe {}, length {}".format( name, ret, dev, sharpe, length)) del data
def demo_sharpe(data, path): pt_list = map(lambda name: "legend_" + name, ticker_list) pt_list = list(pt_list) labels = dict(zip(ticker_list, pt_list)) labels['^GSPC'] = 'SNP500' logging.info(type(data)) _data = map( lambda stock: MONTECARLO.find( data[stock], span=2 * FINANCE.YEAR, period=FINANCE.YEAR), data) _data = list(_data) data = dict(zip(ticker_list, _data)) data = pd.DataFrame(data, columns=ticker_list) logging.debug(data) POINT.plot(data, labels=labels, x='risk', y='returns', ylabel="Returns", xlabel="Risk", title="Sharpe Ratio", alpha=0.3) save(path, loc="lower right")