首页 > 编程语言 >Python进行金融特征的估计和分类,及如何构建深度RNN

Python进行金融特征的估计和分类,及如何构建深度RNN

时间:2024-03-17 18:31:57浏览次数:26  
标签:RNN Python np train 构建 test model data

8.5 金融特征 RNN 的应用不仅限于原始价格或收益率数据,还可以包括附加特征以改进它的预测性能。 以下 Python 代码向数据集中添加了典型的金融特征。 In [77]: data = generate_data() In [78]: data['r'] = np.log(data / data.shift(1)) In [79]: window = 20 data['mom'] = data['r'].rolling(window).mean() ➊ data['vol'] = data['r'].rolling(window).std() ➋ In [80]: data.dropna(inplace=True) ➊ 增加时间序列动量特征。 ➋ 增加滚动波动率特征。 8.5.1 估计 在估计任务中,样本外准确率可能会显著下降,这有些出人意料。换句话说,在这种特殊 情况下添加金融特征并没有观察到任何改进。 In [81]: split = int(len(data) * 0.8) In [82]: train = data.iloc[:split].copy() In [83]: mu, std = train.mean(), train.std() ➊ In [84]: train = (train - mu) / std ➋ In [85]: test = data.iloc[split:].copy() In [86]: test = (test - mu) / std ➌ In [87]: g = TimeseriesGenerator(train.values, train['r'].values, length=lags, batch_size=5) ➍ In [88]: set_seeds() model = create_rnn_model(hu=100, features=len(data.columns), layer='SimpleRNN')200 | 第 8 章 In [89]: %%time model.fit_generator(g, epochs=100, steps_per_epoch=10, verbose=False) ➍ CPU times: user 5.24 s, sys: 1.08 s, total: 6.32 s Wall time: 2.73 s Out[89]: In [90]: g_ = TimeseriesGenerator(test.values, test['r'].values, length=lags, batch_size=5) ➎ In [91]: y = model.predict(g_).flatten() ➎ In [92]: accuracy_score(np.sign(test['r'].iloc[lags:]), np.sign(y)) ➎ Out[92]: 0.37299771167048057 ➊ 计算训练数据的一阶矩和二阶矩。 ➋ 对训练数据应用高斯归一化。 ➌ 对测试数据应用高斯归一化(基于来自训练数据的统计数据)。 ➍ 在训练数据上拟合模型。 ➎ 在测试数据上测试模型。 8.5.2 分类 迄今为止的分析都在使用 Keras 中的 RNN 模型进行估计,以预测金融工具价格的未来方 向。我们所关心的问题可能会更好地直接转换为分类问题。以下 Python 代码会处理二进制 标签数据并直接预测价格变动的方向。这次我们使用 LSTM 层,即使对于相对少量的隐藏单 元和有限的几个训练轮数,样本外的准确率也相当高。该方法通过适当调整类权重来解决 类别不平衡的问题。在这种情况下,预测准确率非常高,约为 65%。 In [93]: set_seeds() model = create_rnn_model(hu=50, features=len(data.columns), layer='LSTM', algorithm='classification') ➊ In [94]: train_y = np.where(train['r'] > 0, 1, 0) ➋ In [95]: np.bincount(train_y) ➌ Out[95]: array([2374, 1142]) In [96]: def cw(a): c0, c1 = np.bincount(a) w0 = (1 / c0) * (len(a)) / 2 w1 = (1 / c1) * (len(a)) / 2 return {0: w0, 1: w1} In [97]: g = TimeseriesGenerator(train.values, train_y, length=lags, batch_size=5)循环神经网络 | 201 In [98]: %%time model.fit_generator(g, epochs=5, steps_per_epoch=10, verbose=False, class_weight=cw(train_y)) CPU times: user 1.25 s, sys: 159 ms, total: 1.41 s Wall time: 947 ms Out[98]: In [99]: test_y = np.where(test['r'] > 0, 1, 0) ➍ In [100]: g_ = TimeseriesGenerator(test.values, test_y, length=lags, batch_size=5) In [101]: y = np.where(model.predict(g_, batch_size=None) > 0.5, 1, 0).flatten() In [102]: np.bincount(y) Out[102]: array([492, 382]) In [103]: accuracy_score(test_y[lags:], y) Out[103]: 0.6498855835240275 ➊ 用于分类的 RNN 模型。 ➋ 二元训练标签。 ➌ 训练标签的组频率。 ➍ 二进制测试标签。 8.5.3 深度RNN 最后,本章将演示深度 RNN,它是具有多个隐藏层的 RNN。如同创造深度 DNN 一样简 单,唯一的要求是对于非最终隐藏层,参数 return_sequences 需要被设置为 True。以下用 于创建深度 RNN 的 Python 函数还添加了 Dropout 层以避免潜在的过拟合,预测准确率与 上一节中的预测准确率相当。 In [104]: from keras.layers import Dropout In [105]: def create_deep_rnn_model(hl=2, hu=100, layer='SimpleRNN', optimizer='rmsprop', features=1, dropout=False, rate=0.3, seed=100): if hl ➊ if layer == 'SimpleRNN': layer = SimpleRNN else: layer = LSTM model = Sequential() model.add(layer(hu, input_shape=(lags, features), return_sequences=True, )) ➋ if dropout: model.add(Dropout(rate, seed=seed)) ➌ for _ in range(2, hl): model.add(layer(hu, return_sequences=True)) if dropout: model.add(Dropout(rate, seed=seed)) ➌202 | 第 8 章 model.add(layer(hu)) ➍ model.add(Dense(1, activation='sigmoid')) ➎ model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) return model In [106]: set_seeds() model = create_deep_rnn_model( hl=2, hu=50, layer='SimpleRNN', features=len(data.columns), dropout=True, rate=0.3) ➊ In [107]: %%time model.fit_generator(g, epochs=200, steps_per_epoch=10, verbose=False, class_weight=cw(train_y)) CPU times: user 14.2 s, sys: 2.85 s, total: 17.1 s Wall time: 7.09 s Out[107]: In [108]: y = np.where(model.predict(g_, batch_size=None) > 0.5, 1, 0).flatten() In [109]: np.bincount(y) Out[109]: array([550, 324]) In [110]: accuracy_score(test_y[lags:], y) Out[110]: 0.6430205949656751 ➊ 保证最少有两个隐藏层。 ➋ 第一个隐藏层。 ➌ Dropout 层。 ➍ 最终隐藏层。 ➎ 建立分类模型。 8.6 结论 本章基于 Keras 库介绍了 RNN 模型,并说明了这种神经网络在金融时间序列数据中的应 用。从 Python 语言的角度看,使用 RNN 与使用 DNN 并无太大区别。一个主要区别是训 练数据和测试数据必须以序列形式呈现给各自的方法,但是通过应用 TimeseriesGenerator 函数可以轻松实现这一点,该函数使用的生成器对象会将序列数据转换为 Keras 中的 RNN 能处理的数据。 本章中的示例适用于金融价格序列和金融收益率序列。此外,我们还可以轻松添加金融特 征,比如时间序列动量。为模型创建提供的函数可以使用 SimpleRNN 层或 LSTM 层以及不同 的优化器等,还可以在浅层神经网络和深层神经网络的背景下对估计和分类问题进行建模。 在预测市场方向时,分类示例得到的样本外预测准确率相对较高,但对估计示例而言并没 有那么高,甚至可能很低。

标签:RNN,Python,np,train,构建,test,model,data
From: https://blog.csdn.net/weixin_44731078/article/details/136786180

相关文章

  • 自学Python day 5
    今天是周日,时间比较多,所以今天的内容很多首先了解了什么是比较运算符以及如何使用result=10>5print(f"10>5的结果是:{result},类型是:{type(result)}")result="it"=="itt"print(f"字符串it和itt是否相等,结果是:{result},类型是:{type(result)}")#比较运算符的......
  • Python闭包是什么?
    问1:Python闭包是什么?在Python中,闭包(Closure)是一种函数,它能够记住自己被定义时的环境。闭包允许访问定义在闭包函数之外的变量。闭包有三个特点:必须有一个内嵌函数。内嵌函数必须引用外部函数中的变量。外部函数的返回值必须是内嵌函数。闭包的作用:闭包可以保持外部函数......
  • Python - 安装依赖包,发现与其他包版本冲突 ResolutionImpossible
    问题表现Tofixthisyoucouldtryto:1.loosentherangeofpackageversionsyou'vespecified2.removepackageversionstoallowpipattempttosolvethedependencyconflictERROR:ResolutionImpossibleERROR:Cannotinstalltensorboard==1.10.0,tens......
  • Python模块百科_操作系统接口_os[四]
    Python模块百科_操作系统接口_os[四]os---多种操作系统接口【第一部分】一、相关模块1.1os.path文件路径1.2fileinput文件读取1.3tempfile临时文件和目录1.4shutil高级文件和目录1.5platform操作系统底层模块二、关于函数适用性的说明2.1与操作系统相同的......
  • Python面向对象编程:合集篇(类、对象、封装、继承和多态)
    Python语言设计之初,就是为了面向对象。所以Python的面向对象更加易于理解。如果你以前学过Java、C++你大概就懂得什么是面向对象,但如果你是第一门编程语言就选择Python,那么也不要害怕。这篇文章,我们将会尽量详细的讲解,把Python面向对象编程的知识讲清楚。接下来我们先来简单的......
  • 基于Django高校校园二手书籍交易系统设计与实现(Pycharm+Python+Mysql)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • python——代码格式化
    风格与PEP8编写可读代码的一种简单方式是遵循风格指南,它概述了软件项目应该遵循的一组格式化规则。Python改进提案(PythonEnhancementProposal 简称PEP8)就是由Python核心开发团队编写的这样一种风格指南。PEP8甚至还建议:知道什么时候应该不一致——风格指南的建议并非放之......
  • 深度学习入门基于python的理论与实现-第五章误差反向传播法(个人向笔记)
    目录计算图链式法则反向传播加法结点的反向传播乘法结点的反向传播计算图计算图是一种图形化表示计算过程的方法,通常用于机器学习和深度学习中。在计算图中,节点代表操作(例如加法、乘法等),边代表数据流动(即操作的输入和输出)。通过计算图,可以清晰地展示计算过程中各个操作之间的依......
  • python解包是什么?
    在Python中,解包(unpacking)是一种将可迭代对象中的元素分配给变量的技术。这意味着你可以一次性从列表、元组、字符串或任何可迭代对象中提取多个值,并将它们赋值给多个变量。解包可以用于简化代码,使其更易于阅读和维护。基本解包基本解包是将可迭代对象中的元素一一对应地赋值给变......
  • Visual Studio Code中Python安装库文件遇到的问题
    不知道怎么安装库文件,在网上搜索出来好多都是VS2019版本,与现在的2023版本界面不太一样,但是还是可以通过pip安装,之前换过国内的源(现在已经忘了,果然不记录光靠脑子是不行的),用的是清华的源下载速度还可以。安装xlwt库时成功,但是安装BeautifulSoup库时报错,×Gettingrequirement......