Black-Scholes option pricingΒΆ
### stock problem example for ffnet ###
# Data and description for this example is borrowed from:
# http://www.scientific-consultants.com/nnbd.html
#
#
# Training data consists of Black-Scholes option prices
# for volatility levels running from 20 percent to 200 percent,
# for time remaining running from 5 to 15 days, and for strike price
# running from 70 dollars to 130 dollars. The stock price was set to
# 100 dollars and the interest rate to 0 percent when generating
# the data.
#
# The data is "difficult" in that (for a neural network to
# practically emulate Black-Scholes) a very tight fit is required.
# The R-squared should be at least 0.999999 or better, and the largest
# absolute error must be less than 0.05 dollars (the price increment
# for most options) or, better yet, less than 0.01 dollars.
#
#
# So let's try.
# Attention: training might be a long process since we train a big network.
from ffnet import ffnet, mlgraph, readdata
from numpy import array
# Generate standard layered network architecture and create network
conec = mlgraph((3,22,12,1))
net = ffnet(conec)
# Read training data omitting first column and first line
print "READING DATA..."
data = readdata( 'data/black-scholes.dat',
usecols = (1, 2, 3, 4),
skiprows = 1)
input = data[:, :3] #first 3 columns
target = data[:, -1] #last column
print "TRAINING NETWORK..."
import sys; sys.stdout.flush() #Just to ensure dislpaing the above messages here
net.train_tnc(input, target, maxfun = 5000, messages=1)
# Test network
print
print "TESTING NETWORK..."
output, regression = net.test(input, target, iprint = 0)
Rsquared = regression[0][2]
maxerr = abs( array(output).reshape( len(output) ) - array(target) ).max()
print "R-squared: %s (should be >= 0.999999)" %str(Rsquared)
print "max. absolute error: %s (should be <= 0.05)" %str(maxerr)
print
print "Is ffnet ready for a stock?"
#####################################
# Make plot if matplotlib is avialble
try:
from pylab import *
plot( target, 'b--' )
plot( output, 'k-' )
legend(('target', 'output'))
xlabel('pattern'); ylabel('price')
title('Outputs vs. target of trained network.')
grid(True)
show()
except ImportError, e:
print "Cannot make plots. For plotting install matplotlib.\n%s" % e
Successfull training should result in very good fitness: