** 信息:我正在使用 Python 3.10.6**
我目前正在尝试提出一个可以迭代/通过不同利率的债券价格函数。最终目标是创建基于 CIR 模型的债券价格模拟。
基本上,要计算债券价格,我需要预先定义另外两个函数。然后需要将这两个函数相乘并相加,得出债券价格
债券现金流函数:
def bond_cash_flows(maturity, principal=100, coupon_rate=0.03, coupons_per_year=12):
n_coupons= round(maturity*coupons_per_year)
coupon_amt= principal*coupon_rate/coupons_per_year
coupon_times=np.arange(1, n_coupons+1)
cash_flows=pd.Series(data=coupon_amt, index=coupon_times)
cash_flows.iloc[-1] += principal
return cash_flows
折扣因子函数
def discount(t,r):
discounts = pd.DataFrame([(r+1)**-i for i in t])
discounts.index = t
return discounts
最后,债券价格函数
def bond_price(maturity, principal=100, coupon_rate=0.03, coupons_per_year=12, discount_rate=0.03):
cash_flows=bond_cash_flows(maturity, principal, coupon_rate, coupons_per_year)
discounts= discount(cash_flows.index, r=discount_rate/coupons_per_year)
return (pd.DataFrame(cash_flows)*discounts).sum()
什么似乎有效:
什么不起作用: 当我尝试将利率列表插入债券价格公式时,它抛出了这个错误。通常它也会抛出某种尺寸错误,如果不是这个错误信息的话
我想要的输出:
感谢您对此的投入。抱歉,我是 Python 的初学者(但不是金融)
我试着想出函数并将不同的输入更改为某些数据类型,以确保函数可以处理输入。
但是我每次都会因为不同类型的值或尺寸错误而被抛弃。
期望的输出基本上是将参数输入债券价格函数并传递超过 1 个利率的能力,输出是不同利率下的债券价格。
我希望一切都清楚。谢谢
您正在使用变量
discount
作为函数内的局部变量 discount(t, r)
和 bond_price
.
如果你在函数内部设置一个变量的值,python 将其理解为创建一个具有该名称的局部变量。这个本地 变量屏蔽了全局变量。
在你的例子中,
被认为是一个局部变量,它被使用 在被设置之前,因此是错误的。discount
为了解决这个问题,你可以通过在你的函数中放置
global discount
来明确地说它是一个全局的。
请参阅以下参考资料:
例子:
def discount(t,r):
global discounts
discounts = pd.DataFrame([(r+1)**-i for i in t])
discounts.index = t
return discounts
其他解决方案: 您可以通过传递参数而不是依赖全局变量来解决这个问题
例子:
def discount(t, r, discounts):
# we use 'discounts' variable from parameter
# discounts = pd.DataFrame([(r+1)**-i for i in t])
discounts.index = t
return discounts
希望有帮助。
*在 Python 中使用同名变量时要小心。