Как изменить форму случайных pandas столбцов, чтобы их можно было транслировать? - PullRequest
1 голос
/ 25 мая 2020

Итак, я создаю торговый алгоритм, использующий кроссовер SMA. Код выглядит следующим образом:

import pandas as pd
import pandas_datareader as data
import datetime as dt
import numpy as np

start = dt.datetime(2018, 1, 1)
end = dt.datetime(2020, 4, 20)
d = data.get_data_yahoo('URI', start, end)


d['sma50'] = np.round(d['Close'].rolling(window=2).mean(), decimals=2)
d['sma200'] = np.round(d['Close'].rolling(window=14).mean(), decimals=2)
d['200-50'] = d['sma200'] - d['sma50']
_buy = -2
d['Crossover_Long'] = np.where(d['200-50'] < _buy, 1, 0)
d['Crossover_Long_Change']=d.Crossover_Long.diff()
d['buy'] = np.where(d['Crossover_Long_Change'] == 1, 'buy', 'n/a')
#there has to be sell paramters such as if the 200-50 becomes to wide 
d['sell'] = np.where(d['Crossover_Long_Change'] == -1, 'sell', 'n/a')
pd.set_option('display.max_rows', 5093)
d.drop(['High', 'Low', 'Close', 'Volume', 'Open'], axis=1, inplace=True)
d.dropna(inplace=True)
d

d.set_index(d['Adj Close'], inplace=True)
buy_price = d.index[d['Crossover_Long_Change']==1]
sell_price = d.index[d['Crossover_Long_Change']==-1]
profit_loss = sell_price - buy_price    

Если происходит пересечение, которое является сигналом покупки, то он печатает 1, если пересечение, которое является сигналом продажи, происходит, тогда он печатает -1. Затем я установил индекс как цену закрытия ADJ, чтобы я мог проиндексировать цены, когда это произошло, чтобы создать еще один фрейм данных. Например, я проиндексировал цену для такой компании, как URI, есть 26 заявок на продажу и 26 заявок на покупку. Мы можем увидеть это, выполнив:

d['Crossover_Long_Change'].value_counts()

Что печатает:

 0.0    513
-1.0     26
 1.0     26
Name: Crossover_Long_Change, dtype: int64

Но если бы я использовал такую ​​компанию, как AMD, то было бы 21 ордер на покупку и 20 на продажу. заказы. Поэтому, когда я транслирую их, чтобы найти Profit_loss, я получаю сообщение об ошибке:

alueError: operands could not be broadcast together with shapes (20,) (21,) 

Итак, как можно всегда гарантировать правильность формы для выполнения операций с ними? Спасибо.

(БОКОВОЕ ПРИМЕЧАНИЕ: Я думал об использовании изменения формы, но тогда это разрушит торговлю, но заставит его добавить еще -1, что означает, что он будет продавать, когда время закончится, а не когда произойдет пересечение? , еще раз спасибо)

...