2015-11-29 3 views
0

EDIT2: Спасибо за ответы, я получил дальше с:Numpy, выбор векторизации строк, которые отвечают на покупку/продажу логики в количественном анализе

buyChange = np.where (np.diff (купить> 0) ! = 0)

sellChange = np.where (np.diff (продажа> 0)! = 0)

Теперь у меня есть 2 массивы индексов, один, где купить Logic пересекает и один, где продают логика пересекает:

купить: (массив ([3, 5, 8, 9, 14, 15, 17, 19, 20, 26, 27 , 33, 39, 41, 46, 47, 51, 60, 61, 62, 70, 71, 75, 76, 77, 78, 80, 81, 83, 88, 90, 97, 100 ...

надувательства: (массив ([22, 34, 54, 63, 85, 88, 89, 102, 103, 110, 111 ...

что мне нужно сейчас пары индексов, которые представляют собой покупку и продавать пары. Когда покупка пересекает это, это начало пары, а затем первое большее число, чем в массиве sell, является вторым в этой паре buy/sell. Тогда следующая самая высокая в массиве buy выше последней продажи - это начало следующей пары. Для вышеуказанных массивов это было бы (3,22) (26,34) (39,54) (60,63) (70,85) (88,89). Затем я могу использовать эти индексы в этом коде, чтобы найти соответствующие цены открытия, которые я буду торговать на в заднем тесте:

цена = о [buyChange [0] [индекс] +2]

\ EDIT2

Редактировать: Я нашел эту функцию, которая находит разделы, которые являются отрицательными в массиве, но теперь мне нужно найти день в начале этого раздела, день, когда массив превратился из положительного в отрицательный. Может ли кто-нибудь помочь с этим?

buys = np.where(buy < 0)

Что-то вроде ниже не работает, но это идея о том, что я хочу, чтобы реализовать:

buys = np.where(buy < 0 and buy[-1] > 0)

или:

buys = np.where(buy[1:] < 0 and buy[:-1] > 0)

/EDIT

У меня есть цикл, который собирается, хотя массивы из исходного файла, и если заявления, которые определяют, если определенная линия покупки или продажи. Я ищу способ для векторизации этого действия, возможно, чтобы создать список только дней покупки/продажи, после чего я могу рассчитать свои доходы. Фактически список дней после сигнальных дней, потому что я торгую открытыми на следующий день. Вот кости моей программы:

for stock in files: 
 
    d,c,h,l,o,v = getData(str(root+'\\'+stock)) # creates numpy arrays of columns in file 
 
    s = sma(c,SMA,stockLen)      # creates array of simple moving average 
 
    sL = sma(c,longSMA,stockLen)    # creates array of longer simple moving average 
 
    
 
    #below is code that i'm trying to replace with vectorization: 
 
    for day in range(stockLen): 
 
    if c[day] < s[day] and stance == 'none': 
 
     stance = 'holding' 
 
     buyPrice = o[day+1] 
 
    
 
    if c[day] > sL[day] and stance == 'holding': 
 
     sellPrice = o[day+1] 
 
     tradeProfit = pctChange(buyPrice,sellPrice) 
 
     pctPerYear.append((250/holdingTime)*tradeProfit) 
 
     stance = 'none'

Я добрался до точки с 2 массивов, купить становится отрицательным, когда я хочу купить и продать как положительный, когда я хочу продать, но я не знаю, как поставить логику «if statement» в массив без использования неэффективного цикла.

здесь покупки/продажи массивы:

buy = c[:]-s[:] #creates array that goes negative when closing price is below sma. 
 
sell = c[:]-sL[:] #creates array that goes positive when closing price is above long sma.

Благодаря всем, кто может мне помочь!

EDIT: Это фрагмент данных, его date,close,high,low,open,volume. Около 2500 рядов на акцию.

date,close,high,low,open,volume 
20110718,43.40,43.68,42.93,43.07,25844 
20110719,42.65,43.37,42.38,43.37,32334 
20110720,43.11,43.11,42.06,42.46,22072 
20110721,43.25,43.60,43.06,43.28,24965 

ответ

0

Проверьте эту ссылку из документации Pandas.

http://pandas.pydata.org/pandas-docs/stable/enhancingperf.html

Вы также можете найти эту ссылку полезной в краткосрочной перспективе:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

для кода выше, вы пытались реализовать vetorisation в виде:

DATA['Return'] = np.log(DATA['close']/DATA['close'].shift(1)) 
+0

счастлив попытаться помочь дальше, если вы можете предоставить некоторые примеры данных. – toasteez

+0

Я добавил фрагмент данных. Thanx для ссылки pandas, я рассмотрю использование pandas с cython, в документации говорится, что он работает быстро для циклов, чтобы это могло быть правильным решением, а не пытаться устранить этот последний цикл. – puzzler

+0

Какая продолжительность вы используете в данных для вас, скользящих средних? (Я пытаюсь завершить это с использованием данных LLOY.L с 01 января по 2015 год до 06 ноября 2015 года, будет ли достаточно данных для упражнения? (221 дней) Как вы получаете время выдержки? (Действительно ли это или получено путем сигнала продажи? Вы также хотите создать журнал Returns? – toasteez

0

Если вы просто хотите найти точки, в которых вектор меняет знак, вы можете сделать что-то вроде этого:

change_points = np.where(np.diff(buy>0)!=0)