#!/usr/bin/env python # encoding: utf-8 """Run a Monte-Carlo options pricer in parallel.""" from IPython.kernel import client import numpy as N from mcpricer import MCOptionPricer tc = client.TaskClient() rc = client.MultiEngineClient() # Initialize the common code on the engines rc.run('mcpricer.py') # Push the variables that won't change #(stock print, interest rate, days and MC paths) rc.push(dict(S=100.0, r=0.05, days=260, paths=10000)) task_string = """\ op = MCOptionPricer(S,K,sigma,r,days,paths) op.run() vp, ap, vc, ac = op.vanilla_put, op.asian_put, op.vanilla_call, op.asian_call """ # Create arrays of strike prices and volatilities K_vals = N.linspace(90.0,100.0,5) sigma_vals = N.linspace(0.0, 0.2,5) # Submit tasks taskids = [] for K in K_vals: for sigma in sigma_vals: t = client.StringTask(task_string, push=dict(sigma=sigma,K=K), pull=('vp','ap','vc','ac','sigma','K')) taskids.append(tc.run(t)) print "Submitted tasks: ", taskids # Block until tasks are completed tc.barrier(taskids) # Get the results results = [tc.get_task_result(tid) for tid in taskids] # Assemble the result vc = N.empty(K_vals.shape[0]*sigma_vals.shape[0],dtype='float64') vp = N.empty(K_vals.shape[0]*sigma_vals.shape[0],dtype='float64') ac = N.empty(K_vals.shape[0]*sigma_vals.shape[0],dtype='float64') ap = N.empty(K_vals.shape[0]*sigma_vals.shape[0],dtype='float64') for i, tr in enumerate(results): ns = tr.ns vc[i] = ns.vc vp[i] = ns.vp ac[i] = ns.ac ap[i] = ns.ap vc.shape = (K_vals.shape[0],sigma_vals.shape[0]) vp.shape = (K_vals.shape[0],sigma_vals.shape[0]) ac.shape = (K_vals.shape[0],sigma_vals.shape[0]) ap.shape = (K_vals.shape[0],sigma_vals.shape[0]) def plot_options(K_vals, sigma_vals, prices): """Make a contour plot of the option prices.""" import pylab pylab.contourf(sigma_vals, K_vals, prices) pylab.colorbar() pylab.title("Option Price") pylab.xlabel("Volatility") pylab.ylabel("Strike Price")