基于MODWT-WRA对BCOMTR指数进⾏股票溢价预测

 本文针对从Bloomberg上下载的 54个指数日交易收盘价数据,利用Python3.8,在jupyter nootbok上进行各指数溢价的测算,并结合modwt wra对溢价时间序列进行预测和分析。

将BCOMTR指数价格序列应用于MODWT(Modulus Maxima Wavelet Transform)算法,该算法能够将价格信号分解为不同的尺度和频率成分。通过多尺度分析,可以揭示股票价格中的不同时间尺度上的变化模式。接着,在小波峰值分析阶段,通过寻找价格信号中的局部极大值点,可以识别出价格的主要峰值和谷值,反映了价格的重要波动和趋势变化。通过分析这些峰值和谷值之间的关系和幅度变化,可以推测股票溢价的趋势和潜在的转折点。 

需要源数据和ipynb代码文件可关注gz号回复‘333’获取

一、数据准备

1.1 导入数据

import numpy as np
import pandas as pd
import pywt
# 读取股票数据
df= pd.read_csv("Datasets2.csv",header=1)

生成的数据格式如下所示:

 Dates为日期时间,其余列为不同的股票BCOMTR指数(反映了这些商品的价格波动以及通过再投资所获得的收益。)价格,提取‘PX_LAST’进行分析。

data=df[['Dates','PX_LAST']]
# 删除值为 "#NAME?" 的⾏
data = data[data != '#NAME?'].dropna()
data = data.reset_index(drop=True)

 观察股票数据随时间变化如图所示:

data.plot()
plt.grid()

 1.2 计算溢价

假设BCOMTR指数的预期收益率为5%。根据内在价值的计算公式计算BCOMTR指数的内在价值:

其中,intrinsic_value为内在价值,current_price为当前价格,expected_return为预期收益率。

接着通过将当前价格减去内在价值,得到BCOMTR指数的溢价。

# 当前BCOMTR指数的⽔平
current_price = data['PX_LAST']
# 假设BCOMTR指数的预期收益率为5%
expected_return = 0.05
# 计算BCOMTR指数的内在价值
intrinsic_value = current_price / (1 + expected_return)
# 计算溢价
premium = current_price - intrinsic_value
# 打印溢价
print("BCOMTR指数的溢价:", premium)

需要注意的是,本文计算股票溢价的方法并非传统意义上的溢价,即某只股票的价格高于其内在价值的大小。对于综合指数(如BCOMTR),其内在价值的概念并不像单个股票那样明确,因为它是由多个商品价格综合得出的。

文章假定预期收益率(5%)是指一段时间内BCOMTR指数的预期涨幅,而不是指个别商品的预期收益率,那么就可以将这个预期收益率用于计算BCOMTR指数的内在价值。

由于BCOMTR指数是综合商品价格的指数,它不像个别股票那样有明确的内在价值。因此,对综合指数来说,溢价的概念可能并不常用,而更常见的做法是关注指数本身的水平和涨跌幅,以及指数成分的商品价格走势。在本文中,计算出个股的内在价值较为复杂,需要综合考虑股票的各方面因素进行计算,本文重点在于模型的应用,因此选用了此种方法作为溢价进行预测。

最终得到:

 并将数据转化为dataframe:

pr=pd.DataFrame(premium)

二、⽤MODWT-WRA进⾏股票溢价预测

2.1 预测代码

以下是使⽤MODWT-WRA进⾏股票溢价预测的⼀般步骤:

MODWT分解:使⽤MODWT⽅法对股票溢价数据进⾏多尺度分解。MODWT可以将时间序

列分解成低频和⾼频成分,并揭示时间序列在不同尺度上的变化模式。

分析低频成分:通过分析低频成分,可以获取关于⻓期趋势和周期性的信息,以及可能存

在的潜在⻓期关系。

分析⾼频成分:通过分析⾼频成分,可以获取关于短期波动和噪⾳的信息,找出短期价格

的异常变动和不规则模式。

重构和预测:使⽤Wavelet-Based Reconstructive Approximation(WRA)⽅法将分解后的

成分重构回原始序列,从⽽得到预测的股票溢价值。

prices = pr['PX_LAST'].values

# 进⾏多层⼩波分解
wavelet = pywt.Wavelet("db4") # 使⽤Daubechies 4阶⼩波
level = 2 # 定义多层分解的层数
coeffs = pywt.wavedec(prices, wavelet, level=level)

# 预测近似系数和细节系数
pred_steps = 5 # 设置预测的时间步⻓
pred_coeffs = []
for coeff in coeffs:
 padded_coeff = np.pad(coeff, (0, pred_steps), mode='constant')
 pred_coeff = padded_coeff[:len(coeff)]
 pred_coeffs.append(pred_coeff)

# 使⽤⼩波重构预测的未来股票溢价
pred_prices = pywt.waverec(pred_coeffs, wavelet)

# 打印预测的未来股票溢价
print("预测的未来股票溢价:")
print(pred_prices[-pred_steps:])

预测未来五天的股票溢价为:10.6651381 10.79731429 10.77797143 10.77797143 10.86353333

 根据图1价格的变化情况图,结合现有数据的特点和变化情况,我们使用Daubechies 4阶小波,设定多层分解层数为2层,并预测未来5天的BCOMTR指数溢价。 

2.2 预测的时间序列图像

将结果保存到新的列表中,其中新加入五天的日期列表为dd,新加入股票溢价的列表为prediction。

import matplotlib.pyplot as plt
# 绘制历史数据
plt.plot(pr, color='b', label='history',linewidth=0.8)
# 绘制预测数据
plt.plot(dd, prediction, color='red', label='prediction',linewidth=
# 添加图例
plt.legend()
plt.grid()
# 添加标题和轴标签
plt.xlabel('date')
plt.ylabel('value')
# 显示图形
plt.show()

根据上图时间序列显示,蓝色部分为原始数据,红色部分是预测数据。可根据箱线图判断预测结果的准确性。观察预测结果的中位数位置。如果中位数接近预期值或目标值,说明预测结果的整体方向正确。如果中位数偏离预期值较大,可能需要进一步检查模型或数据。如图所示是包含了五个预测值数据的箱线图。

2.3 检验结果准确性

首先使用箱线图判断新加入的数据分布是否符合总体分布的特征。

#cc.loc[‘日期’]=数据
pd.DataFrame(cc).boxplot() #cc为新加入了溢价数据的dataframe

此处以中位数为例进行判断,计算剔除了离群值后原始数据序列的中位数(因为上面的箱线图也剔除了异常数据)。

import numpy as np
data = np.array(pr)
mean = np.mean(data)
std = np.std(data)
# 基于3σ原则,剔除离群值
filtered_data = data[np.abs(data - mean) <= 3 * std]
median = np.median(filtered_data)
print("剔除离群值后的数据序列的中位数:", median)

 观察预测结果的中位数位置,中位数接近预期值,说明预测结果的整体方向正确。原始数据的中位数计算得9.71,与图中中位数进行对比,偏离预期值极小,说明预测结果的整体方向正确。

箱线图只能对预测结果进行初步的定性分析,为了进一步分析结果的准确性,可以结合3σ原则进行分析,假设预测值服从正态分布,并使用标准差和均值来评估其合理性。

import numpy as np
predictions = np.array(cc)
mean = np.mean(predictions)
std = np.std(predictions)
print("预测值的均值:", mean)
print("预测值的标准差:", std)

upper_bound = mean + 3 * std
lower_bound = mean - 3 * std
print("预测值的上限:", upper_bound)
print("预测值的下限:", lower_bound)

首先,计算预测值的均值和标准差。通过使用numpy库中的函数,可以很容易地计算出数据序列的均值和标准差。均值为10.55,方差为3.26。

接下来,计算出均值加减3倍标准差的边界值。根据3σ原则,大约68%的数据应该落在均值加减1倍标准差之间,大约95%的数据应该落在均值加减2倍标准差之间,大约99.7%的数据应该落在均值加减3倍标准差之间。根据计算,预测值的上限为20.32,预测值的下限为0.78。预测结果落于此范围中间,可以认为预测结果合理。

若需要源数据和ipynb代码文件可关注gz号回复‘333’获取

猜你喜欢

转载自blog.csdn.net/celiaweiwei/article/details/131898678
今日推荐