摘要:
合集:AI案例-ML-泛金融业
赛题:2022年第三届“大湾区杯”粤港澳金融数学建模竞赛-B赛题-基于宏观经济周期的大类资产配置策略构建
主办方:广东省工业与应用数学学会与粤港澳国家应用数学中心联合主办
主页:无
AI问题:特征提取
数据集:宏观经济指标数据以及大类资产指数行情数据
数据集价值:构建大类资产配置策略
解决方案:PCA降维和特征信息增益
一、赛题描述
赛题:2022年第三届“大湾区杯”粤港澳金融数学建模竞赛-B赛题-基于宏观经济周期的大类资产配置策略构建
主办方:广东省工业与应用数学学会与粤港澳国家应用数学中心联合主办
主页:无
赛题背景
全球资产配置之父 Gary P.Brinson 的研究表明,从长远看,超过 90% 的投资收益都 是来自于成功的大类资产配置。了解什么是大类资产配置,首先需要了解什么是“大类资产”, 什么是“配置”。我们所说的“大类资产” 的概念,可以理解为具有相似性质资产的聚类, 比如说,无论是投资级债券还是垃圾债券,都属于“债券”这一大类资产。“配置”是根据 投资需求将投资资金在不同资产类别之间进行分配。大类资产配置的根本思想出发点是不把 鸡蛋放在一个篮子里的,构造一个包含多类资产的投资组合。相比于独立资产,大类资产配 置通过分散投资为投资者平滑了投资组合风险。从这个意义上讲,大类资产配置这一工具天 然具备风险控制的优势。 全球范围来看,大类资产配置作为核心投资方法已是业界共识。头部资管公司希望通过 将投资能力建立在大类资产配置和科技平台上的方式,从而突破投资能力天花板,形成规模 效应和网络效应,规模效应是指因规模增大带来的经济效益提高;网络效应是指一个产品或 服务的用户越多,创造的价值就越大;这就意味着大类资产配置使得投资能力随着 AUM(资 产管理规模)增长而持续增强。目前全球资管公司竞争激烈但市场分散, 未来的增长主要来 自份额提高,领先的一站式大类资产配置平台预计将成为终极赢家,先锋基金和贝莱德是最 佳的实践案例。 不过,由于我们很难判断投资组合当中哪一类资产在未来表现会更好,并且我们无法明 确哪一类资产的长期表现能够持续占优于其他资产,这意味着大类资产配置在实践过程中的 必然面临动态调整问题。常见的做法是,当我们有把握判断某一类资产优于其他资产的时候, 自然会提高这一类资产在整体组合的比例。 但是,大类资产配置动态调整的核心在于对未来宏观经济的判断以及大类资产的预测, 只有在准确预测出未来经济状况和资产表现的情况之下,我们才能有效辨别出表现较佳的资 产类别。先锋的 VCMM 全球资产定价模型是其开展资产配置业务的核心模型,它能够有效模 拟美国的宏观经济运行状态,并预测出在某个经济状态下各类资产的风险收益特征以及资产 之间的相关性。然而,针对中国的投资者与投资环境,我们需要有一套更为适合的宏观经济 与大类资产预测模型。
赛题数据
本赛题提供了两大类的数据,宏观经济指标数据以及大类资产指数行情数据。宏观经济指标数据提供了国民经济核算、工业、价格指数、银行与货币、利率汇率、财政、就业与工 资、景气指数以及人口共九大类宏观经济指标的数据,详细指标可以参考文件夹当中《宏观 经济指标总览》,这一数据主要用于帮助学生将经济周期划分成不同经济状态(完成赛题 1、 2 问)。 大类资产指数数据提供了股票、大宗商品、债券和现金及其等价物这四类资产中较为常用指数行情数据,该数据主要用于帮助学生定量计算出某一类资产的风险收益特征,并构造被动型投资组合(完成赛题 3、4 问)。赛题提供的两类数据仅为参考数据,如果学生有特殊需要用额外的指标或者大类资产指 数,可以补充相关数据,但需要说明数据来源并解释为什么要增加相关数据。
任务
请同学们根据所给的宏观经济指标数据、大类资产指数行情数据,通过数学建模,解决以下问题:
- 寻找出高频有效的宏观经济指标,将 2001 年-2021年国内的宏观经济运行状况划 分成不同的经济状态;(比如,美林时钟框架将宏观经济运行状况划分成衰退,复苏,过热 及滞胀四个经济状态)要求宏观经济指标至少选择两个或以上。
- 通过宏观经济模型或其它数学模型模拟中国未来五年的经济增长、通胀、利率(反 映货币政策松紧程度)等宏观经济环境,并说明未来五年中国将面临的经济状态处于第 1 问划分出的经济状态中的什么经济状态。
- 挑选出能够代表四类资产(股票、大宗商品、债券、现金及其等价物)的四个指数, 预测大类资产指数在第 1 问划分出的各种经济状态下的风险收益特征(期望收益,收益率标 准差,夏普比率或其它),以及大类资产指数之间的相关性。
- 基于你们的模型预测出的国内未来五年的经济状态,挑选出合适的大类资产指数构 建投资组合,并预测投资组合的风险收益特征。
二、数据集详情
基本信息
数据结构
以下是数据样例:
宏观经济指标总览.xlsx
一级目录 | 二级目录 |
---|---|
国民经济核算 | 国内生产总值GDP(年) |
中国宏观杠杆率(季) | |
工业 | 工业增加值(年) |
工业企业主要经济指标:分行业 (利润总额、营业利润、营业收入、主营业务收入) | |
工业企业经济效益指标(月) | |
工业产品产量_当月值 | |
价格指数 | 居民消费价格指数(CPI) |
工业生产者出厂价格指数(PPI) | |
工业生产者购进价格指数(PPIRM) | |
商品零售价格指数(RPI) | |
企业商品交易价格指数(CGPI) | |
中国大宗商品价格指数_总指数 | |
银行与货币 | 货币供应量 |
金融机构超额存款准备金率(季) | |
银行间同业拆借利率 | |
央行货币工具(日) | |
央行货币政策(日) | |
公开市场操作(月) | |
公开市场操作(周) | |
利率汇率 | 人民币存贷款利率 |
拆借回购利率 | |
财政 | 国家财政收支 |
就业与工资 | 就业 |
工资 | |
景气指数 | 采购经理指数 |
景气指数 | |
信心指数 | |
人口 | 人口 |
国家财政收支.xlsx
指标名称 | 公共财政收入:当月值 | 财政收支差额:当月值 | 税收收入:当月值 | 非税收入:当月值 | 公共财政支出:当月值 |
---|---|---|---|---|---|
1990-01 | 138.36 | -0.24 | 143.09 | 138.60 | |
1990-02 | 142.93 | -9.62 | 163.09 | 152.55 | |
1990-03 | 227.61 | 26.59 | 237.42 | 201.02 | |
1990-04 | 223.11 | -1.06 | 218.72 | 224.17 | |
1990-05 | 221.22 | -10.80 | 230.23 | 232.02 | |
1990-06 | 261.17 | -15.85 | 267.20 | 277.02 | |
1990-07 | 298.78 | -9.56 | 221.37 | 308.34 | |
1990-08 | 265.45 | -32.60 | 204.94 | 298.05 |
GDPCPI.csv
时间 | CPI | GDP |
---|---|---|
2021-07 | 1.00 | 96639.77 |
2021-08 | 0.80 | 96639.77 |
2021-09 | 0.70 | 96639.77 |
2021-10 | 1.50 | 108079.13 |
2021-11 | 2.30 | 108079.13 |
2021-12 | 1.50 | 108079.13 |
数据集使用许可协议
数据来源:Wind
三、解决方案样例
安装开发包
参考《安装传统机器学习开发包》。使用pip安装factor_analyzer。
pip install factor_analyzer
# 验证
from factor_analyzer import FactorAnalyzer
print(FactorAnalyzer.__version__) # 输出版本号(如 0.4.0)
PCA降维和特征信息增益
主成分分析(PCA)是数据科学的基石工具。PCA的核心是用更少的变量解释原始数据的最大方差,实现数据降维。其本质是寻找数据中的“隐藏坐标系”,通过正交变换将原始变量转换为互不相关的主成分。
关键思想:
- 方差最大化:主成分方向是数据投影方差最大的方向
- 正交性:各主成分之间互不相关(协方差为0)
- 信息保留:前k个主成分需保留原始数据85%-95%的信息量
举个例子:分析学生成绩(语数外物化)时,PCA可能提取出“理科能力”和“文科能力”两个主成分,用二维数据代替五维数据,同时保留核心信息。
源码:PCA降维和特征信息增益.py
这段代码主要用于金融时间序列数据的降维分析和因子提取,重点使用了PCA和因子分析方法。
1. 数据准备
python
data = pd.read_excel(".data-b/附件2:大类资产指数行情数据.xlsx")
- 加载包含股票指数(上证50/沪深300等)和商品指数(南华商品指数等)的历史数据。
2. PCA降维(股票部分)
python
gupiao = data[['上证50','沪深300','中证500','中证1000']]
pca = PCA(n_components=1)
X_new = pca.transform(gupiao)
- 将4个股票指数降维到1维主成分,输出特征值(
explained_variance_
)和特征向量(components_
)。
3. 信息熵计算
python
def info_entropy(attr):
prob = pd.value_counts(attr)/len(attr)
return -sum(np.log2(prob)*prob) # 修正公式符号位置
for i in ['上证50','沪深300','中证500','中证1000']:
print(str(i)+'特征的信息熵:'+str(round(info_entropy(gupiao[i]),4)))
- 计算各股票指数的信息熵,衡量其波动复杂性(熵值越高,不确定性越大)。
输出:
上证50特征的信息熵:8.0568
沪深300特征的信息熵:8.8605
中证500特征的信息熵:7.6419
中证1000特征的信息熵:7.6424
4. 因子分析(商品部分)
python
# 商品
shangpin = data[['南华商品指数','标普高盛商品全收益指数']]
# 载入两个检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity,calculate_kmo
chi_square_value, p_value = calculate_bartlett_sphericity(data[['上证50','沪深300','中证500','中证1000']])
chi_square_value,p_value
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all, kmo_model = calculate_kmo(data[['上证50','沪深300','中证500','中证1000']])
print(kmo_model)
- 使用巴特利特球形检验和KMO检验验证商品数据是否适合因子分析。
输出:0.73541486689923
5. 因子提取与可视化
python
df = data[['上证50','沪深300','中证500','中证1000']]
fa = FactorAnalyzer(1,rotation=None)
fa.fit(df)
ev,v = fa.get_eigenvalues()
plt.scatter(range(1, df.shape[1]+1), ev)
- 提取1个因子并绘制碎石图,判断因子数量合理性。
第三问:求各种风险收益
第三问求各种风险收益.py
import numpy
from pandas import read_csv
from sklearn.decomposition import PCA
import pandas as pd
import math
import numpy as np
import pandas as pd
from factor_analyzer import FactorAnalyzer
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
data = pd.read_excel("./data-b/附件2:大类资产指数行情数据(3、4问)/大类资产指数行情数据.xlsx")
data[['沪深300','南华商品指数','中债-综合财富(3-5年)指数','货币基金']].plot()
# 计算各种收益
def recwve(data):
for j in [i for i in data.columns.tolist()]:
print(j + '的日收益率为:', np.mean(data[j]))
print(j + '的收益率的标准差为:', data[j].std())
mm = np.mean(data[j])
nn = data[j].std()
ss = mm - 0.01059015326852
SR = ss / nn
print(j + '的日夏普比率为:', SR)
SR1 = (mm - 0.01059015326852) / nn * math.sqrt(252)
print(j + '的年夏普比率为:', SR1)
min_periods = 12
# 计算波动率
vol = data[j].rolling(min_periods).std() * np.sqrt(min_periods)
print(j + '波动率为:', np.mean(vol))
recwve(data[['沪深300', '南华商品指数', '中债-综合财富(3-5年)指数', '货币基金']])
min_periods = 12
# 计算波动率
vol = data['沪深300'].rolling(min_periods).std() * np.sqrt(min_periods)
np.mean(vol)
# 衰退
def recwve(data):
for j in [i for i in data.columns.tolist()]:
print(j + '的日收益指数为:', np.mean(data[j]))
print(j + '的收益率的标准差为:', data[j].std())
mm = np.mean(data[j])
nn = data[j].std()
ss = mm - 0.01059015326852
SR = ss / nn
print(j + '的日夏普比率为:', SR)
SR1 = (mm - 0.01059015326852) / nn * math.sqrt(252)
# print(j+'的年夏普比率为:',SR1)
min_periods = 12
# 计算波动率
vol = data[j].rolling(min_periods).std() * np.sqrt(min_periods)
print(j + '波动率为:', np.mean(vol))
recwve(data[['沪深300', '南华商品指数', '中债-综合财富(3-5年)指数', '货币基金']])
python 第三问求各种风险收益.py
输出:
沪深300的日收益率为: 1862.782212955991
沪深300的收益率的标准差为: 1708.1048035753488
沪深300的日夏普比率为: 1.0905487876994608
沪深300的年夏普比率为: 17.31192530901449
沪深300波动率为: 138.46476802537882
南华商品指数的日收益率为: 753.4560684278853
南华商品指数的收益率的标准差为: 688.2923242093855
南华商品指数的日夏普比率为: 1.094659132135565
南华商品指数的年夏普比率为: 17.377175004098987
南华商品指数波动率为: 34.70045840664605
中债-综合财富(3-5年)指数的日收益率为: 97.21772431520188
中债-综合财富(3-5年)指数的收益率的标准差为: 77.97366355999254
中债-综合财富(3-5年)指数的日夏普比率为: 1.2466662424697112
中债-综合财富(3-5年)指数的年夏普比率为: 19.790213072845233
中债-综合财富(3-5年)指数波动率为: 0.7584146288999132
货币基金的日收益率为: 734.0085227314032
货币基金的收益率的标准差为: 641.8253840944943
货币基金的日夏普比率为: 1.1436100079053122
货币基金的年夏普比率为: 18.1542460665724
货币基金波动率为: 3.1810356769947172
沪深300的日收益指数为: 1862.782212955991
沪深300的收益率的标准差为: 1708.1048035753488
沪深300的日夏普比率为: 1.0905487876994608
沪深300波动率为: 138.46476802537882
南华商品指数的日收益指数为: 753.4560684278853
南华商品指数的收益率的标准差为: 688.2923242093855
南华商品指数的日夏普比率为: 1.094659132135565
南华商品指数波动率为: 34.70045840664605
中债-综合财富(3-5年)指数的日收益指数为: 97.21772431520188
中债-综合财富(3-5年)指数的收益率的标准差为: 77.97366355999254
中债-综合财富(3-5年)指数的日夏普比率为: 1.2466662424697112
中债-综合财富(3-5年)指数波动率为: 0.7584146288999132
货币基金的日收益指数为: 734.0085227314032
货币基金的收益率的标准差为: 641.8253840944943
货币基金的日夏普比率为: 1.1436100079053122
货币基金波动率为: 3.1810356769947172
源码开源协议
作者:杜培博