作业一:斐波那契数列
# 使用递归
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
# 输出了第10个斐波那契数列
print fib(10)
作业二:国庆期间的Gap差价
#获取数据集
data=get_price('399001.SZ',
'20100101','20200101',
fre_step='1d',
fields = ['open','close'],
skip_paused = False, fq = 'pre')
data
#gap
data['Gap']=data['open']/data['close'].shift(1)-1 #向下移动一格
data['Year']=data.index.year #data.index 本身数据类型已是dtype='datetime64[ns]',所以可以获取.month .year方法
data['Month']=data.index.month
df = data.groupby(['Year','Month']).head(1) #获取每个月第一条数据
GoalGaps=df[df['Month']==10]['Gap']
GoalGaps
import matplotlib.pyplot as plt
GoalGaps.plot()
plt.xlabel('year')
plt.ylabel('Gap')
plt.title('National Day Gaps')
plt.show()
作业三:亚氏期权
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
S0 = 100
r = 0.05
sigma = 0.25
T = 1
I = 50000
M = 50
def gen_sn(M, I, anti_paths=True, mo_match=True):
if anti_paths is True:
sn = npr.standard_normal((M+1, int(I/2)))
sn = np.concatenate((sn, -sn), axis=1)
else:
sn = npr.standard_normal((M+1, I))
if mo_match is True:
sn = (sn-sn.mean())/sn.std()
return sn
S
T
=
S
0
exp
(
(
r
−
1
2
σ
2
)
T
+
σ
T
z
)
S_T=S_0\exp((r-\frac12\sigma^2)T+\sigma\sqrt{T}z)
ST=S0exp((r−21σ2)T+σTz)
其中:
S
T
S_T
ST 为T时刻的指数水平
r
r
r 为无风险利率,以连续利率记
σ
\sigma
σ 为标的的波动率
z
z
z 为标准正态分布随机变量
def asian_option(K, option="call"):
sn = gen_sn(M+1, I) # 生成随机变量z
S = np.zeros((M+1, I)) # 初始化数组
S[0] = S0
dt = 1/50 # dt = T/M 本例中初始化 T=1 M=50
for t in range(1, M+1):
S[t] = S[t-1] * np.exp((r-0.5*sigma**2)*dt + sigma*np.sqrt(dt)*sn[t])
if option == 'call':
hT = np.maximum(S.mean(axis=0)-K, 0)
else:
hT = np.maximum(K-S.mean(axis=0), 0)
C0 = np.exp(-r*T)*1/I*np.sum(hT) # I
return C0
作业四:二分法求解隐含波动率
def bisection(f, a, b, tol, maxiter=100):
c = (a+b)*0.5
n = 1
while n <= maxiter:
c = (a+b)*0.5
if f(c) == 0 or abs(a-b)*0.5 < tol:
return c, n
n += 1
if f(c)*f(a) > 0:
a = c
elif f(c)*f(b) > 0:
b = c
return c, n
bisection(y,0.0000001,1,0.00001,maxiter=100)
作业五:面向对象
罢了
作业六:gamma函数
def gamma(self,interval=None,accuracy=4):
if interval is None:
interval = self.underlying.initial_value / 50.
value_left = self.delta()
initial_del = self.underlying.initial_value + intervial
self.underlying.update(initial_value=initial_del)
value_right = self.delta()
self.underlying.update(initial_value=initial_del - interval)
gamma = (value_right - value_left) / interval
return round(gamma, accuracy)