2015-02-05 15 views
9

कुछ स्टॉक डेटा के साथ एक पांडस डेटाफ्रेम ऑब्जेक्ट है। एसएमए पिछले 45/15 दिनों से गणना की औसत औसत ले जा रहे हैं।पायथन और पांडा - मूविंग औसत क्रॉसओवर

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 छेड़छाड़ करते हैं।

क्या यह पांडस या न्यूम्पी का उपयोग करके कुशलता से किया जा सकता है? कैसे?

संपादित करें:

मैं 'चौराहे' से क्या मतलब:

डेटा पंक्ति, जब:

  • लंबे एसएमए (45) मूल्य कम SMA से बड़ा था (15) लघु एसएमए अवधि (15) से अधिक के लिए मूल्य और यह छोटा हो गया।
  • लंबा एसएमए (45) मान लघु एसएमए (15) मूल्य से कम एसएमए अवधि (15) से अधिक समय के लिए छोटा था और यह बड़ा हो गया। , एक दूसरे को काटना के रूप में this investopedia page पर दर्शाया -
+2

इसका क्या मतलब है SMA_15 और SMA_45 किसी निश्चित तिथि पर एक दूसरे को काटना करने के लिए? (आपके उदाहरण में SMA_45> SMA_15 हर जगह, इसलिए कोई अच्छा उम्मीदवार प्रतीत नहीं होता है।) – DSM

+0

यदि "छेड़छाड़" से आपका मतलब है कि वे एक ही तारीख पर कहां हैं, तो यह बूलियन इंडेक्सिंग का उपयोग करने का एक साधारण मामला है , 'डीएफ [df.sma_15 == df.sma_45] '। –

+0

यह यादृच्छिक स्टॉक से डेटा का एक टुकड़ा है। – chilliq

उत्तर

12

मैं एक विदेशी ले रहा हूँ मतलब करने के लिए जब SMA लाइनों - समय की कार्यों के रूप में।

enter image description here

के बाद से SMAS निरंतर कार्यों का प्रतिनिधित्व करते हैं, वहाँ एक पार है जब, किसी पंक्ति के लिए, और (पिछले 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 
संबंधित मुद्दे