#python #pandas #dataframe #scikit-learn
#python #панды #фрейм данных #scikit-learn
Вопрос:
здесь немного многословно, но я был бы очень признателен за помощь.
У меня есть df
данные о запасах, и то, что я пытаюсь сделать, это проверить эффективность Z-баллов, и я в основном строю Z-балл для каждого запаса, а затем вычисляю форвардный доход за 100 дней и сопоставляю их друг с другом, чтобы определить, есть ли корреляция.
Однако меня интересуют только крайности и интересует только сторона покупки, поэтому меня в основном интересуют только большие отрицательные Z-оценки, скажем, -3 или более отрицательные, и их соответствующие прямые доходы.
Затем я также хочу получить результат R-квадрата для каждого показателя z акций по сравнению с возвратом вперед.
Это то, где я нахожусь до сих пор. У меня есть мои цены в вызываемом data
фрейме данных, и в конечном итоге я хочу ввести все необходимые данные в to df
, а затем отобразить все это. Я пытаюсь просто получить данные в один длинный фрейм данных, поскольку меня не интересует название акций, поскольку я просто строю данные в данный момент.
Итак, я начинаю с вычисления Zscore и того, что я называю возвратом вперед, что довольно просто. Однако они оба производят NAN, поэтому, чтобы избежать df
постепенного уменьшения по мере прохождения цикла, я помещаю эти новые данные в newdf
и удаляю NAN.
Затем я сортирую это newdf
по Zscores, чтобы вернуть любые данные, которые равны -3 или меньше, и именно здесь я столкнулся со своей первой проблемой. Если в запасе нет никаких данных для Zscores или -3 или меньше, это приводит к ошибке, и цикл прерывается.
ValueError: Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required.
Это ошибка, которую я получаю. Я протестировал его -2
, и все работает нормально, просто чтобы я мог убедиться, что остальная часть скрипта работает.
Затем я выполняю линейную регрессию, чтобы вернуть r-квадрат, и использую это число в качестве другого квалификатора, с помощью которого создается мой окончательный df
фрейм данных.,
df = []
for stock in stocks:
newdf = []
data['zscore'] = (data[stock] - data[stock].rolling(100).mean()) / data[stock].rolling(100).std()
data['fwd100'] = (data[stock].rolling(10).mean().shift(-105) - data[stock]) / data[stock]
newdf.append(data[['zscore', 'fwd100']])
newdf = pd.concat(newdf, axis=1)
newdf.dropna(inplace=True)
newdf.sort_values('zscore', inplace=True)
newdf = newdf[newdf.zscore < -3]
X = newdf['zscore'].values.reshape(-1, 1)
y = newdf['fwd100'].values.reshape(-1, 1)
linear_regressor = LinearRegression()
linear_regressor.fit(X, y)
rsq = linear_regressor.score(X, y)
if rsq > 0.3:
df.append(newdf[['zscore', 'fwd100']])
df = pd.concat(df, axis=0)
sns.regplot(df['zscore'],df['fwd100'])
plt.show()
Используя -2
в качестве своего параметра, я получаю следующий график рассеяния.
Итак, мой первый вопрос: как я могу остановить возникновение этой ошибки, если у акции нет каких-либо уточняющих данных. Во-вторых, это самый эффективный способ для меня сделать это? Я чувствую, что я делал несколько обходных путей. И, в-третьих, я смотрю на 100-дневные Zscores и 100-дневные возвраты вперед, но это довольно произвольное число, возможно, оптимальной комбинацией будет 75 и 125 или что-то в этом роде, но мне пришлось бы провести немного проб и ошибок, может ли в этом помочь машинное обучение. Если да, то что лучше всего использовать для Google / чтения? Я не ожидаю большого ответа, я рад прочитать об этом сам.
Любая помощь действительно ценится, приветствия
Вот пример моих данных о запасах:
Stock A Stock B Stock C Stock D Stock E
Date
01/04/2019 8.17 1.11 3.22 11.58 1.20
02/04/2019 8.17 1.11 3.21 11.53 1.20
03/04/2019 8.15 1.10 3.20 11.67 1.20
04/04/2019 8.12 1.10 3.21 11.66 1.21
05/04/2019 8.11 1.10 3.19 11.57 1.19
08/04/2019 8.11 1.09 3.18 11.46 1.20
09/04/2019 8.10 1.07 3.13 11.19 1.19
10/04/2019 8.15 1.08 3.13 11.30 1.17
11/04/2019 8.15 1.08 3.11 11.20 1.18
12/04/2019 8.14 1.09 3.09 11.17 1.19
15/04/2019 8.12 1.08 3.09 11.19 1.17
16/04/2019 8.11 1.08 3.08 11.02 1.17
17/04/2019 8.15 1.08 3.04 10.94 1.17
18/04/2019 8.14 1.08 3.05 11.05 1.18
19/04/2019 8.13 1.07 3.04 10.98 1.16
Комментарии:
1. Можете ли вы предоставить примерное значение
stocks
переменной!2. Привет, приятель, только что обновлен, надеюсь, это поможет
3. Можете ли вы
data
также обновить значение4. для вашего первого вопроса, добавляет ли проверка if для ряда (или df), имеющего элементы, прежде чем продолжить, вариант? что касается вашего второго вопроса, если вам нужно настроить только одну переменную, я бы посоветовал отказаться от машинного обучения и просто создать скрипт, который перебирает рациональный список возможных значений параметров и сохраняет выходные данные.
5. Да, ввод оператора if — хорошая идея, на самом деле, спасибо, приятель