def get_closes(tickers, start_date=None, end_date=None, freq=None): closes = pd.DataFrame(columns=tickers, index=web.YahooDailyReader(tickers[0], start=start_date, end=end_date , interval=freq).read().index) for ticker in tickers: df = web.YahooDailyReader(symbols=ticker, start=start_date, end=end_date, interval=freq).read() closes[ticker] = df['Adj Close'] closes.index_name = 'Date' closes = closes.sort_index() return closes
def get_open(tickers, start_date=None, end_date=None, freq=None): open_ = pd.DataFrame(columns=tickers, index=web.YahooDailyReader(tickers[0], start=start_date, end=end_date , interval=freq).read().index) for ticker in tickers: df = web.YahooDailyReader(symbols=ticker, start=start_date, end=end_date, interval=freq).read() open_[ticker] = df['Open'] open_.index_name = 'Date' open_ = open_.sort_index() return open_
def generate_raw_prices(self, interval): '''Function for generating raw price time series from a given specified interval.''' history = data.YahooDailyReader(self.ticker, self.start, self.end, interval=interval) return history.read()
def getStockData(stockCode, start='', end=''): # 수집 기간 if start == '': start = dt.datetime(2007, 1, 1) else: start = dt.datetime.strptime(start, '%Y-%m-%d') if end == '': end = dt.date.today() else: end = dt.datetime.strptime(end, '%Y-%m-%d') stock = pd.DataFrame() for i in range(0, 10): try: stock = web.YahooDailyReader(stockCode, start, end, adjust_price=True).read() except: print("%s not collected (%d)" % (stockCode, i + 1)) if not stock.empty: break if stock.empty: print("%s not collected" % stockCode) # 수정주가 비율은 이미 적용되었으므로 제거한다 stock = stock.drop('Adj_Ratio', 1) # Volume이 0 인 경우가 있으므로, 이를 제거한다 stock = stock.drop(stock[stock.Volume < 10].index) return stock
def get_historical_closes(ticker, start_date, end_date=None): closes = web.YahooDailyReader(ticker, start_date, end_date).read() #closes = web.YahooDailyReader(symbols=ticker, start=start_date, end=end_date).read() #closes.set_axis(closes.loc['date',:,ticker[0]].values, axis=1, inplace=True) #closes = closes.loc['adjclose'].sort_index().dropna() #closes = pd.DataFrame(np.array(closes.as_matrix(), dtype=np.float64), columns=ticker, index=closes.index) #closes.index.name = 'Date' return pd.DataFrame(closes.loc[:, 'Adj Close'])
def get_closes(tickers, start_date=None, end_date=None, freq=None): # Fecha inicio por defecto (start_date='2010-01-01') y fecha fin por defecto (end_date=today) # Frecuencia de muestreo por defecto (freq='d') # Importamos paquetes necesarios import pandas as pd pd.core.common.is_list_like = pd.api.types.is_list_like import pandas_datareader.data as web # Creamos DataFrame vacío de precios, con el índice de las fechas closes = pd.DataFrame(columns=tickers, index=web.YahooDailyReader( symbols=tickers[0], start=start_date, end=end_date, interval=freq).read().index) # Agregamos cada uno de los precios con YahooDailyReader for ticker in tickers: df = web.YahooDailyReader(symbols=ticker, start=start_date, end=end_date, interval=freq).read() closes[ticker] = df['Adj Close'] closes.index_name = 'Date' closes = closes.sort_index() return closes
def get_prices(tickers, ventana): import pandas as pd import pandas_datareader.data as web import pickle import datetime today = datetime.date.today() #ventana = 365*1 inicio = today - datetime.timedelta(ventana) try: # Load file from pickle infile = open(indx + '.pkl', 'rb') historicos = pickle.load(infile) infile.close() tickers = list(historicos.keys()) closes = pd.DataFrame(columns=tickers) for ticker in tickers: closes[ticker] = historicos[ticker]['Adj Close'] print('Load succesful') except: # download from yahoo while (today.weekday() > 4): today = today - datetime.timedelta(1) closes = pd.DataFrame( columns=tickers ) #, index=web.YahooDailyReader(symbols=tickers[0], start=inicio, end=today, interval='d').read().index) historicos = {} i = 0 for ticker in tickers: try: df = web.YahooDailyReader(symbols=ticker, start=inicio, end=today, interval='d').read() historicos[ticker] = df closes[ticker] = df['Adj Close'] i += 1 print(ticker, ' downloaded') except: pass print("Downloaded {} of {} succesfully".format(i, len(tickers))) closes.index_name = 'Date' closes = closes.sort_index() closes = closes.dropna(axis=1) outfile = open(indx + '.pkl', 'wb') pickle.dump(historicos, outfile) outfile.close() tickers = list(historicos.keys()) return historicos, closes, tickers
def getStockDataYahoo(stockCode, start='', end=''): # 수집 기간 if start == '': start = dt.datetime(2007, 1, 1) else: start = dt.datetime.strptime(start, '%Y-%m-%d') if end == '': end = dt.date.today() else: end = dt.datetime.strptime(end, '%Y-%m-%d') stock = pd.DataFrame() # Yahoo site로 부터 주가 데이터를 수집한다. 가끔 안들어올 때가 있어서 10번 시도한다. for i in range(0, 10): try: # 수정 주가로 환산하여 읽어온다 stock = web.YahooDailyReader(stockCode, start, end, adjust_price=True).read() except: print("%s not collected (%d)" % (stockCode, i + 1)) if not stock.empty: break if stock.empty: print("%s not collected" % stockCode) # 수정주가 비율은 이미 적용되었으므로 제거한다 stock = stock.drop('Adj_Ratio', 1) # Volume이 0 인 경우가 있으므로, 이를 제거한다 stock = stock.drop(stock[stock.Volume < 10].index) # 데이터에 NA 값이 있으면 제거한다 stock = stock.dropna() # 수집한 데이터를 파일에 저장한다. stock.to_csv('StockData/' + stockCode[0:6] + '.csv', date_format='%Y-%m-%d') print("%s 데이터를 수집하였습니다. (rows = %d)" % (stockCode, len(stock))) return stock
def get_historical_closes(ticker, start_date, end_date=None): # Packages import pandas_datareader.data as web import pandas as pd import numpy as np #closes = web.DataReader(name=ticker, data_source='yahoo', start=start_date, end=end_date).sort_index('major_axis') closes = web.YahooDailyReader(symbols=ticker, start=start_date, end=end_date).read() closes.set_axis(closes.loc['date', :, ticker[0]].values, axis=1, inplace=True) closes = closes.loc['adjclose'].sort_index().dropna() closes = pd.DataFrame(np.array(closes.as_matrix(), dtype=np.float64), columns=ticker, index=closes.index) closes.index.name = 'Date' #return closes.loc['Adj Close'] return closes
def getStockDataYahooTwoYr(stockCode, start='', end=''): # 수집 기간 if start == '': today = dt.datetime.today() time_delta = dt.timedelta(days=730) firstday = (today - time_delta).replace(day=1) start = dt.datetime.strftime(firstday, "%Y-%m-%d") else: start = dt.datetime.strptime(start, '%Y-%m-%d') if end == '': end = dt.date.today() else: end = dt.datetime.strptime(end, '%Y-%m-%d') stock = pd.DataFrame() for i in range(0, 2): try: stock = web.YahooDailyReader(stockCode, start, end, adjust_price=True).read() except: print("%s not collected (%d)" % (stockCode, i + 1)) if not stock.empty: # 수정주가 비율은 이미 적용되었으므로 제거한다 stock = stock.drop('Adj_Ratio', 1) # Volume이 0 인 경우가 있으므로, 이를 제거한다 # stock = stock.drop(stock[stock.Volume < 10].index) stock = stock.drop(stock[stock.Volume < 10000].index) # 수집한 데이터를 파일에 저장한다. break if stock.empty: print("%s not collected" % stockCode) return stock
def f_stats_mad(datos): """ Parameters ---------- datos : pandas.DataFrame : dataframe con transacciones ejecutadas después de tiempos y pips Returns ------- datos : pandas.DataFrame : dataframe con rendimientos logarítmicos. Tomando en cuenta que se inicializa con una cuenta de $5,000 Debugging --------- datos = 'f_leer_archivo("archivo_tradeview_1.csv") """ profit_d = f_profit_diario(datos) # Sharpe ratio rend_log = np.log(profit_d.profit_acm_d[1:].values / profit_d.profit_acm_d[:-1].values) rf = 0.08 / 300 mar = 0.3 / 300 # Sortino compra # Numerador s_buy = (f_profit_diario(datos[datos['type'] == 'buy'])) rend_log_b = np.log(s_buy.profit_acm_d[1:].values / s_buy.profit_acm_d[:-1].values) # Denominador tdd_sb = rend_log_b - mar tdd_sb[tdd_sb > 0] = 0 # Final sortino_b = (rend_log_b.mean() - mar) / (((tdd_sb * 2).mean()) * 0.5) # Sortino venta # Numerador s_sell = (f_profit_diario(datos[datos['type'] == 'sell'])) rend_log_s = np.log(s_sell.profit_acm_d[1:].values / s_sell.profit_acm_d[:-1].values) # Denominador tdd_ss = rend_log_s - mar tdd_ss[tdd_ss > 0] = 0 # Final sortino_s = (rend_log_s.mean() - mar) / ((tdd_ss * 2).mean()) * 0.5 # Drawdown where_row = profit_d.loc[profit_d['profit_acm_d'] == profit_d.profit_acm_d.min()] where_position = where_row.index.tolist() prev_where = profit_d.loc[0:where_position[0]] where_max_prev = profit_d.loc[profit_d['profit_acm_d'] == prev_where.profit_acm_d.max()] where_min_prev = profit_d.loc[profit_d['profit_acm_d'] == prev_where.profit_acm_d.min()] max_dd = where_max_prev.iloc[0]['profit_acm_d'] min_dd = where_min_prev.iloc[0]['profit_acm_d'] dd = max_dd - min_dd fecha_i_dd = where_max_prev.iloc[0]['timestamp'] fecha_f_dd = where_min_prev.iloc[0]['timestamp'] drawdown = "{}, {}, ${:.2f}".format(fecha_i_dd, fecha_f_dd, dd) # Drawup where_row_up = profit_d.loc[profit_d['profit_acm_d'] == profit_d.profit_acm_d.max()] where_position_up = where_row_up.index.tolist() foll_where = profit_d.loc[0:where_position_up[0]] where_max_foll = profit_d.loc[profit_d['profit_acm_d'] == foll_where.profit_acm_d.max()] where_min_foll = profit_d.loc[profit_d['profit_acm_d'] == foll_where.profit_acm_d.min()] max_du = where_max_foll.iloc[0]['profit_acm_d'] min_du = where_min_foll.iloc[0]['profit_acm_d'] du = max_du - min_du fecha_f_du = where_max_foll.iloc[0]['timestamp'] fecha_i_du = where_min_foll.iloc[0]['timestamp'] drawup = "{}, {}, ${:.2f}".format(fecha_i_du, fecha_f_du, du) # Information Ratio benchmark_original = pd.DataFrame( web.YahooDailyReader('^GSPC', profit_d['timestamp'].min(), profit_d['timestamp'].max(), interval='d').read()['Adj Close']) # Ajustar fechas como columna en el dataframe benchmark = benchmark_original.reset_index() # Agregar columna de los rendimientos logarítmicos de los precios de Cierre Ajustado del SP500 benchmark['rend_log'] = pd.DataFrame( np.log(benchmark['Adj Close'][1:].values / benchmark['Adj Close'][:-1].values)) # Juntar el dataframe de profits con el benchmark en uno solo bench_merge = profit_d.merge(benchmark, left_on='timestamp', right_on='Date') # Recorrer los valores de los rendimientos logarítmicos una posición abajo y llenar con 0 bench_merge['rend_log'] = bench_merge['rend_log'].shift(1, fill_value=0) # Cálculo de rendimientos logarítmicos de los profit_acm_d rend_log_profit = pd.DataFrame( np.log(bench_merge.profit_acm_d[1:].values / bench_merge.profit_acm_d[:-1].values)) # rend_log_profit = rend_log_profit.shift(1, fill_value = 0) # Agregar la columna de rendimientos de profit_acm_d bench_merge.insert(3, column='rend_log_profit', value=rend_log_profit) # Recorrer una fila hacia abajo los rendimientos en el dataframe bench_merge['rend_log_profit'] = bench_merge['rend_log_profit'].shift( 1, fill_value=0) # Numerador Information Ratio # Promedio de rendimientos del profit_acm_d profit_prom = bench_merge['rend_log_profit'].mean() # Promedio de rendimientos del SP500 bench_prom = bench_merge['rend_log'].mean() # Numerador del information ratio = diferencia de los dos anteriores num_ir = profit_prom - bench_prom # Denominador Information Ratio # Diferencia por rows de los rendimientos del profit_acm_d y del SP500 dif_denom = bench_merge['rend_log_profit'] - bench_merge['rend_log'] # Desviación estándar de la diferencia denom_ir = dif_denom.std() # Cálculo del ratio info_ratio = num_ir / denom_ir # Métricas metrica = pd.DataFrame({ 'métricas': [ 'sharpe', 'sortino_b', 'sortino_s', 'drawdown_cap_b', 'drawdown_cap_s', 'information_r' ] }) valor = pd.DataFrame({ 'valor': [((rend_log.mean() - rf) / rend_log.std()), (sortino_b), (sortino_s), (drawdown), (drawup), (info_ratio)] }) df_mad1 = pd.merge(metrica, valor, left_index=True, right_index=True) descripcion = pd.DataFrame({ 'descripción': [ 'Sharpe Ratio', 'Sortino Ratio para Posiciones de Compra', 'Sortino Ratio para Posiciones de Venta', 'DrawDown de Capital', 'DrawUp de Capital', 'Information Ratio' ] }) df_MAD = pd.merge(df_mad1, descripcion, left_index=True, right_index=True) # convert_dict = {'valor': float} # df_MAD = df_MAD.astype(convert_dict) return df_MAD
aapl_qua = web.DataReader(ticker, source, start, end) aapl_qua # Ejemplo iex ticker = 'AAPL' source = 'iex' start = '2015-01-01' end = '2017-12-31' aapl_iex = web.DataReader(ticker, source, start, end) aapl_iex # YahooDailyReader ticker = 'AAPL' start = '2015-01-01' end = '2017-12-31' aapl_yah = web.YahooDailyReader(ticker, start, end, intervals='d'.read()) aapl_yah #%% # Función para descargar precios de cierre ajustados de varios activos a la vez: def get_closes(tickers, start_date=None, end_date=None, freq=None): # Fecha inicio por defecto (start_date='2010-01-01') y fecha fin por defecto (end_date=today) # Frecuencia de muestreo por defecto (freq='d') # Importamos paquetes necesarios import pandas as pd pd.core.common.is_list_like = pd.api.types.is_list_like import pandas_datareader.data as web # Creamos DataFrame vacío de precios, con el índice de las fechas closes = pd.DataFrame(columns=tickers, index=web.YahooDailyReader(
def prices_from_index(indx, ventana): import pandas as pd import requests import pandas_datareader.data as web import pickle import datetime today = datetime.date.today() # Definir el indice con el que se quiere trabajar # para mexico se usa el indice # para extrankeras se usa un ETF que represente al sector/indice deseado # Se descargaran los componentes mas importantes # indx = 'SPY' # GET TICKERS if indx == 'MXX': url = 'https://finance.yahoo.com/quote/%5E' + indx + '/components' html = requests.get(url).content df_list = pd.read_html(html) df = df_list[-1] tickers = df.Symbol.tolist() tickers = [ 'LIVEPOLC-1.MX' if x == 'LIVEPOLC1.MX' else x for x in tickers ] tickers = ['PE&OLES.MX' if x == 'PEOLES.MX' else x for x in tickers] tickers = ['KOFUBL.MX' if x == 'KOFL.MX' else x for x in tickers] tickers.insert(0, 'WALMEX.MX') tickers.insert(0, 'BACHOCO.MX') tickers.insert(0, 'AEROMEX.MX') tickers.insert(0, 'VOLARA.MX') tickers.insert(0, 'AZTECACPO.MX') tickers.insert(0, 'LALAB.MX') tickers.insert(0, 'CHDRAUIB.MX') tickers.insert(0, '^' + indx) else: url = 'https://www.marketwatch.com/investing/fund/' + indx + '/holdings' html = requests.get(url).content df_list = pd.read_html(html) df = df_list[-1] tickers = df.Symbol.dropna().tolist() tickers.insert(0, indx) # GET PRICES inicio = today - datetime.timedelta(ventana) try: # Load file from pickle infile = open(indx + '.pkl', 'rb') historicos = pickle.load(infile) infile.close() tickers = list(historicos.keys()) closes = pd.DataFrame(columns=tickers) for ticker in tickers: closes[ticker] = historicos[ticker]['Adj Close'] print('Load succesful') except: # download from yahoo while (today.weekday() > 4): today = today - datetime.timedelta(1) closes = pd.DataFrame( columns=tickers ) #, index=web.YahooDailyReader(symbols=tickers[0], start=inicio, end=today, interval='d').read().index) historicos = {} i = 0 for ticker in tickers: try: df = web.YahooDailyReader(symbols=ticker, start=inicio, end=today, get_actions=True, interval='d').read() historicos[ticker] = df closes[ticker] = df['Adj Close'] i += 1 print(ticker, ' downloaded') except: print(ticker, ' not available') pass print("Downloaded {} of {} succesfully".format(i, len(tickers))) closes.index_name = 'Date' closes = closes.sort_index() closes = closes.dropna(axis=1) outfile = open(indx + '.pkl', 'wb') pickle.dump(historicos, outfile) outfile.close() tickers = list(historicos.keys()) return tickers, historicos, closes
def update_prices(indx, ventana): import pickle import datetime import pandas as pd import pandas_datareader.data as web today = datetime.date.today() while (today.weekday() > 4): today = today - datetime.timedelta(1) # Cargar datos infile = open(indx + '.pkl', 'rb') historicos = pickle.load(infile) tickers = list(historicos.keys()) closes = pd.DataFrame(columns=tickers) #closes = pd.DataFrame(columns = tickers) #indx = 'MXX' first_date = min([historicos[ticker].index[0] for ticker in tickers]) inicio = today - datetime.timedelta(ventana) if inicio < first_date: closes = pd.DataFrame(columns=tickers) historicos = {} i = 0 for ticker in tickers: try: df = web.YahooDailyReader(symbols=ticker, start=inicio, end=today, get_actions=True, interval='d').read() historicos[ticker] = df closes[ticker] = df['Adj Close'] i += 1 print(ticker, ' downloaded') except: print(ticker, ' not available') pass print("Downloaded {} of {} succesfully".format(i, len(tickers))) closes.index_name = 'Date' closes = closes.sort_index() closes = closes.dropna(axis=1) outfile = open(indx + '.pkl', 'wb') pickle.dump(historicos, outfile) outfile.close() tickers = list(historicos.keys()) last_date = max([historicos[ticker].index[-1] for ticker in tickers]) if today > last_date: print('Updating data') closes = pd.DataFrame(columns=tickers) i = 0 for ticker in tickers: try: df = web.YahooDailyReader(symbols=ticker, start=last_date + datetime.timedelta(1), end=today, get_actions=True, interval='d').read() historicos[ticker] = historicos[ticker].append(df) closes[ticker] = historicos[ticker]['Adj Close'] i += 1 print(ticker, ' downloaded') except: print(ticker, ' not available') pass # Guardar de nuevo closes.index_name = 'Date' closes = closes.sort_index() closes = closes.dropna(axis=1) outfile = open(indx + '.pkl', 'wb') pickle.dump(historicos, outfile) outfile.close() tickers = list(historicos.keys()) else: for ticker in tickers: closes[ticker] = historicos[ticker]['Adj Close'] return tickers, historicos, closes