摘要:
合集:AI案例-ML-泛金融业
赛题:AiWin2021机器学习在债券定价中的应用
主办方: 国泰君安
主页:http://www.aiwin.org.cn/competitions/52
AI问题:回归预测问题
数据集:2000年至2021年3月来自Wind终端及其他公开渠道的经济数据:债券收益率数据、宏观经济数据、房地产数据、石油和股市数据。
数据集价值:利用宏观数据、行情数据或者其它特色数据构建特征,进行机器学习建模,对中债10年期国债、中债10年期国开债、中债10年期AAA级地方政府债、中债10年期AAA级城投债以及中债10年期AAA级企业债到期收益率进行预测。
解决方案:实现了一个基于CIR(Cox-Ingersoll-Ross)模型的蒙特卡洛模拟器,用于生成短期利率的模拟路径。
一、赛题简介
问题描述
固定收益证券定价的驱动因素有五个层面,即基本面、政策面、供求面、资金面、情绪面。五个层面之间的相关性又很强,典型的是经济基本面与货币政策面之间的内生关系——央行依据经济基本面制定货币政策,货币政策的目的又是为了调节经济基本面。由于经济结构在变化、市场制度和参与者结构在变化、央行制定政策的依据和逻辑在变化、投资者的决策逻辑在变化、以及其他等等变化因素,固定收益的定价模型很明显也在变化中。影响债券价格的最重要因素是宏观因素,其最典型的数据频率是季度和月度,数据的相对低频导致定价逻辑中归纳的成分被缩小,演绎和博弈的成分被放大。以上因素导致目前市场中对于用量化方法研究固定收益证券并不看好。计量方法在定价与预测中存在若干不足。
- 第一由于经济与市场结构在变化,模型的结构也在发生变化,不同时期资产价格的驱动因素不同,在线性模型中这表现为模型系数的变化。举例说我国10年国债收益率,在2000年到08年间与CPI相关性很明显,之后这种相关性有所减弱。
- 第二是解释变量之间相关性的问题,在计量模型中会导致有偏估计。想要尽可能多尝试一些新的数据构造解释变量,但不可避免地会陷入维度灾难。对于宏观因子,由于经济变量之间有千丝万缕的关系,相关性则会更高一些。滚动地使用Lasso或者使用动态系数模型或许有助于在计量经济方法范围内解决以上问题,但这已经削弱了模型可解释性。
- 第三点是研究对象系统的非线性性质难以用计量模型挖掘。
- 第四是难以确认计量模型的失效究竟是隐藏变量因素还是非线性关系因素。
还有一些其他原因,但以上理由足以使得机器学习方法具有吸引力。
赛题任务
利用宏观数据、行情数据或者其它特色数据构建特征,进行机器学习建模,对中债10年期国债、中债10年期国开债、中债10年期AAA级地方政府债、中债10年期AAA级城投债以及中债10年期AAA级企业债到期收益率进行预测,预测给定的未来时间段(2021.5.6-2021.6.4期间,包含两端日期,共 23 个交易日)的系列十年期债券利率价格,并分析所用特征重要程度,给出相关逻辑解释。
建议采用的建模数据包括但不限于:
(1)技术指标,如用10年期国债在过去30天的平均收益率。
(2)股票市场指标,如沪深300指数及指数的收益率。
(3)经济增长指标,如经济增加值同比、实际消费同比和实际固定资产投资同比。
(4)房地产市场指标,如房地产开发投资、房屋施工面积、房屋新开工面积、房屋竣工面积、商品房销售面积以及商品房销售额的月度同比。
(5)价格指标,如CPI、食品价格指数、能源价格指数、服务业价格指数、PPI和PPIRM。
(6)商品价格指标,如IPE、WTI和Oman的石油现价,以及上海期货交易所的螺纹钢主力合约价格和COMEX的黄金主力合约价格。
(6)货币指标,如M2、社融和信贷总额的同比增长率。
(7)资金市场指标,如Shibor1W。
二、数据集内容
数据集来源
2000年至2021年3月 来自 Wind 终端及其他公开渠道的经济数据。
内容
提供的数据包括:
- 2000 年-2021 年 3 月的各类型债券收益率数据
- 供建模参考的数据:宏观经济数据(按年度、季度、月度周期提供)
- 房地产数据
- 市场数据(如石油、股市的日交易)
房地产数据.月
文件:房地产数据.训练集.月.csv
列名 | 中文名 | 说明 | |
---|---|---|---|
biz_month | string | 月 | 2000-02 |
investment_real_estate_ratio | double | 房地产开发投资完成额累计同比:单位% | |
new_area_ratio | double | 房屋新开工面积累计同比:单位% | |
working_area_ratio | double | 房屋施工面积累计同比:单位% | |
finish_area_ratio | double | 房屋竣工面积累计同比:单位% | |
saled_area_ratio | double | 商品房销售面积累计同比::单位% | |
saled_amount_ratio | double | 商品房销售额累计同比::单位% |
经济数据.年
文件:经济数据.训练数据.年.csv
列名 | 类型 | 含义 | 示例 |
---|---|---|---|
biz_year | int | 年 | 2003 |
fixedinvestment_used | double | 全部工业增加值同比:单位% | 0.0157 |
fixedinvestment_used | double | 社会消费品零售总额:实际同比:单位% | 0.0157 |
经济数据.季
列名 | 类型 | 含义 | 示例 |
---|---|---|---|
biz_season | int | 季 | 2003-03 |
fixedinvestment_used | double | 固定资产投资完成额实际累计同比:单位% | 0.0157 |
经济数据.月
文件:经济数据.训练集.月.csv
biz_month | string | 月 | 2000-02 |
---|---|---|---|
cpi | double | CPI当月同比:单位% | |
cpi_food | double | 食品CPI当月同比::单位% | |
ppi | double | PPI当月同比:单位% | |
ppirm | double | PPIRM当月同比:单位% | |
energy_price_index | double | 能源类大宗商品价格指数 | |
non-manufacturing_pmi | double | 非制造业PMI销售价格指数 | |
m2_ratio | double | M2同比:单位% | |
credit_ratio | double | 国内信贷同比:单位% | |
social finance_ratio | double | 社会融资规模存量同比:单位% |
市场数据.日
文件:市场数据.训练集.日.csv
biz_date | string | 日期 | 43825 |
---|---|---|---|
oil_dtd_spot | double | 英国布伦特Dtd石油现货:单位(美元/桶) | |
luowen_steel_future | double | 螺纹钢加权主力合约平均价:单位(元/吨) | |
gold_comex_future | double | COMEX黄金期货结算价活跃合约:单位(美元/盎司) | |
csi 300_index | double | 沪深300指数 |
各类型债权收益率
列名 | 中文名 | 类型 | 说明 |
---|---|---|---|
biz_date | 日期 | string | |
treasury_bond_rate_1m | 中债国债到期收益率:1个月 | double | |
treasury_bond_rate_3m | 中债国债到期收益率:3个月 | double | |
treasury_bond_rate_6m | 中债国债到期收益率:6个月 | double | |
treasury_bond_rate_1y | 中债国债到期收益率:1年 | double | |
treasury_bond_rate_3y | 中债国债到期收益率:3年 | double | |
treasury_bond_rate_10y | 中债国债到期收益率:10年 | double | |
cdb_rate_6m | 中债国开债到期收益率:6个月 | double | |
cdb_rate_1y | 中债国开债到期收益率:1年 | double | |
cdb_rate_3y | 中债国开债到期收益率:3年 | double | |
cdb_rate_10y | 中债国开债到期收益率:10年 | double | |
loc_rate_6m | 中债地方政府债到期收益率(AAA):6个月 | double | |
loc_rate_1y | 中债地方政府债到期收益率(AAA):1年 | double | |
loc_rate_3y | 中债地方政府债到期收益率(AAA):3年 | double | |
loc_rate_10y | 中债地方政府债到期收益率(AAA):10年 | double | |
cdi_rate_6m | 中债城投债到期收益率(AAA):6个月 | double | |
cdi_rate_1y | 中债城投债到期收益率(AAA):1年 | double | |
cdi_rate_3y | 中债城投债到期收益率(AAA):3年 | double | |
cdi_rate_10y | 中债城投债到期收益率(AAA):10年 | double | |
com_rate_1m | 中债企业债到期收益率(AAA):1个月 | double | |
com_rate_3m | 中债企业债到期收益率(AAA):3个月 | double | |
com_rate_6m | 中债企业债到期收益率(AAA):6个月 | double | |
com_rate_1y | 中债企业债到期收益率(AAA):1年 | double | |
com_rate_3y | 中债企业债到期收益率(AAA):3年 | double | |
com_rate_10y | 中债企业债到期收益率(AAA):10年 | double |
引用要求
@misc{guotaijunan4624,
title = { 2022AIWIN竞赛数据集(国泰君安) }
author = { livingbody },
howpublished = { \url{https://www.heywhale.com/mw/dataset/6374a5f9b1d622f1cb6846ed} }
year = { 2022 }
}
三、解决方案样例
解决方案
固定收益证券定价的驱动因素有五个层面,即基本面、政策面、供求面、资金面、情绪面。CIR模型和蒙特卡洛模拟方法可以用于为固定收益证券定价建模,但它们主要关注利率的动态变化,并不直接涉及基本面、政策面、供求面、资金面和情绪面等五个层面的驱动因素。
1、CIR模型
CIR模型(Cox-Ingersoll-Ross Model)是一种用来模拟利率变化的随机过程模型,特别适用于描述短期利率的动态行为。适用范围:主要用于描述和模拟利率的动态变化。特别适合于短期利率的建模,因为它体现了利率的均值回归特性。固定收益证券(尤其是债券)的价格与利率呈反向变动关系。通过CIR模型预测未来的利率走势,可以间接推算出相应债券价格的变动趋势。这种方法在利率风险管理和对冲策略中非常有用。
2、蒙特卡洛模拟方法
蒙特卡洛模拟产生于在20世纪40年代,是原子弹中研制过程中,为了模拟裂变物质的中子随机扩散现象,由冯·诺伊曼等人发明的一种统计方法。蒙特卡洛并不是发明者,是当时非常出名的赌城。因为该方法和赌博都是概率问题,所以就有了这个名字。蒙特卡洛模拟主要是构造符合一定规则的随机数来解决一些解析解难求或不存在的问题,是金融定价和风险领域常用的方法。利用蒙特卡洛模拟生成大量可能的未来利率场景。根据每种场景下的利率水平计算相应债券的现金流现值,并求其平均值作为定价结果。此外,还可以引入其他变量(如信用利差、流动性溢价等)来更全面地反映市场状况。
本文使用该方法为零息债券 (Zero Coupon Bond) 定价。 定价过程主要分3步:
- 根据利率期限结构(CIR),得到短期利率的模拟公式。
- 根据公式,模拟产生多条模拟路径,每条路径的跨度都是从当前时间至债券到期。
- 根据各模拟路径逐步折现,并折现值均值作为债权价格。
3、五个层面的驱动因素
虽然CIR模型和蒙特卡洛模拟主要聚焦于利率层面,但可以通过以下方式间接融入其他驱动因素:
- 基本面:可以通过调整模型参数来反映经济增长、通货膨胀等宏观经济指标的影响。
- 政策面:政策变动往往直接影响利率水平和走势,可以在模拟过程中引入政策调整的场景。
- 供求面与资金面:这些因素会影响市场的流动性和资金的成本,可以在模拟中加入相应的风险溢价或调整利率曲线的形状。
- 情绪面:市场情绪难以量化,但可以通过引入额外的随机波动项或者调整模型的参数来部分捕捉其影响。
源码结构
ZCB_CIR.ipynb
1、导入开发库
import math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
2、蒙特卡洛方法产生模拟路径
这是核心函数,用于生成利率路径。参数:
- x0:初始利率
- kappa:均值回归速度
- theta:长期均值
- sigma:波动率
- T:总时间
- M:时间步数
- I:模拟路径数
- x_disc:离散化方法(‘exact’精确或其它低精度)
函数实现了两种模拟方法:
- 精确方法:基于非中心卡方分布的特性生成精确样本
- 低精度方法:使用欧拉离散化近似
def CIR_generate_paths(x0, kappa, theta, sigma, T, M, I, x_disc='exact'):
dt = T / M
# x = np.zeros((M + 1, I), dtype=np.float)
x = np.zeros((M + 1, I), dtype=float)
x[0] = x0
xh = np.zeros_like(x)
xh[0] = x0
ran = np.random.standard_normal((M + 1, I))
#高精度模拟
if x_disc is 'exact':
d = 4 * kappa * theta / sigma ** 2 #自由度
c = (sigma ** 2 * (1 - math.exp(-kappa * dt))) / (4 * kappa) #公式1中卡方随机变量前的系数
if d > 1:
for t in range(1, M + 1):
l = x[t - 1] * math.exp(-kappa * dt) / c
chi = np.random.chisquare(d - 1, I) #计算卡方随机变量
x[t] = c * ((ran[t] + np.sqrt(l)) ** 2 + chi)
else:
for t in range(1, M + 1):
l = x[t - 1] * math.exp(-kappa * dt) / c
N = np.random.poisson(l / 2, I)
chi = np.random.chisquare(d + 2 * N, I) #计算卡方随机变量
x[t] = c * chi
#低精度模拟
else:
for t in range(1, M + 1):
xh[t] = (xh[t - 1] + kappa * (theta - np.maximum(0, xh[t - 1])) *
dt + np.sqrt(np.maximum(0, xh[t - 1])) *
sigma * ran[t] * math.sqrt(dt)) #公式2
x[t] = np.maximum(0, xh[t]) #公式3
return x
3、绘制利率路径
用于绘制生成的利率路径。
def plot_paths():
plt.figure(figsize=(9, 5))
plt.plot(range(len(r)), r[:, :100])
plt.xlabel('time step')
plt.ylabel('short rate')
plt.show()
r0, kappa_r, theta_r, sigma_r = [0.01, 0.1, 0.03, 0.2]
T = 2.0 # time horizon
M = 50 # time steps
dt = T / M
I = 50000 # number of MCS paths
#np.random.seed(50000) # seed for RNG
r = CIR_generate_paths(r0, kappa_r, theta_r, sigma_r, T, M, I)
plot_paths()
4、根据路径进行定价
def zcb_estimator(M=50, x_disc='exact'):
dt = T / M
#模拟路径
r = CIR_generate_paths(r0, kappa_r, theta_r, sigma_r, T, M, I, x_disc)
# zcb = np.zeros((M + 1, I), dtype=np.float)
zcb = np.zeros((M + 1, I), dtype=float)
zcb[-1] = 1.0 # final value
#逐步折现
for t in range(M, 0, -1):
zcb[t - 1] = zcb[t] * np.exp(-(r[t] + r[t - 1]) / 2 * dt)
#取均值作为债券价格
return np.sum(zcb, axis=1) / I
5、解析方法定价
def gamma(kappa_r, sigma_r):
return np.sqrt(kappa_r ** 2 + 2 * sigma_r ** 2)
def b1(alpha):
r0, kappa_r, theta_r, sigma_r, t, T = alpha
g = gamma(kappa_r, sigma_r)
return (((2 * g * np.exp((kappa_r + g) * (T - t) / 2)) /
(2 * g + (kappa_r + g) * (np.exp(g * (T - t)) - 1))) **
(2 * kappa_r * theta_r / sigma_r ** 2))
def b2(alpha):
r0, kappa_r, theta_r, sigma_r, t, T = alpha
g = gamma(kappa_r, sigma_r)
return ((2 * (np.exp(g * (T - t)) - 1)) /
(2 * g + (kappa_r + g) * (np.exp(g * (T - t)) - 1)))
def B(alpha):
b_1 = b1(alpha)
b_2 = b2(alpha)
r0, kappa_r, theta_r, sigma_r, t, T = alpha
# expected value of r_t
E_rt = theta_r + np.exp(-kappa_r * t) * (r0 - theta_r)
zcb_value = b_1 * np.exp(-b_2 * E_rt)
return zcb_value
6、通过图形比较两种定价方法
def graphical_comparison(M=50, x_disc='exact'):
MCS_values = zcb_estimator(M, x_disc)
CIR_values = []
dt = T / M
t_list = np.arange(0.0, T + 0.001, dt) # dates of interest
#使用解析法完成模拟路径上个点的定价
for t in t_list:
alpha = r0, kappa_r, theta_r, sigma_r, t, T
CIR_values.append(B(alpha))
# CIR model values given date list
fig, ax = plt.subplots(2, sharex=True, figsize=(8, 6))
ax[0].plot(t_list, MCS_values, 'ro', label='MCS values')
ax[0].plot(t_list, CIR_values, 'b', label='CIR values')
ax[0].legend(loc=0)
ax[0].set_ylim(min(CIR_values) - 0.005, max(CIR_values) + 0.005)
ax[0].set_ylabel('ZCB values')
ax[0].set_title('maturity $T=2$')
ax[1].bar(t_list + 0.025 / 2., MCS_values - CIR_values,
width=0.025)
plt.ylabel('difference')
plt.xlim(min(t_list) - 0.1, max(t_list) + 0.1)
plt.xlabel('time $t$')
plt.tight_layout()
plt.show()
7、通过误差比较两种定价方法
def diffrence_comparison(M=50, x_disc='exact'):
MCS_values = zcb_estimator(M, x_disc)
CIR_values = []
dt = T / M
t_list = np.arange(0.0, T + 0.001, dt) # dates of interest
#使用解析法完成模拟路径上个点的定价
for t in t_list:
alpha = r0, kappa_r, theta_r, sigma_r, t, T
CIR_values.append(B(alpha))
return abs((MCS_values - CIR_values)[0])
diff1=[]
diff2=[]
for i in range(0,1000):
r = CIR_generate_paths(r0, kappa_r, theta_r, sigma_r, T, M, I)
diff1.append(diffrence_comparison())
diff2.append(diffrence_comparison(x_disc='a'))
np_diff1=np.array(diff1)
np_diff2=np.array(diff2)
print(np.mean(np_diff1))
print(np.mean(np_diff2))
运行后输出:
0.000102459200264013
0.0002726849534853664
源码作者
该源码主要基于Yves Hilpisch 的工作,是金融工程和风险管理中常用的工具。
Yves Hilpisch 是一位知名的金融科技专家、作家和企业家,专注于量化金融、人工智能在金融领域的应用以及Python编程。Yves Hilpisch 撰写了多本金融与Python编程相关的书籍,包括:
《Python for Finance: Mastering Data-Driven Finance》(O’Reilly出版) ——金融数据分析与量化建模的经典指南,被广泛用于学术和业界。 《Artificial Intelligence in Finance》(O’Reilly出版) ——探讨AI在金融领域的应用,如预测建模、自然语言处理等。 《Derivatives Analytics with Python》 ——专注于使用Python进行衍生品定价和风险管理。
四、参考资料
ququcai/ZCB_CIR: 使用CIR模型、蒙特卡洛模拟方法为零息债券定价