哪吒闹海——金融计算与编程作业题

作业一:斐波那契数列

# 使用递归
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((r21σ2)T+σT z)
其中:

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值