これは私がしばらくの間取り組んできたプログラムで、トラブルシューティングのヒントはすでにここにあります。
それは問題なく動作し、さまざまなグラフがさまざまな入力でどのように変化するかを直感的に確認できるようになっているため、速度は主な関心事ではありません。しかし、線だけでなく、グラフを完全にREDRAWにするにはどうすればよいですか(古い軸の上に各軸をクリアせずに再プロットするため、積み重なってすぐに行き詰まります)。
皆さんありがとう!
#!/usr/apps/Python/bin/python
import matplotlib, sys
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from Tkinter import *
import math
from matplotlib import pylab
import scipy
from scipy.stats import norm
master = Tk()
master.title("DePaul University Interactive Options Graphs")
pricePlot = Figure(figsize=(4,3), dpi=100, frameon=False)
a = pricePlot.add_subplot(111)
a.set_title('The Greeks')
priceDataPlot = FigureCanvasTkAgg(pricePlot, master=master)
priceDataPlot.get_tk_widget().grid(column=1, columnspan=2, row=1, rowspan=2)
vegaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
b = vegaPlot.add_subplot(1,1,1)
b.set_title('Vega')
vegaDataPlot = FigureCanvasTkAgg(vegaPlot, master=master)
vegaDataPlot.get_tk_widget().grid(row=2)
deltaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
c = deltaPlot.add_subplot(111)
c.set_title('Delta')
deltaDataPlot = FigureCanvasTkAgg(deltaPlot, master=master)
deltaDataPlot.get_tk_widget().grid(row=0,rowspan=2)
gammaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
d = gammaPlot.add_subplot(111)
d.set_title('Gamma')
gammaDataPlot = FigureCanvasTkAgg(gammaPlot, master=master)
gammaDataPlot.get_tk_widget().grid(column=3,row=2)
rhoPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
e = rhoPlot.add_subplot(111)
e.set_title('Rho')
rhoDataPlot = FigureCanvasTkAgg(rhoPlot, master=master)
rhoDataPlot.get_tk_widget().grid(column=3,row=3)
thetaPlot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
f = thetaPlot.add_subplot(111)
f.set_title('Theta')
thetaDataPlot = FigureCanvasTkAgg(thetaPlot, master=master)
thetaDataPlot.get_tk_widget().grid(column=3,row=0,rowspan=2)
a3Plot = Figure(figsize=(4,3.5), dpi=75, frameon=False)
g = a3Plot.add_subplot(111)
g.set_title('Price')
a3DataPlot = FigureCanvasTkAgg(a3Plot, master=master)
a3DataPlot.get_tk_widget().grid(row=3)
CallPutFlag='c'
def changePut():
CallPutFlag='p'
print CallPutFlag
def changeCall():
CallPutFlag='c'
print CallPutFlag
def main():
T=250 # This will
timeSpread = range(T-200,T+200,20) # all be user
# inputted
# values through
# Tkinter GUI
#
# JV 7/27/2012
r=float(interestRate.get())
S=float(stockPrice.get())
K=float(strikePrice.get())
v=float(volatility.get())
def BlackScholes(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
d2 = d1-v*math.sqrt((float(t)/365))
if CallPutFlag=='c':
return S*scipy.stats.norm.cdf(d1)-K*math.exp(-r*float(t))*scipy.stats.norm.cdf(d2)
else:
return K*math.exp(-r*float(t))*scipy.stats.norm.cdf(-d2)-S*scipy.stats.norm.cdf(-d1)
def delta(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
d2 = d1-v*math.sqrt((float(t)/365))
if CallPutFlag=='c':
callDelta = scipy.stats.norm.cdf(d1)
return callDelta
else:
putDelta = -scipy.stats.norm.cdf(-d1)
return putDelta
def gamma(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
d2 = d1-v*math.sqrt((float(t)/365))
gamma = scipy.stats.norm.pdf(d1)/(S*v*math.sqrt(float(t)))
return gamma
def rho(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
d2 = d1-v*math.sqrt((float(t)/365))
if CallPutFlag=='c':
callRho = (K*t*scipy.stats.norm.cdf(d2)/100)*math.e**-(r*t)
return callRho
else:
putRho = (-K*t*scipy.stats.norm.cdf(-d2)/100)*math.e**-(r*t)
return putRho
def vega(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
return S*scipy.stats.norm.pdf(d1)*math.sqrt(float(t))/100
def theta(t):
d1 = (math.log(S/K)+(r+v*v/2.)*(float(t)/365))/(v*math.sqrt((float(t)/365)))
d2 = d1-v*math.sqrt((float(t)/365))
b = math.e**-(r*t)
if CallPutFlag=='c':
callTheta = -S*scipy.stats.norm.pdf(d1)*v/(2*math.sqrt(float(t))-r*K*b*scipy.stats.norm.cdf(d2))
return callTheta
else:
putTheta = -S*scipy.stats.norm.pdf(d1)*v/(2*math.sqrt(float(t))+r*K*b*scipy.stats.norm.cdf(-d2))
return putTheta
tprices = [BlackScholes(i) for i in timeSpread]
tdeltas = [delta(i) for i in timeSpread]
tgammas = [gamma(i) for i in timeSpread]
trhos = [rho(i) for i in timeSpread]
tvegas = [vega(i) for i in timeSpread]
tthetas = [theta(i) for i in timeSpread]
a.cla()
a.plot(timeSpread,tdeltas,'g-')
a.plot(timeSpread,tgammas,'b-')
a.plot(timeSpread,trhos,'m-')
a.plot(timeSpread,tvegas,'r-')
a.plot(timeSpread,tthetas,'c-')
priceDataPlot.show()
line, = b.plot(timeSpread,tvegas,'r-')
vegaDataPlot.show()
line.remove()
line, = c.plot(timeSpread,tdeltas,'g-')
deltaDataPlot.show()
line.remove()
line, = d.plot(timeSpread,tgammas,'b-')
gammaDataPlot.show()
line.remove()
line, = e.plot(timeSpread,trhos,'m-')
rhoDataPlot.show()
line.remove()
line, = f.plot(timeSpread,tthetas,'c-')
thetaDataPlot.show()
line.remove()
line, = g.plot(timeSpread,tprices,'k-')
a3DataPlot.show()
line.remove()
##photo=PhotoImage(file='/Users/jaredvacanti/Desktop/Depaul.gif')
##Label(master, image=photo).grid()
w = Label(master, text="DePaul University Department of Finance \nInteractive Options Graphs")
w.grid(row=0,column=1,columnspan=2,pady=100)
r1 = Radiobutton(master, variable=CallPutFlag, value='c', text="Call",command=lambda root=master:main())
r2 = Radiobutton(master, variable=CallPutFlag, value='p', text="Put",command=lambda root=master:main())
r1.grid(row=0,column=1,columnspan=2,pady=50, sticky=N)
r2.grid(row=0,column=1,columnspan=1,pady=50, sticky=N)
interestRate = Scale(master, from_=0, to=5,orient=HORIZONTAL,label='Interest Rate', command=lambda root=master:main())
interestRate.set(1)
interestRate.grid(row=3,column=2)
stockPrice = Scale(master, from_=0, to=100,orient=HORIZONTAL,label='Stock Price', command=lambda root=master:main())
stockPrice.set(10.0)
stockPrice.grid(row=3,column=1,pady=10)
strikePrice = Scale(master, from_=0, to=100,orient=HORIZONTAL,label='Strike Price', command=lambda root=master:main())
strikePrice.set (11.0)
strikePrice.grid(row=3,rowspan=2,column=1,sticky=N)
volatility = Scale(master, from_=0, to=10,orient=HORIZONTAL,label='Volatility', command=lambda root=master:main())
volatility.set(1)
volatility.grid(row=3,rowspan=2,column=2,sticky=N)
def quit(master):
master.destroy()
Button(master, borderwidth=0, bg='gray', text="Quit", command=lambda root=master:quit(master)).grid(row=3,rowspan=2,column=2,sticky=S,pady=30)
Button(master, borderwidth=0, bg='gray', text="Calculate").grid(row=3,rowspan=2, column=1,columnspan=1,sticky=S,pady=30)
main()
master.mainloop()