Hi Andre, Assuming that you want the exact point (date and value) where each crossing occurs, you'll need to interpolate where they cross.
There are a number of different ways to do so, but assuming you're okay with linear interpolation, and everything's sampled on the same dates, you can simply do something like this: import numpy as np import matplotlib.pyplot as plt def main(): x = np.linspace(0, 2*np.pi, 20) y1 = np.sin(2*x) y2 = np.cos(x) crossings = find_crossings(x, y1, y2) cross_x, cross_y = crossings.T plt.plot(x, y1, 'bx-') plt.plot(x, y2, 'gx-') plt.plot(cross_x, cross_y, 'ro') plt.show() def find_crossings(x, y1, y2): diff = np.diff(np.sign(y1 - y2)) indicies, = np.nonzero(diff) crossings = [interpolate_crossing(i, x, y1, y2) for i in indicies] return np.array(crossings) def interpolate_crossing(i, x, y1, y2): slope = ( (y1[i] - y2[i]) / ((y2[i+1] - y2[i]) - (y1[i+1] - y1[i]))) x = x[i] + slope * (x[i+1] - x[i]) y = y1[i] + slope * (y1[i+1] - y1[i]) return x, y main() [image: VXsqp.png] On Tue, Mar 1, 2011 at 10:07 AM, Andre Lopes <lopes80an...@gmail.com> wrote: > Hi, > > I'm new to Numpy. I'm doing some tests with some Stock Market Quotes > > My struggle right now is "how to get the values of the moving averages > crosses", I send an image in attach to illustrate what I'm trying to > get. > > I'm using the this computation to get when the moving averages > crosses, but when I look at the graph, the values doesn't seem ok. > > [quote] > # Get when the ma20 cross ma50 > equal = np.round(ma20,2)==np.round(ma50,2) > dates_cross = (dates[equal]) > prices_cross = (prices[equal]) > [/quote] > > > The full code is this: > [quote] > # Modules > import datetime > import numpy as np > import matplotlib.finance as finance > import matplotlib.mlab as mlab > import matplotlib.pyplot as plot > > # Define quote > startdate = datetime.date(2008,10,1) > today = enddate = datetime.date.today() > ticker = 'uso' > > # Catch CSV > fh = finance.fetch_historical_yahoo(ticker, startdate, enddate) > > # From CSV to REACARRAY > r = mlab.csv2rec(fh); fh.close() > # Order by Desc > r.sort() > > > ### Methods Begin > def moving_average(x, n, type='simple'): > """ > compute an n period moving average. > > type is 'simple' | 'exponential' > > """ > x = np.asarray(x) > if type=='simple': > weights = np.ones(n) > else: > weights = np.exp(np.linspace(-1., 0., n)) > > weights /= weights.sum() > > > a = np.convolve(x, weights, mode='full')[:len(x)] > a[:n] = a[n] > return a > ### Methods End > > > prices = r.adj_close > dates = r.date > ma20 = moving_average(prices, 20, type='simple') > ma50 = moving_average(prices, 50, type='simple') > > # Get when the ma20 cross ma50 > equal = np.round(ma20,2)==np.round(ma50,2) > dates_cross = (dates[equal]) > prices_cross = (prices[equal]) > > # Ver se a ma20 > ma50 > # ma20_greater_than_ma50 = np.round(ma20,2) > np.round(ma50,2) > # dates_ma20_greater_than_ma50 = (dates[ma20_greater_than_ma50]) > # prices_ma20_greater_than_ma50 = (prices[ma20_greater_than_ma50]) > > print dates_cross > print prices_cross > #print dates_ma20_greater_than_ma50 > #print prices_ma20_greater_than_ma50 > > > plot.plot(prices) > plot.plot(ma20) > plot.plot(ma50) > plot.show() > [/quote] > > Someone can give me some clues? > > Best Regards, > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@scipy.org > http://mail.scipy.org/mailman/listinfo/numpy-discussion > >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion