数学建模——时间序列预测(股价预测)

这篇具有很好参考价值的文章主要介绍了数学建模——时间序列预测(股价预测)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

完整数据及代码:数学建模+时间序列预测+LSTM+股票数据分析-机器学习文档类资源-CSDN下载

1.数据概况 

         股票数据由代码、简称、时间、开盘价、收盘价、最高价、最低价、前收盘价、成交量、成交金额、PE、市净率、换手率组成,其中,代码、简称、时间不用于建模,PE、市净率、换手率数据类型为object,需要转换成float.

数学建模——时间序列预测(股价预测)

数学建模——时间序列预测(股价预测) 

2.数据可视化

        我们建立5日均线数据和10日均线数据进行数据可视化, 由于数据有2433条,无法全部展示,因此,我们只展示绘制2020年11月9日-2021年4月1日的上证指数股票日K线图。

         可以看出,股价波动还是比较大的

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

ax,graph_SH = plt.subplots(figsize=(15, 6))  # 创建fig对象

mpf.candlestick2_ochl(graph_SH, opens=data_sh[:,3],
                      closes=data_sh[:,4],highs=data_sh[:,5],lows=data_sh[:,6],width=0.6,colordown='g',colorup='r',alpha=1.0) # 绘制K线走势

graph_SH.set_title("上证指数-日K线")

graph_SH.set_xlabel("日期")

graph_SH.set_ylabel("价格")

graph_SH.set_xlim(len(data_sh[:,2])-90, len(data_sh[:,2]))  # 设置一下x轴的范围

graph_SH.set_ylim(3300,3800) # y轴范围

graph_SH.set_xticks(range(len(data_sh[:,2])-90, len(data_sh[:,2]), 5))  # X轴刻度设定,每15天标一个日期

graph_SH.grid(True, color='k')

graph_SH.set_xticklabels(
    [data_sh[:,2][index] for index in graph_SH.get_xticks()])  # 标签设置为日期

# X轴每个ticker标签都向右倾斜45度

for label in graph_SH.xaxis.get_ticklabels():
    label.set_rotation(45)

    label.set_fontsize(10)  # 设置标签字号
    
plt.plot(mean_5[-90:],'b') # 5日均线
plt.plot(mean_10[-90:],'y') # 10日均线

plt.show()

数学建模——时间序列预测(股价预测)

 文章来源地址https://www.toymoban.com/news/detail-447812.html

3.股票市盈率与其他指标的相关性

数学建模——时间序列预测(股价预测)

我们可以看到,股票市盈率与其他指标均存在较强的线性相关关系,尤其是与股价相关的数据

 4.稳健性评估

        PSI反映了验证样本在各分数段的分布与建模样本分布的稳定性。在建模中,我们常用来筛选特征量、评估模型稳定性.

        那么,PSI的计算逻辑是怎样的呢?很多博客文章都会直接告诉我们,稳定性是有参照的,因此需要有两个分布——实际分布(actual)和预期分布(expected)。其中,在建模时通常以训练样本(In the Sample, INS)作为预期分布,而验证样本通常作为实际分布。验证样本一般包括样本外(Out of Sample,OOS)和跨时间样本(Out of Time,OOT)

       们从直觉上理解,可以把两个分布重叠放在一起,比较下两个分布的差异有多大

数学建模——时间序列预测(股价预测)

 PSI = SUM( (实际占比 - 预期占比)* ln(实际占比 / 预期占比) )

PSI构建流程:

  • step1:将变量预期分布(excepted)进行分箱(binning)离散化,统计各个分箱里的样本占比。
    注意:
    a) 分箱可以是等频、等距或其他方式,分箱方式不同,将导致计算结果略微有差异;
    b) 对于连续型变量(特征变量、模型分数等),分箱数需要设置合理,一般设为10或20;对于离散型变量,如果分箱太多可以提前考虑合并小分箱;分箱数太多,可能会导致每个分箱内的样本量太少而失去统计意义;分箱数太少,又会导致计算结果精度降低。
  • step2: 按相同分箱区间,对实际分布(actual)统计各分箱内的样本占比
  • step3:计 算各分箱内的A - ELn(A / E),计算index = (实际占比 - 预期占比)* ln(实际占比 / 预期占比) 。
  • step4: 将各分箱的index进行求和,即得到最终的PSI。
def calculate_psi(base_list, test_list, bins=20, min_sample=10):
    try:
        base_df = pd.DataFrame(base_list, columns=['score'])
        test_df = pd.DataFrame(test_list, columns=['score']) 
        
        # 1.去除缺失值后,统计两个分布的样本量
        base_notnull_cnt = len(list(base_df['score'].dropna()))
        test_notnull_cnt = len(list(test_df['score'].dropna()))

        # 空分箱
        base_null_cnt = len(base_df) - base_notnull_cnt
        test_null_cnt = len(test_df) - test_notnull_cnt
        
        # 2.最小分箱数
        q_list = []
        if type(bins) == int:
            bin_num = min(bins, int(base_notnull_cnt / min_sample))
            q_list = [x / bin_num for x in range(1, bin_num)]
            break_list = []
            for q in q_list:
                bk = base_df['score'].quantile(q)
                break_list.append(bk)
            break_list = sorted(list(set(break_list))) # 去重复后排序
            score_bin_list = [-np.inf] + break_list + [np.inf]
        else:
            score_bin_list = bins
        
        # 4.统计各分箱内的样本量
        base_cnt_list = [base_null_cnt]
        test_cnt_list = [test_null_cnt]
        bucket_list = ["MISSING"]
        for i in range(len(score_bin_list)-1):
            left  = round(score_bin_list[i+0], 4)
            right = round(score_bin_list[i+1], 4)
            bucket_list.append("(" + str(left) + ',' + str(right) + ']')
            
            base_cnt = base_df[(base_df.score > left) & (base_df.score <= right)].shape[0]
            base_cnt_list.append(base_cnt)
            
            test_cnt = test_df[(test_df.score > left) & (test_df.score <= right)].shape[0]
            test_cnt_list.append(test_cnt)
        
        # 5.汇总统计结果    
        stat_df = pd.DataFrame({"bucket": bucket_list, "base_cnt": base_cnt_list, "test_cnt": test_cnt_list})
        stat_df['base_dist'] = stat_df['base_cnt'] / len(base_df)
        stat_df['test_dist'] = stat_df['test_cnt'] / len(test_df)
        
        def sub_psi(row):
            # 6.计算PSI
            base_list = row['base_dist']
            test_dist = row['test_dist']
            # 处理某分箱内样本量为0的情况
            if base_list == 0 and test_dist == 0:
                return 0
            elif base_list == 0 and test_dist > 0:
                base_list = 1 / base_notnull_cnt   
            elif base_list > 0 and test_dist == 0:
                test_dist = 1 / test_notnull_cnt
                
            return (test_dist - base_list) * np.log(test_dist / base_list)
        
        stat_df['psi'] = stat_df.apply(lambda row: sub_psi(row), axis=1)
        stat_df = stat_df[['bucket', 'base_cnt', 'base_dist', 'test_cnt', 'test_dist', 'psi']]
        psi = stat_df['psi'].sum()
        
    except:
        print('error!!!')
        psi = np.nan 
        stat_df = None
    return psi, stat_df

 PSI评估标准:

PSI数值越小,两个分布之间的差异就越小,代表越稳定。

数学建模——时间序列预测(股价预测)

4.建立市盈率与其他指标的模型

 首先,我们对数据划分为训练集和测试集,其中,测试集比例为0.2,然后我们对训练集和测试集的特征进行PSI评估,结果发现,特征均很稳定。

数学建模——时间序列预测(股价预测)

 然后,我们对数据进行归一化,分别使用线性模型和随机森林训练模型,在测试集进行评估,结果发现,随机森林的拟合效果更好,我们在使用网格搜索,搜索出效果最优的参数。最后,对模型进行稳健性评估。

数学建模——时间序列预测(股价预测)

 数学建模——时间序列预测(股价预测)

 

数学建模——时间序列预测(股价预测)

 

 数学建模——时间序列预测(股价预测)

 

4.预测下一天的收盘价

我们将数据划分为每15天为一个时间序列,对数据进行标准化,通过构建LSTM模型,激活函数使用selu并使用he_normal初始化,正则化使用l2正则化,训练网络,然后再测试集进行评估并评估模型的稳健性,模型比较稳定。

np.random.seed(42)

model = keras.models.Sequential([
    keras.layers.LSTM(50, return_sequences=True,kernel_initializer="he_normal",kernel_regularizer='l2',
                      input_shape=[None,train_x.shape[2]]),
    keras.layers.BatchNormalization(),
    keras.layers.Activation("selu"),
    keras.layers.LSTM(50,kernel_initializer="he_normal",kernel_regularizer='l2', return_sequences=True),
    keras.layers.BatchNormalization(),
    keras.layers.Activation("selu"),
    keras.layers.TimeDistributed(keras.layers.Dense(1))
])

ear_stop = keras.callbacks.EarlyStopping(patience=10)
model.compile(loss="mse", optimizer="sgd", metrics=["mae"])
history = model.fit(train_x, train_y, epochs=100,callbacks=[ear_stop],
                    validation_data=(valid_x, valid_y))

数学建模——时间序列预测(股价预测) 

 数学建模——时间序列预测(股价预测)

 

到了这里,关于数学建模——时间序列预测(股价预测)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数学建模】《实战数学建模:例题与讲解》第十讲-时间序列预测(含Matlab代码)

    本系列侧重于例题实战与讲解,希望能够在例题中理解相应技巧。文章开头相关基础知识只是进行简单回顾,读者可以搭配课本或其他博客了解相应章节,然后进入本文例题实战,效果更佳。 如果这篇文章对你有帮助,欢迎点赞与收藏~ 时间序列预测是一种预测方法,它通过

    2024年02月03日
    浏览(49)
  • 数学建模--时间序列预测模型的七种经典算法的Python实现

    目录 1.开篇版权提示 2.时间序列介绍  3.项目数据处理 4.项目数据划分+可视化 5.时间预测序列经典算法1:朴素法 6.时间预测序列经典算法2: 简单平均法 7.时间预测序列经典算法3:移动平均法 8.时间预测序列经典算法4:简单指数法  9.时间预测序列经典算法5:Holt线性趋势法

    2024年02月10日
    浏览(42)
  • 金融时间序列预测方法合集:CNN、LSTM、随机森林、ARMA预测股票价格(适用于时序问题)、相似度计算、各类评判指标绘图(数学建模科研适用)

    项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域) :汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用 CSDN 平台,自主完成项目设计升级,提升自

    2024年02月13日
    浏览(39)
  • 【数学建模】时间序列分析

    1.使用于具有时间、数值两种要素 2.数据具有周期性可以使用时间序列分解 叠加模型【Y=T+S+C+I】 序列的季节波动变化越来越大,反映变动之间的关系发生变化 乘积序列【Y=T S C*I】 时间序列波动保持恒定,可以使用叠加模型 数据预处理——开头结尾有缺失值,直接删掉即可

    2024年02月15日
    浏览(43)
  • 数学建模:14 时间序列

    目录 步骤 基本概念 时间序列分解 叠加 / 乘积模型 使用SPSS的实例 步骤 指数平滑模型 Simple模型 线性趋势模型 布朗线性趋势模型 阻尼趋势模型 简单季节性 温特加法模型 温特乘法模型 一元时间序列分析的模型 基础概念 平稳时间序列、白噪声序列 差分方程及其特征方程 滞

    2024年02月09日
    浏览(34)
  • 数学建模--时间序列分析

    目录 1.时间序列 2.平稳时间序列 差分方程 滞后因子 时序平稳性  自回归模型AR(P) 滑动平均模型 MA(q) 自回归移动平均模型ARMA(p,q) 3.matlab时序分析 garchset函数 garchfit函数 4.案例分析         时间序列分析是一种数据分析方法,它研究的对象是代表某一现象的一串随时间

    2024年02月12日
    浏览(42)
  • 【数学建模】--时间序列分析

    时间序列分析概念与时间序列分解模型 定义:时间序列也称动态序列,是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分,分别是描述过去,分线规律和预测未来,本讲将主要介绍时间序列分析中常用的三种模型:季节分解指数

    2024年02月13日
    浏览(43)
  • 数学建模学习笔记(15)时间序列分析

    时间序列的概念 :也称为动态序列,是指将某种现象的指标值按照时间顺序排列而成的数值序列。 时间序列的组成要素 :时间要素、数值要素。 时间序列的分类 : 时期时间序列 :数值要素反应现象在一定时期内的发展的结果; 时点时间序列 :数值要素反映现象在一定时

    2024年02月01日
    浏览(36)
  • 数学建模day15-时间序列分析

            时间序列也称动态序列,是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分,分别是 描述过去、分析规律和预测未来 ,本讲将主要介绍时间序列分析中常用的三种模型: 季节分解、指数平滑方法和ARIMA模型 ,并将结

    2024年01月19日
    浏览(38)
  • 数学建模——确定性时间序列分析方法

    目录 介绍 确定性时间序列分析方法 1、时间序列的常见趋势 (1)长期趋势 (2)季节变动 (3)循环变动 (4)不规则变动 常见的时间序列模型有以下几类 2、时间序列预测的具体方法 2.1 移动平均法 案例1 【符号说明】  【预测模型】 2.2 一次指数平滑预测法 (1)预测模型

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包