Как найти nbr периодов, ведущих к текущему периоду, когда цена акций была в диапазоне - PullRequest
0 голосов
/ 01 октября 2019

У меня есть данные о дневных максимальных и низких ценах акций за X лет. Для каждого дня у меня есть диапазон, определенный верхней и нижней границей. Этот диапазон меняется ежедневно. Я хотел бы узнать, сколько дней назад прошло время, когда цена акций находилась в этом диапазоне.

I.e. number of days going back from period i such that high[i-j] < upperbound[i] & low[i-j] > lowerbound[i] where j = i-1 all the way down to 0.

Я пытался использовать расширение () в панде DataFrame, но не смог заставить функцию работать и не уверен, как настроить функцию. Я очень заинтересован в том, чтобы как-то использовать расширение ().

import pandas as pd

high = pd.DataFrame([[0.97, 1.95], [0.95, 2.1], [0.99, 1.96], [0.98, 1.99]], columns=['Stock1', 'Stock2'])
upper_bound = pd.DataFrame([[1.01, 2.06], [1.02, 2.01], [1.02, 2.0], [1.0, 2.01]], columns=['Stock1', 'Stock2'])
low = pd.DataFrame([[0.49, 1.21], [0.51, 1.22], [0.52, 1.21], [0.53, 1.201]], columns=['Stock1', 'Stock2'])
lower_bound = pd.DataFrame([[0.48, 1.2], [0.509, 1.21], [0.5, 1.201], [0.48, 1.19]], columns=['Stock1', 'Stock2'])

Если максимум и минимум акции никогда не выходили за пределы диапазона, функция должна возвращать NA. Если запас был вне диапазона, то функция должна возвращать количество периодов от [i] до [ij], т.е. должен вернуть j.

Будет применяться к большому информационному фрейму с несколькими акциями, поэтому ищем элегантное быстрое векторизованное (математически - это слово) решение.

Используя мои примеры выше, я ожидаюрезультат будет:

    Stock1   Stock2
0   NA       NA
1   1        0
2   2        1
3   NA       2

Другими словами для Stock1

period [0], there is no historical price that was out of range(lower [0] to upper [0]) -> NA
period [1], the low of period [0] is smaller than lower bound [1] -> 1 day of history within range
period [2], the low of period [0] is smaller than lower bound [2] -> 2 days of histroy within range
period [3], there is no historical price that was out of range(lower [3] to upper [3]) -> NA 

И для Stock2

period [0], there is no historical price that was out of range (lower [0] to upper [0]) -> NA
period [1], the high of period [1] is higher than upper bound [1] -> 0 days of history within range
period [2], the high of period [1] is higher than upper bound [2] -> 1 day of histroy within range
period [3], the high of period [1] is higher than upper bound [3] -> 2 days of histroy within range

Любая помощь будет принята с благодарностью !!!

...