Professional Documents
Culture Documents
QF205 Week 10
QF205 Week 10
QF205 Week 10
001
001/137
QF205 - Computing Technology For Finance
Week 10
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Preparations
Dr. Zhao Yibao Get your laptop ready.
Senior Lecturer
Of Quantitative
Launch Jupyter notebook and open “QF205 Notebook WK10.ipynb”.
Finance
Slide
002
002/137
Quick Review of Week 09
Classes
Class Attributes and Instance Attributes
Instance Methods, Class Methods and Static
QF205
Methods COMPUTING
TECHNOLOGY
Scope and Namespace (Functions vs Classes) FOR FINANCE
Inheritance
Private Attributes
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
003
001/137
This week, we’ll explore Numpy, Pandas and
Matplotlib and their applications in
Method (revisited)
candlestick chart?
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
21 lines
12 x[x<=0]=0 QF205
13 y=x.diff() COMPUTING
14 idxSell=y.index[y<0] TECHNOLOGY
FOR FINANCE
15 idxBuy=y.index[y>0]
16 data['crossSell']=np.nan
17 data.loc[idxSell,'crossSell']=data.loc[idxSell,'Close']
18 data['crossBuy']=np.nan
19 data.loc[idxBuy,'crossBuy']=data.loc[idxBuy,'Close']
20 data[['Close', '15d', '50d','crossSell','crossBuy']].plot( Dr. Zhao Yibao
style=['k-','b-','c-','ro','yo'],linewidth=1) Senior Lecturer
21 plt.show() Of Quantitative
Finance
Slide
010
002/137
Read a CSV (comma-separated) file into DataFrame (pandas.read_csv)
Comparison operators on DataFrame, Series and Numpy ndarrays
Logical operators on DataFrame, Series and Numpy ndarrays
Drop rows and columns in DataFrame (pandas.DataFrame.drop)
DataFrame and Series
Rolling window calculations (pandas.Series.rolling)
QF205
Subtract two Series (-) COMPUTING
TECHNOLOGY
Boolean indexing FOR FINANCE
Assignment statements
1st discrete difference of a Series (Series.diff)
DataFrame indexing and selection Dr. Zhao Yibao
Senior Lecturer
Make plots of DataFrame using matplotlib (pandas.DataFrame.plot) Of Quantitative
Finance
Slide
011
002/137
QF205
*** COMPUTING
TECHNOLOGY
FOR FINANCE
02 import pandas as pd
QF205
03 import numpy as np
COMPUTING
TECHNOLOGY
04 import matplotlib.pyplot as plt
FOR FINANCE
plt.rcParams["figure.figsize"]=[12,8]
(Dr. Z: plt has an attribute rcParams, which is a dictionary-like object.)
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
013
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
dataframe
header='infer'
QF205
COMPUTING
TECHNOLOGY
dataframe
FOR FINANCE
header=None
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative Do Not Test
Finance
Slide
data=pd.read_csv('CC3.SI.csv', names=range(7,0,-1))
018
001/137
header=None
QF205
COMPUTING
dataframe
TECHNOLOGY
FOR FINANCE
names=range(7,0,-1)
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide data=pd.read_csv('CC3.SI.csv', header=0, names=range(7,0,-1))
019
001/137
QF205
COMPUTING
TECHNOLOGY
header=0
+
FOR FINANCE
names=range(7,0,-1)
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Do Not Test
Finance
Slide
020
001/137
QF205
COMPUTING (A) data=pd.read_csv('CC3.SI.csv', header=0, names=range(7,0,-1))
TECHNOLOGY
FOR FINANCE
(B) data=pd.read_csv('CC3.SI.csv', names=range(7,0,-1))
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
data.index
QF205
pandas.Index:
COMPUTING
TECHNOLOGY
FOR FINANCE
Indexing
Slicing
list-like object (Python)
array-like object, 1-D (Numpy)
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
025
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
pandas.Series: One-dimensional
ndarray with axis labels.
pandas.DataFrame: Two-
dimensional size-mutable, tabular
QF205
COMPUTING
data structure with labeled axes
TECHNOLOGY
FOR FINANCE (rows and columns). Can be
thought of as a dict-like container
for Series objects.
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
030
001/137
DataFrame[colname]:
Series corresponding to
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
colname
(Example: data['Open'])
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
031
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
data.values
(numpy.ndarray)
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
data.drop(data.index[data['Volume']==0],inplace=True)
Drop a row.
QF205
COMPUTING
TECHNOLOGY
Do Not Test
FOR FINANCE
Volume=0
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
data['Volume'] is a Series.
data['Volume']==0
QF205
COMPUTING
returns a Series of True and
TECHNOLOGY
FOR FINANCE False with the same labels.
Comparison between
a Series and a scalar
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
results a Series.
Finance
Slide
Boolean Indexing (Dr. Z: Does myList support it?
See Week 10 Extra Exercise.)
037
002/137
Numpy ndarrays
support Boolean QF205
COMPUTING
indexing. TECHNOLOGY
FOR FINANCE
Serieses also
support Boolean
indexing.
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
038
001/137 data.drop(data.index[data['Volume']==0],inplace=True)
data.index
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Do Not Test
It’s gone!
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
If using “inplace=False”,
Dr. Zhao Yibao we’ll get a copy. data will
Senior Lecturer
Of Quantitative remain unchanged.
Finance
Slide
040
001/137
QF205
COMPUTING
We cannot use the “dot notation”
TECHNOLOGY
FOR FINANCE to add a column to a DataFrame.
data['15d']= np.round(data['Close'].rolling(15).mean(),3)
data['50d']= np.round(data['Close'].rolling(50).mean(),3)
Two columns
QF205
COMPUTING
TECHNOLOGY
were added.
FOR FINANCE
dict-like
(Dr. Z: How to add
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
a new item in a
dictionary?)
NaN?
Finance
Slide
043
002/137
1
2
3
4
5 NaN is a float-type number.
6
7 Value comparison with an
8 NaN will always result a QF205
COMPUTING
9 False. TECHNOLOGY
10 FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
np.round(Series, 3)
Series.round(3)
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
045
001/137
x: pandas.core.series.Series
COMPUTING
TECHNOLOGY
FOR FINANCE
Boolean Indexing
Assignment
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Do Not Test
QF205
COMPUTING
Series.diff
TECHNOLOGY
FOR FINANCE
returns a Series of
the same length
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
(and same labels).
Finance
Slide
048
001/137
Boolean Indexing
QF205
COMPUTING
np.logical_or
(element-wise or)
TECHNOLOGY
FOR FINANCE
Do Not Test
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
049
001/137
y is a Series
y.index is DatetimeIndex type
Boolean Indexing
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
idxBuy
idxSell
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
050
001/137
np.nan
Another
QF205
column is
COMPUTING
TECHNOLOGY
FOR FINANCE
created.
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
data['Close'][idxSell]
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE data[idxSell]['Close']
Q: Will the above work too?
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
A: No.
Finance
Slide
053
001/137
In a pandas.DataFrame,
QF205
COMPUTING
rows and columns use
different indexing methods.
TECHNOLOGY
FOR FINANCE
Chained Index
.loc Indexing
Assignment
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
xlim=None, ylim=None,
rot=None, fontsize=None,
colormap=None,
table=False, yerr=None,
xerr=None,
secondary_y=False, Dr. Zhao Yibao
sort_columns=False, Senior Lecturer
**kwds) Of Quantitative
Finance
Slide
057
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Fancy Indexing:
Using a list of
column names as
the index of a
Dr. Zhao Yibao
Senior Lecturer DataFrame results
Of Quantitative
Finance
a DataFrame.
Slide
058
001/137
https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.show.html
Do Not Test
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
candlestick_ohlc
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
fill_between
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
061
001/137
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.fill_between.html
x, y1, y2=0
QF205
COMPUTING
TECHNOLOGY
**kwargs
FOR FINANCE
plt
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
alpha
QF205
COMPUTING color
TECHNOLOGY
FOR FINANCE
data=pd.read_csv('CC3.SI.csv',index_col=0,parse_dates=True)
data.drop(data.index[data['Volume']==0],inplace=True)
ma=data['Close'].rolling(15).mean()
QF205 mstd=data['Close'].rolling(15).std()
COMPUTING
TECHNOLOGY
FOR FINANCE plt.plot(data.index, data['Close'], 'k')
plt.plot(ma.index, ma, 'b')
plt.fill_between(mstd.index, ma-2*mstd, ma+2*mstd,
color='b', alpha=0.2)
plt.show()
Dr. Zhao Yibao
Senior Lecturer (Dr. Z: Do not panic if you see any warning message. Simply amend the code according to the suggestion in
Of Quantitative the warning message.)
Finance
Slide
066
001/137
layoutName: verticalLayout
Do Not Test
1 label
QF205
2 checkbox
COMPUTING
TECHNOLOGY
1 axes
FOR FINANCE
GUI
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
PyQt5
Slide
067
001/137 Do Not Test
QF205
a .ui file +
COMPUTING
TECHNOLOGY
FOR FINANCE
self
ax1
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
plt.setp
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
visible
Finance
Slide
071
001/137 https://matplotlib.org/api/finance_api.html#matplotlib.finance.candlestick_ohlc
A sequence
of sequences.
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Do Not Test
fig=plt.figure()
1
ax=plt.axes()
2
QF205 3
COMPUTING
TECHNOLOGY
FOR FINANCE
QFileDialog.getOpenFileName
options = QFileDialog.Options()
QF205 options |= QFileDialog.DontUseNativeDialog
COMPUTING
TECHNOLOGY fname, _ = QFileDialog.getOpenFileName(self,'Open file',
FOR FINANCE os.getcwd(),'CSV(*.csv)')
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Python
078
001/137
Numpy
Error!
QF205
COMPUTING
Error!
TECHNOLOGY
FOR FINANCE Error!
False
Python
079
001/137
QF205
Numpy
COMPUTING
TECHNOLOGY Error!
FOR FINANCE
numpy.ndarray
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
multi-Dimensional
1D, 2D, 3D, …, n-D, … Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
081
001/137 https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html
numpy.array
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
1 2
3 4 QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
numpy.ndarray
multi-Dimensional
1D, 2D, 3D, …, n-D, … Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
083
001/137
Python
1 2
3 4
QF205
COMPUTING
Numpy DataFrame
TECHNOLOGY
FOR FINANCE (2D only)
Series
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Pandas (1D only)
Slide https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html
084
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
1 2
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
3 4
Finance
Slide
086
001/137
QF205
COMPUTING
TECHNOLOGY
Indexing & Slicing
FOR FINANCE
0 1 2
3 4 5
6 7 8
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
multidimensional indexing
Error
fancy indexing
Error
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
089
001/137
multidimensional indexing
multidimensional slicing
QF205
COMPUTING
TECHNOLOGY
boolean indexing
FOR FINANCE
fancying indexing
combined indexing
QF205
x[1]
COMPUTING
TECHNOLOGY
FOR FINANCE
y=x[1:3]
y is a copy.
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
y=x[1:3]
y is a view. QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
y changed, x also.
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
ndarray x) is a view;
z (fancy indexing of
the ndarray x) is a QF205
COMPUTING
copy.
TECHNOLOGY
FOR FINANCE
x[:2][0]=100
QF205
COMPUTING
(Dr. Z: This is called chained indexing. It is difficult to
TECHNOLOGY
FOR FINANCE tell whether the assignment happens to a copy or a
view of x. It depends on the implementation of
__getitem__ and __setitem__. So, we won’t explore
Dr. Zhao Yibao
further what will happen on it.)
Senior Lecturer
Of Quantitative
Finance
Slide
097
001/137 https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-and-selecting-data
DataFrame
Selection via [ ]
Selection by Position (.iloc)
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
1
QF205
COMPUTING
2
TECHNOLOGY 3
FOR FINANCE
4
5
Indexing:
column
2 +
Series
Fancy indexing:
column
QF205
COMPUTING
3 +
TECHNOLOGY DataFrame
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
indexing
QF205 fancy indexing
COMPUTING
TECHNOLOGY
FOR FINANCE slicing
Boolean indexing
QF205
df.iloc[1] df.iloc[1,:]
COMPUTING
TECHNOLOGY
FOR FINANCE
1
QF205
COMPUTING
2
TECHNOLOGY 3
FOR FINANCE
4
6
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
104
001/137
iloc 1
row 2
QF205
COMPUTING
TECHNOLOGY row 3
FOR FINANCE
row 4
row 5
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative 6
Finance
Slide
105
001/137
.loc
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205 1
COMPUTING
TECHNOLOGY 2
FOR FINANCE 3
4
6
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
107
001/137
QF205
COMPUTING
TECHNOLOGY 3
FOR FINANCE
4
5
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative 6
Finance
Slide
108
001/137
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Row-major order
https://jakevdp.github.io/PythonDataScien
ceHandbook/02.05-computation-on-arrays-
broadcasting.html
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Stretching and
Dr. Zhao Yibao
Broadcasting
Senior Lecturer
Of Quantitative
(ndarray)
Finance
Slide
111
001/137
It seems that
112
001/137
pandas.DataFrame
does not have
ndarray’s
QF205
COMPUTING
TECHNOLOGY
“Stretching and
FOR FINANCE
Q: Why is it 2.0?
A: NaN is float type.
Broadcasting”.
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
𝜏𝜏 = 𝑇𝑇 − 𝑡𝑡
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
3. 𝜏𝜏 → tau
(𝑖𝑖 = 2)
QF205
COMPUTING o (𝑗𝑗 = 0) 𝒇𝒇𝟐𝟐,𝟎𝟎 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓3,1 + 1 − 𝑝𝑝 � 𝑓𝑓3,0 ] ∆𝑡𝑡 → deltaT
TECHNOLOGY o (𝑗𝑗 = 1) 𝒇𝒇𝟐𝟐,𝟏𝟏 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓3,2 + 1 − 𝑝𝑝 � 𝑓𝑓3,1 ]
FOR FINANCE
o (𝑗𝑗 = 2) 𝒇𝒇𝟐𝟐,𝟐𝟐 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓3,3 + 1 − 𝑝𝑝 � 𝑓𝑓3,2 ] 𝒇𝒇𝒊𝒊,𝒋𝒋 → f[i][j]
(𝑖𝑖 = 1)
o (𝑗𝑗 = 0) 𝒇𝒇𝟏𝟏,𝟎𝟎 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓2,1 + 1 − 𝑝𝑝 � 𝑓𝑓2,0 ]
o (𝑗𝑗 = 1) 𝒇𝒇𝟏𝟏,𝟏𝟏 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓2,2 + 1 − 𝑝𝑝 � 𝑓𝑓2,1 ]
(𝑖𝑖 = 0)
o (𝑗𝑗 = 0) 𝒇𝒇𝟎𝟎,𝟎𝟎 = 𝑒𝑒 −𝑟𝑟∆𝑡𝑡 [𝑝𝑝 � 𝑓𝑓1,1 + 1 − 𝑝𝑝 � 𝑓𝑓1,0 ]
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
117
001/137
f[0][0]
f[1][0]
f[1][1]
QF205
COMPUTING f[2][0]
TECHNOLOGY
FOR FINANCE f[2][1]
f[2][2]
𝒇𝒇𝒊𝒊,𝒋𝒋 → f[i][j] f[3][0]
f[3][1]
Dr. Zhao Yibao
Senior Lecturer 𝑓𝑓3,0 = 1.1 → f[3][0]=1.1 f[3][2]
Of Quantitative f[3][3]
Finance
Slide
118
001/137
Three Implementations
3. Numpy ndarray
QF205
COMPUTING For example, 𝑁𝑁 = 3
TECHNOLOGY
FOR FINANCE
𝑓𝑓0,0
𝑓𝑓1,0 𝑓𝑓1,1
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i][j] list, ndarray
𝑓𝑓0,0 N=3
f=[[0.0 for j in range(0,i+1)]
𝑓𝑓1,0 𝑓𝑓1,1
for i in range(0,N+1)]
𝑓𝑓2,0 𝑓𝑓2,1 𝑓𝑓2,2
QF205
𝑓𝑓3,0 𝑓𝑓3,1 𝑓𝑓3,2 𝑓𝑓3,3
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i][j] (list)
COMPUTING
TECHNOLOGY
FOR FINANCE
QF205
COMPUTING
(Numpy ndarray)
TECHNOLOGY
FOR FINANCE
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i,j]
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i][j]
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE for j in range(0,N+1):
fc[N][j]=max(0, S*(u**j)*(d**(N-j))-K)
fp[N][j]=max(0, K-S*(u**j)*(d**(N-j)))
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide
123
001/137
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i][j]
QF205
p1=1-p
COMPUTING ert=math.exp(-r*deltaT)
TECHNOLOGY
FOR FINANCE
for i in range(N-1,0-1,-1):
for j in range(0,i+1):
fc[i][j]=ert*(p*fc[i+1][j+1]+p1*fc[i+1][j])
fp[i][j]=ert*(p*fp[i+1][j+1]+p1*fp[i+1][j])
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide # nested list with for loop
124
001/137 import math
2&3
def V_binomial_tree_py(S,K,r,q,tau,sigma,N=100):
# 1.
deltaT=tau/N
u=math.exp(sigma*math.sqrt(deltaT))
d=1/u
p=(math.exp((r-q)*deltaT)-d)/(u-d)
# 2.
fc=[[0.0 for j in range(0,i+1)] for i in range(0,N+1)]
fp=[[0.0 for j in range(0,i+1)] for i in range(0,N+1)]
for j in range(0,N+1):
fc[N][j]=max(0, S*(u**j)*(d**(N-j))-K)
fp[N][j]=max(0, K-S*(u**j)*(d**(N-j)))
Create fc’s
storage
# 3.
p1=1-p
QF205 ert=math.exp(-r*deltaT)
COMPUTING
TECHNOLOGY for i in range(N-1,0-1,-1):
before using
for j in range(0,i+1):
FOR FINANCE fc[i][j]=ert*(p*fc[i+1][j+1]+p1*fc[i+1][j])
fp[i][j]=ert*(p*fp[i+1][j+1]+p1*fp[i+1][j])
# 4.
fc[i][j].
c=fc[0][0]
p=fp[0][0]
return (c, p)
if __name__=='__main__':
Dr. Zhao Yibao S=50.0; K=50.0; tau=183/365;
sigma=0.4; r=0.04; q=0.01
Senior Lecturer print('Call: {0[0]}, Put: {0[1]}'.format(
Of Quantitative V_binomial_tree_py(S,K,r,q,tau,sigma)))
Finance
Slide # nested list with list comprehension
125
001/137 import math
Create fc’s
def V_binomial_tree_py2(S,K,r,q,tau,sigma,N=100):
# 1.
deltaT=tau/N
u=math.exp(sigma*math.sqrt(deltaT))
d=1/u
p=(math.exp((r-q)*deltaT)-d)/(u-d)
# 2.
storage
before using
fc=[0]*(N+1)
fp=[0]*(N+1)
# 3.
fc[i].
p1=1-p
QF205 ert=math.exp(-r*deltaT)
COMPUTING
TECHNOLOGY for i in range(N-1,0-1,-1):
fc[i]=[ert*(p*fc[i+1][j+1]+p1*fc[i+1][j]) for j in range(0,i+1)]
FOR FINANCE fp[i]=[ert*(p*fp[i+1][j+1]+p1*fp[i+1][j]) for j in range(0,i+1)]
# 4.
c=fc[0][0]
p=fp[0][0]
return (c, p)
if __name__=='__main__':
(using list comprehension)
Dr. Zhao Yibao S=50.0; K=50.0; tau=183/365;
sigma=0.4; r=0.04; q=0.01
Senior Lecturer print('Call: {0[0]}, Put: {0[1]}'.format(
Of Quantitative V_binomial_tree_py2(S,K,r,q,tau,sigma)))
Finance
Slide
126
001/137
(ndarray)
(Dr. Z: Remember ndarrays
QF205
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i,j] allow vectorized operations?
COMPUTING
TECHNOLOGY
FOR FINANCE
for j in range(0,N+1):
fc[N,j]=max(0, S*(u**j)*(d**(N-j))-K)
j=np.arange(0,N+1);
QF205
COMPUTING
Ss=S*(u**j)*(d**(N-j))
vectorized
operations
TECHNOLOGY
FOR FINANCE
fc[N,:]=np.maximum(0, Ss-K)
𝑦𝑦 = 2𝑥𝑥1 + 3 𝑦𝑦1 𝑥𝑥1 3
� 1 ⟹ 𝑦𝑦 = 2 𝑥𝑥 +
𝑦𝑦2 = 2𝑥𝑥2 + 4 2 2 4
fp[N,:]=np.maximum(0, K-Ss)
Dr. Zhao Yibao 𝒀𝒀 = 2𝑿𝑿 + 𝒃𝒃
Senior Lecturer
Of Quantitative
Finance
0:N+1
Slide
128
001/137 element-wise
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
𝑓𝑓𝑖𝑖,𝑗𝑗 →f[i,j]
QF205 p1=1-p
COMPUTING
TECHNOLOGY ert=math.exp(-r*deltaT)
FOR FINANCE
for i in range(N-1,0-1,-1):
for j in range(0,i+1):
fc[i,j]=ert*(p*fc[i+1,j+1]+p1*fc[i+1,j])
Dr. Zhao Yibao
Senior Lecturer fp[i,j]=ert*(p*fp[i+1,j+1]+p1*fp[i+1,j])
Of Quantitative
Finance
Slide
130
001/137
for i in range(N-1,0-1,-1):
for j in range(0,i+1):
fc[i,j]=ert*(p*fc[i+1,j+1]+p1*fc[i+1,j])
fp[i,j]=ert*(p*fp[i+1,j+1]+p1*fp[i+1,j])
for i in range(N-1,0-1,-1):
fc[i,0:i+1]=ert*(p*fc[i+1,0+1:i+1+1]+p1*fc[i+1,0:i+1])
fp[i,0:i+1]=ert*(p*fp[i+1,0+1:i+1+1]+p1*fp[i+1,0:i+1])
Dr. Zhao Yibao
Senior Lecturer
Of Quantitative
Finance
Slide # Numpy ndarray
131
001/137 import numpy as np
def V_binomial_tree_np(S,K,r,q,tau,sigma,N=100):
# 1.
deltaT=tau/N
u=np.exp(sigma*np.sqrt(deltaT))
d=1/u
p=(np.exp((r-q)*deltaT)-d)/(u-d)
# 2.
fc=np.zeros((N+1,N+1))
fp=np.zeros((N+1,N+1))
j=np.arange(0,N+1,1);
Ss=S*(u**j)*(d**(N-j))
fc[N,:]=np.maximum(0, Ss-K)
fp[N,:]=np.maximum(0, K-Ss)
QF205 # 3.
COMPUTING p1=1-p
ert=np.exp(-r*deltaT)
TECHNOLOGY
for i in range(N-1,0-1,-1):
FOR FINANCE fc[i,0:i+1]=ert*(p*fc[i+1,0+1:i+1+1]+p1*fc[i+1,0:i+1])
fp[i,0:i+1]=ert*(p*fp[i+1,0+1:i+1+1]+p1*fp[i+1,0:i+1])
# 4.
c=fc[0,0]
p=fp[0,0]
return (c, p)
if __name__=='__main__':
Dr. Zhao Yibao S=50.0; K=50.0; tau=183/365;
sigma=0.4; r=0.04; q=0.01
Senior Lecturer print('Call: {0[0]}, Put: {0[1]}'.format(
Of Quantitative V_binomial_tree_np(S,K,r,q,tau,sigma)))
Finance
Slide
132
001/137 Numpy https://docs.scipy.org/doc/numpy/reference/routines.html
numpy.array
numpy.arange
numpy.reshape or numpy.ndarray.reshape
numpy.isin
numpy.linspace
𝜏𝜏 = 𝑇𝑇 − 𝑡𝑡
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
mean
Dr. Zhao Yibao
Senior Lecturer
4 Of Quantitative
Finance
Slide 𝜏𝜏 𝜏𝜏
134
001/137
2
import numpy as np
def V_MonteCharloSimulation(S,K,r,q,tau,sigma,z):
# 2.
QF205 ST=S*np.exp((r-q-0.5*sigma**2)*tau \
COMPUTING
TECHNOLOGY +sigma*np.sqrt(tau)*z)
FOR FINANCE
QF205
COMPUTING
TECHNOLOGY
FOR FINANCE
Next!
IRAS Income Tax
Pandigital Formula
Sudoku Solver
Option Pricing:
Excel!
QF205
COMPUTING
TECHNOLOGY
Black-Scholes Formula
FOR FINANCE