2015-02-05 71 views
9

有一个Pandas DataFrame对象与一些股票数据。 SMA从先前的45/15天移动平均线。Python和熊猫 - 移动平均交叉点

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 

我想查找所有日期,当SMA_15和SMA_45相交时。

使用Pandas或Numpy可以有效地完成吗?怎么样?

编辑:

我的意思是 '交叉点' 什么:

数据行,当:

  • 长SMA(45)值比短SMA更大(15)价值比SMA短期(15)长,并且变得更小。
  • 长SMA(45)的价格比短SMA(15)的价格要短于SMA的短期(15),并且它变得更大。
+2

是什么意思了SMA_15和SMA_45在给定的日期相交? (在你的例子中,SMA_45> SMA_15到处都是,所以似乎不是一个好的候选人。) – DSM 2015-02-05 13:36:49

+0

如果通过“相交”表示它们在同一日期的相同位置,那么使用布尔索引这种操作很简单,'df [df.sma_15 == df.sma_45]'。 – 2015-02-05 13:39:18

+0

这只是随机股票的一段数据。 – chilliq 2015-02-05 13:39:54

回答

12

我正在一个交叉是指当SMA线 - 作为时间的函数 - 相交,在this investopedia page如图所示。

enter image description here

由于形状记忆合金表示连续的功能,有交叉时, 对于给定的行,(SMA_15小于SMA_45)和(先前SMA_15是 比以前更大的SMA_45) - 或相反亦然。

在代码中,如果我们更改您的数据

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 

,以便有交叉,可以表示为

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))) 

enter image description here

然后

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) 

产生

1 20150128 
2 20150129 
Name: Date, dtype: int64