This entry is part 7 of 23 in the series Numpy Strategies

NumPy Strategies 0.1.6

Our Product Owner and Product Manager got talking about our latest strategy. They decided that our Fantasy Hedge Fund needs to have simulations of these strategies. The new User Story:

• Simulate periodic trading with random buying and selling.

We will simulate trading by taking some random days from a trading year.

1. Get close prices

Let’s start by downloading historical data for a stock. For instance, AAPL.

 1 2 3 4 5 today = date.today() start = (today.year - 1, today.month, today.day)   quotes = quotes_historical_yahoo(sys.argv, start, today) close = numpy.array([q for q in quotes])

2. Generate random indices

Generate random integers with the NumPy randint function.

 1 return numpy.random.randint(0, high, size)

Simulate trades with the random indices from the previous step. Use the NumPy take function to extract random close prices from the array of step 1.

 1 2 3 buys = numpy.take(close, get_indices(len(close), nbuys)) sells = numpy.take(close, get_indices(len(close), nbuys)) profits[i] = sells.sum() - buys.sum()

4. Plot a histogram of the profits

Let’s plot a histogram of the profits for a large number of simulations.

 1 2 matplotlib.pyplot.hist(profits) matplotlib.pyplot.show()

The resulting histogram of 2000 simulations for AAPL with 5 buys and sells in a year:

What just happened?

This is the Retrospective of Sprint 16. One thing we noticed is that the profits variance is HUGE! So it will be hard to beat a random strategy. The mean is close to 0, which was expected.

Below is the complete code or get it from Github.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 from matplotlib.finance import quotes_historical_yahoo from datetime import date import numpy import sys import matplotlib.pyplot   def get_indices(high, size): #2. Generate random indices return numpy.random.randint(0, high, size)   #1. Get close prices. today = date.today() start = (today.year - 1, today.month, today.day)   quotes = quotes_historical_yahoo(sys.argv, start, today) close = numpy.array([q for q in quotes])   nbuys = int(sys.argv) N = int(sys.argv) profits = numpy.zeros(N)   for i in xrange(N): #3. Simulate trades buys = numpy.take(close, get_indices(len(close), nbuys)) sells = numpy.take(close, get_indices(len(close), nbuys)) profits[i] = sells.sum() - buys.sum()   print "Mean", profits.mean() print "Std", profits.std()   #4. Plot a histogram of the profits matplotlib.pyplot.hist(profits) matplotlib.pyplot.show()

If you liked this post and are interested in NumPy check out NumPy Beginner’s Guide by yours truly.