def compute(self, today, assets, out, data): drawdowns = fmax.accumulate(data, axis=0) - data drawdowns[isnan(drawdowns)] = NINF drawdown_ends = nanargmax(drawdowns, axis=0) # TODO: Accelerate this loop in Cython or Numba. for i, end in enumerate(drawdown_ends): peak = nanmax(data[:end + 1, i]) out[i] = (peak - data[end, i]) / data[end, i]
def compute(self, today, assets, out, highs, lows, closes): high_to_low = highs[1:] - lows[1:] high_to_prev_close = abs(highs[1:] - closes[:-1]) low_to_prev_close = abs(lows[1:] - closes[:-1]) out[:] = nanmax( dstack(( high_to_low, high_to_prev_close, low_to_prev_close, )), 2)
def compute(self, today, assets, out, highs, lows, closes): high_to_low = highs[1:] - lows[1:] high_to_prev_close = abs(highs[1:] - closes[:-1]) low_to_prev_close = abs(lows[1:] - closes[:-1]) out[:] = nanmax( dstack(( high_to_low, high_to_prev_close, low_to_prev_close, )), 2 )
def compute(self, today, assets, out, closes, lows, highs): highest_highs = nanmax(highs, axis=0) lowest_lows = nanmin(lows, axis=0) today_closes = closes[-1] evaluate( '((tc - ll) / (hh - ll)) * 100', local_dict={ 'tc': today_closes, 'll': lowest_lows, 'hh': highest_highs, }, global_dict={}, out=out, )
def compute(self, today, assets, out, closes, lows, highs): highest_highs = nanmax(highs, axis=0) lowest_lows = nanmin(lows, axis=0) today_closes = closes[-1] evaluate( "((tc - ll) / (hh - ll)) * 100", local_dict={ "tc": today_closes, "ll": lowest_lows, "hh": highest_highs, }, global_dict={}, out=out, )
def highs(self, assets, dt): """ The high field's aggregation returns the largest high seen between the market open and the current dt. If there has been no data on or before the `dt` the high is `nan`. Returns ------- np.array with dtype=float64, in order of assets parameter. """ market_open, prev_dt, dt_value, entries = self._prelude(dt, "high") highs = [] session_label = self._trading_calendar.minute_to_session_label(dt) for asset in assets: if not asset.is_alive_for_session(session_label): highs.append(np.NaN) continue if prev_dt is None: val = self._minute_reader.get_value(asset, dt, "high") entries[asset] = (dt_value, val) highs.append(val) continue else: try: last_visited_dt, last_max = entries[asset] if last_visited_dt == dt_value: highs.append(last_max) continue elif last_visited_dt == prev_dt: curr_val = self._minute_reader.get_value( asset, dt, "high") if pd.isnull(curr_val): val = last_max elif pd.isnull(last_max): val = curr_val else: val = max(last_max, curr_val) entries[asset] = (dt_value, val) highs.append(val) continue else: after_last = pd.Timestamp(last_visited_dt + self._one_min, tz="UTC") window = self._minute_reader.load_raw_arrays( ["high"], after_last, dt, [asset], )[0].T val = nanmax(np.append(window, last_max)) entries[asset] = (dt_value, val) highs.append(val) continue except KeyError: window = self._minute_reader.load_raw_arrays( ["high"], market_open, dt, [asset], )[0].T val = nanmax(window) entries[asset] = (dt_value, val) highs.append(val) continue return np.array(highs)