Exemplo n.º 1
0
def getPreMarketChange( symbol, list_GapDate, folder_30min='/Users/yutaasano/Documents/PyCharm/StockData/HistStkPrice_30min_Russell3000_Kibot_20150912' ):
    """
    Return pre-market change for a given stock symbol for given dates
    list_GapDate is a nx3 numpy array, each row: year, month, day. It has to be sorted from old to new dates for faster process
    Pre-market change [%] is defined as (O(k_30-1) - C(k_day-1)) / C(k_day-1) * 100
    O(k_30-1): open price at 9:00
    C(k_day-1): close price at previous day's 15:30
    """

    # Check if list_GapDate is sorted
    list_GapDate_sorted = m.sortrowsByMultiCol(list_GapDate, [0,1,2], isAscending=1)
    if np.sum(np.abs(list_GapDate_sorted-list_GapDate)) != 0:
        raise ValueError('list_GapDate has to be sorted from old to new dates!')

    n_date = list_GapDate.shape[0]
    data_30min = fi.getHistStkPrice30min(symbol, folder_30min)

    t_row_GapDateInit = 0
    change_PreMarket = np.zeros((n_date))
    for k_date in range(0,n_date):
        t_GapDate = list_GapDate[k_date,:]

        # Look for a row where t_GapDate first occurs
        while t_row_GapDateInit<data_30min.shape[0]:
            t_30minDate = np.int64(data_30min[t_row_GapDateInit,0:3])
            if sum(np.abs(t_30minDate - t_GapDate)) == 0:
                break
            else:
                t_row_GapDateInit += 1

        if t_row_GapDateInit!=data_30min.shape[0]:
            t_row_ub = t_row_GapDateInit # upper bound row (open price 30 min before market open, typically row for 9:00)
            if np.int64(data_30min[t_row_ub,3]) >= 900:
                pass
            else:
                while np.int64(data_30min[t_row_ub,3]) < 900:
                    t_row_ub += 1

            t_row_lb = t_row_GapDateInit-1 # lower bound row (previous day's market close, typically row for 15:30)
            if np.int64(data_30min[t_row_lb,3]) < 1600:
                pass
            else:
                while np.int64(data_30min[t_row_lb,3]) >= 1600:
                    t_row_lb -= 1

            # Record only if the upper bound is at 9:00
            if int(data_30min[t_row_ub,3]) == 900:
                change_PreMarket[k_date] = ( data_30min[t_row_ub,4]-data_30min[t_row_lb,7] ) / data_30min[t_row_lb,7] * 100
            else:
                change_PreMarket[k_date] = np.nan

        else:
            change_PreMarket[k_date] = np.nan # no gap date found for this stock
            t_row_GapDateInit = 0 # re-initialize the gap date location

    return change_PreMarket
Exemplo n.º 2
0
def loadRebFile(file_rebound, list_sortCol=[]):
    data_raw = np.genfromtxt(file_rebound, dtype=None, delimiter=',')
    data_raw = data_raw[1:,:] # remove first row
    n_data = data_raw.shape[0]

    if list_sortCol:
        print('sorting...')
        data_raw = m.sortrowsByMultiCol(data_raw, list_sortCol)

    data_StkSize = [] # Stock Size (e.g., 'L', 'M', 'S', 'N')
    data_Symbol = [] # Stock Symbol
    data_Date = np.zeros((n_data,3), dtype='int64') # Year, Month, Day
    data_Vol = np.zeros((n_data,2), dtype='int64') # Daily Volume, Average Volume
    data_Gap_Rebound = np.zeros((n_data,6)) # Gap, Rebounds at Five Timings
    for k_row in range(0,n_data):
        data_StkSize.append(data_raw[k_row,0].decode('UTF-8'))
        data_Symbol.append(data_raw[k_row,1].decode('UTF-8').strip()) # str.strip() is used to remove white space: ' INTC' -> 'INTC'
        data_Date[k_row,:] = np.int_(np.float_([k_elm.decode('UTF-8') for k_elm in data_raw[k_row,2:5]]))
        data_Vol[k_row,:] = np.int_(np.float_([k_elm.decode('UTF-8') for k_elm in data_raw[k_row,5:7]]))
        data_Gap_Rebound[k_row,:] = np.float_([k_elm.decode('UTF-8') for k_elm in data_raw[k_row,7:]])

    data_StkSize = np.array(data_StkSize)
    data_Symbol = np.array(data_Symbol)
    return data_StkSize, data_Symbol, data_Date, data_Vol, data_Gap_Rebound