B题分析:
B题是一道经济数据分析
类型的题,难度相对来说不大,选择的人也会比较多,大家可以参考之前的股票板块指数预测模型和量化投资相关的文献。
问题一: 对所提供的各项指标进行分析,从中提取出与“数字经济”板块有关的主要指标。
针对问题一,首先需要析题目所给的指标与“数字经济”板块的相关度。可以选择相关性较高的指标用于预测股票走势,我们来看它与收盘价
相关性较高的指标,来做相关性的分析,此处可以用到的方法比较多,具体可以看下面这篇文章。
我们只需要做一个关于成交量的相关性分析,并且找出相关性较强的指标即可。
问题二:以 2021 年 7 月 14 日至 2021 年 12 月 31 日的每 5 分钟“数字经济”板块指数为训练集,以 2022 年 1 月 4 日至 2022 年 1 月 28 日的每 5 分钟“数字经济”板块指数为测 试集。根据问题(1)提取出来的各项指标对“数字经济”板块指数每 5 分钟成交量进行预测。
问题三:以 2021 年 7 月 14 日至 2021 年 12 月 31 日的每 5 分钟“数字经济”板块指数为训练集,以 2022 年 1 月 4 日至 2022 年 1 月 28 日的每 5 分钟“数字经济”板块指数为测试集。根据(1)和(2)建立模型对每 5 分钟的“数字经济”板块指数(收盘价)进行预测。
针对问题二和问题三,我们需要找到一种有效的预测方法来对成交量和板块指数进行预测,在这里比较推荐的还是LSTM算法,来一步提高模型精度与计算效率。
基于数值优化的LM算法不仅利用了目标函数的一阶导数信息,还利用了目标函数的二阶导数信息。LSTM算法的迭代公式为:
LSTM算法的迭代公式
式中Jk是包含网络误差对权值和阈值一阶导数的Jacobin矩阵,I为单位矩阵,μ为阻尼因子。LM算法根据迭代的结果动态地调整阻尼因子使每次的迭代误差函数值都有所下降,它是梯度下降法和牛顿法的结合,其收敛速度更快。我们需把成交量和收盘价作为输出来进行训练。
首先,导入包,读取数据,并将Dataframe中的数据转化成浮点型,这更符合神经网络模型。
然后,数据处理部分,并将数据贴上标签,然后变换输入数据的形状,LSTM要求输入数据的形状为:[samples, time steps, features]
接着,建立模型,编译,拟合模型
然后,对训练集,测试集做预测,由于之前做了归一化这里预测完后要进行转化
接着,计算训练误差和测试预测误差。
然后,由于数据集的准备方式,我们必须移动预测,以使它们在x轴上与原始数据集对齐,然后画出图像
LSTM完整代码如下:
import numpy
import matplotlib.pyplot as plt
from pandas import read_csv
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset
dataframe = read_csv('airline-passengers.csv', usecols=[1], engine='python')
dataset = dataframe.values
dataset = dataset.astype('float32')
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
# reshape into X=t and Y=t+1
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
# calculate root mean squared error
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
# shift train predictions for plotting
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict
# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()问题四:假设以“数字经济”板块指数为交易对象(在实际交易中指数无法交易,只能交易其中的个股),给定初始资金 100 万元,交易佣金为 0.3%,根据(3)得到的结果对“数字经济”板块每 5 分钟频率价格进行买卖交易,计算在 2022 年 1 月 4 日至 2022 年 1月 28 日期间交易的总收益率、信息比率、最大回撤率。
针对问题四,我们可以理解为双目标规划,需要求解风险最低和利润最大,通过第二、三问预测得到的结果,来定义风险,对于双目标规划的话,有两种处理方式,一种是定义风险最大接受阈值,可以定义不同人群不同接受风险的承受力,使投资模型实用性更强。另外一种处理就是分段优化,先风险最低再利润最高或者先利润最大再风险最低......
后面持续更新思路和代码,欢迎关注公众号:UST数模社 |
|