# # See the exercise "SandP.pdf" from SandP.html # in http://www.physics.cornell.edu/~myers/teaching/ComputationalMethods/ComputerExercises/ # # Import packages import pylab import scipy # Read in the file of Standard and Poor's average versus time t = [] SP = [] for line in file("SandPConstantDollars.dat"): day, sandp = list(map(float, line.split())) t.append(day) SP.append(sandp) # Convert from "list" to "array" form (arrays can be multiplied and added, etc.) t = scipy.array(t) SP = scipy.array(SP) # ***** Plot SP versus t # ***** pylab.plot(t, SP) # ***** pylab.show() # ***** Note 9/11/01 is day 6903: is it the cause for the post-2000 drop?" # ***** Zoom in and see: did the terrorist attach on the World Trade Center # ***** trigger the stock market downturn, or was it just a small extra dip in # ***** an overall pattern? def P(lag): """ Function which returns a list of percentage changes after a number "lag" of trading days. P(1) gives the daily percentage changes, P(5) the weekly changes, etc. # Arrays add and subtract and multiply by scalars just like vectors SP[m,n] is the part of the array starting at m and ending at n Arrays and lists in python start at zero and end at len(list)-1. # So, the easy way to compute the vector of fractional changes after a time "lag" is ratios = SP[lag:N]/SP[0:N-lag] where N is len(SP) and the list of percentage changes is P = 100.*(ratios-1.) You'll need also to return P """ N = len(SP) ratios = SP[lag:N]/SP[0:N-lag] P = 100.*(ratios-1.) return P def PlotPHistogram(lag): """ Plotting a histogram using pylab is easy: make a list or array of data, and call (n,bins,patches) = pylab.hist(data,bins=100,normed=True) for 100 equal-sized bins, with the values rescaled so the area is one. You may need to do pylab.show() to get the graph to come up. # Usage: PlotPHistogram(1) # Day PlotPHistogram(5) # Week PlotPHistogram(252) # Year """ pylab.hist(P(lag), bins=100, normed=True) def PlotLogPHistogram(lag): """ The pylab.hist function can be called with log=True to return the log of the counts in each bin. # Usage: PlotLogPHistogram(5) # Week """ pylab.hist(P(lag), bins=100, normed=True, align='mid', log=True) # PlotLogPHistogram(5) def V(lag): """ Volatility: standard deviation of percentage change after time lag scipy.sum(A) adds the numbers in an array A A**2 is a new array whose entries are the entries of A squared len(A) gives the number of entries Find the mean percentage change after lag Find the variance var = (p - mean)**2/(len(p)-1) [Note: N-1 in denom from stats] Return the volatility = scipy.sqrt(var) # Usage: lags = range(100) volatilities = [V(lag) for lag in lags] pylab.plot(...) """ p = P(lag) mean = scipy.sum(p)/len(p) var = scipy.sum((p-mean)**2)/(len(p)-1) volatility = scipy.sqrt(var) return volatility def yesno(): response = input(' Continue? (y/n) ') if len(response)==0: # [CR] returns true return True elif response[0] == 'n' or response[0] == 'N': return False else: # Default return True def demo(): """Demonstrates solution for exercise: example of usage""" print("Standard and Poor's Demo") print(" Standard and Poors versus day") print(" Note 9/11/01 is day 6903: is it the cause for the post-2000 drop?") print(" (zoom in to see)") pylab.plot(t, SP) pylab.show() if not yesno(): return print(" ") print(" Standard and Poors versus day") print(" How long should you stay invested to beat the fluctuations?") print(" Daily percentage changes") PlotPHistogram(1) pylab.show() if not yesno(): return print(" Weekly percentage changes") PlotPHistogram(5) pylab.show() if not yesno(): return print(" Yearly percentage changes") PlotPHistogram(252) pylab.show() if not yesno(): return print(" ") print(" Looking for fat tails of Gaussian: take log") print(" Is it an inverted parabola?") PlotLogPHistogram(5) pylab.show() if not yesno(): return print(" Volatility versus time lag") print(" Square root is random walk") lags = list(range(100)) volatility = [V(lag) for lag in lags] pylab.plot(lags, volatility) pylab.show() if __name__=="__main__": demo() # Copyright (C) Cornell University # All rights reserved. # Apache License, Version 2.0