Exemplo n.º 1
0
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
Exemplo n.º 2
0
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_
Exemplo n.º 3
0
 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()
Exemplo n.º 4
0
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
Exemplo n.º 5
0
 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'])
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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(
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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