2015-02-05 44 views
9

Có một đối tượng dữ liệu Pandas DataFrame với một số dữ liệu chứng khoán. SMAs đang di chuyển trung bình tính từ 45/15 ngày trước đó.Python và gấu trúc - Di chuyển chéo trung bình

Date  Price SMA_45  SMA_15 
20150127 102.75 113   106 
20150128 103.05 100   106 
20150129 105.10 112   105 
20150130 105.35 111   105 
20150202 107.15 111   105 
20150203 111.95 110   105 
20150204 111.90 110   106 

Tôi muốn tìm tất cả các ngày, khi SMA_15 và SMA_45 giao nhau.

Nó có thể được thực hiện hiệu quả bằng cách sử dụng Pandas hoặc Numpy? Làm sao?

EDIT:

Những gì tôi có nghĩa là bởi 'ngã':

Dòng dữ liệu, khi:

  • dài SMA (45) giá trị còn lớn hơn ngắn SMA (15) giá trị dài hơn chu kỳ SMA ngắn (15) và nó trở nên nhỏ hơn.
  • giá trị SMA dài (45) nhỏ hơn giá trị SMA ngắn (15) dài hơn chu kỳ SMA ngắn (15) và nó trở nên lớn hơn.
+2

có nghĩa là gì cho SMA_15 và SMA_45 để giao nhau vào một ngày cụ? (Trong ví dụ của bạn SMA_45> SMA_15 ở khắp mọi nơi, vì vậy dường như không phải là một ứng cử viên tốt.) – DSM

+0

Nếu bằng "giao nhau", bạn có nghĩa là chúng giống nhau ở cùng một ngày thì đó là vấn đề đơn giản khi sử dụng lập chỉ mục boolean như vậy , 'df [df.sma_15 == df.sma_45]'. –

+0

Nó chỉ là một phần dữ liệu từ cổ phiếu ngẫu nhiên. – chilliq

Trả lời

12

Tôi đang dùng sự giao nhau có ý nghĩa khi đường SMA - như các hàm thời gian - cắt nhau, như được mô tả trên this investopedia page.

enter image description here

Kể từ khi đường SMA đại diện cho chức năng liên tục, có một ngã tư khi, cho một hàng nhất định, (SMA_15 là ít hơn SMA_45) và (các SMA_15 trước là lớn hơn SMA_45 trước) - hoặc ngược lại.

Trong mã, mà có thể được diễn tả như

previous_15 = df['SMA_15'].shift(1) 
previous_45 = df['SMA_45'].shift(1) 
crossing = (((df['SMA_15'] <= df['SMA_45']) & (previous_15 >= previous_45)) 
      | ((df['SMA_15'] >= df['SMA_45']) & (previous_15 <= previous_45))) 

Nếu chúng ta thay đổi dữ liệu của bạn để

Date  Price SMA_45  SMA_15 
20150127 102.75 113   106 
20150128 103.05 100   106 
20150129 105.10 112   105 
20150130 105.35 111   105 
20150202 107.15 111   105 
20150203 111.95 110   105 
20150204 111.90 110   106 

vì vậy sẽ có giao cắt,

enter image description here

sau đó

import pandas as pd 

df = pd.read_table('data', sep='\s+') 
previous_15 = df['SMA_15'].shift(1) 
previous_45 = df['SMA_45'].shift(1) 
crossing = (((df['SMA_15'] <= df['SMA_45']) & (previous_15 >= previous_45)) 
      | ((df['SMA_15'] >= df['SMA_45']) & (previous_15 <= previous_45))) 
crossing_dates = df.loc[crossing, 'Date'] 
print(crossing_dates) 

mang

1 20150128 
2 20150129 
Name: Date, dtype: int64 
Các vấn đề liên quan