Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >时间序列分析应用:在COVID-19时期预测苹果股票

时间序列分析应用:在COVID-19时期预测苹果股票

作者头像
deephub
发布于 2020-05-09 08:42:31
发布于 2020-05-09 08:42:31
78300
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:0
代码可运行

我们要做什么

  • 步骤1:定义和确定ML的目标
  • 步骤2:设定技术先决条件
  • 步骤3:获取数据
  • 步骤4:准备数据并应用ML进行拟合
  • 步骤5:评价并分析结果

步骤一:定义和确定ML目标

*免责声明:本练习未考虑诸如交易和佣金之类的费用。作者对使用本文承担的风险或利益概不负责

苹果的价格可能随着时间的推移一直在上涨,但也可能像最近几周一样下跌。

我们想要的是检测第二天价格会上升或下降,以便我们可以在前一天买入或卖空。

我们还希望变化率高于0.5%,这样才值得交易。

价格随时间的变化

以上是价格随着时间的变化图像,绿点是价格上涨超过0.5%的天数,红点是价格下降超过0.5%的天数。

让我们定义我们的目标变量

Positive POC:“变化”增加了0.5%以上

Negative POC:“变化”下降超过0.5%

我们通过建立ML模型可以预测股票新闻预测第二天的上涨,并具有以下表现:

这意味着,根据观察结果,该模型预测,第二天价格将上涨0.5%或更多(82倍),正确率是是72%(62倍)。

该比率(精确度:TP / TP&FP)是一项重要指标,因为在此实验中,每当预测“上升”(或预测下降)时,我们都会“投资”,因此我们优先考虑正确的频率——即使我们失去了一些机会。

现在,让我们建立一个模型来预测“牛市”和“熊市”时期的上升和下降。

最近几个月受油和Covid-19影响的苹果价格

步骤二:先决条件

  • 已安装Python 2.6+或3.1+
  • 安装Pandas,sklearn和openblender(使用pip)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pip install pandas OpenBlender scikit-learn

步骤:获取数据

让我们从每日的Apple Stock数据集中获取信息

数据中有当天的百分比变化

让我们通过OpenBlender API获取数据

在Python上,运行以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import the librariesfrom sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_auc_score
from sklearn import metrics
import pandas as pd
import OpenBlender
import json
%matplotlib inline# Specify the action
action = 'API_getObservationsFromDataset'# Specify your Token
token = 'YOUR_TOKEN_HERE'
# Specify the 'Apple Inc. Price' id_datasetparameters = {
      'token' : token,
      'id_dataset':'5d4c39d09516290b01c8307b',
      'consumption_confirmation' : 'on',
      'date_filter':{"start_date":"2017-01-01T06:00:00.000Z",
                     "end_date":"2020-03-29T06:00:00.000Z"}
}# Pull the data into a Pandas Dataframe
df = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)
df.reset_index(drop=True, inplace=True)

注意:要获取秘钥,您需要在openblender.io(免费)上创建一个帐户,您可以在个人资料图标的“帐户”标签中找到该秘钥。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Let's take a look
df.head()

要混合商业新闻,我们需要:

  1. 收集有用的新闻数据,这些数据(从统计角度而言)与我们的目标相关
  2. 将其融合到我们的数据中,使商业新闻的数据与第二天的价格“变化”保持一致(这样,模型就可以学习预测第二天的价格)
  3. 将其转换为数值特征,以便可以使用ML模型。

让我们看一下《华尔街日报》新闻数据集:

还有《今日美国》的Twitter新闻。

注意:之所以选择这些是因为它们很有代表性,但是您可以搜索到其他数百个数据集。

现在,我们创建一个文本矢量化程序,它是OpenBlender上的一个模型,可以将标记(矢量化文本)作为特征提取,就像它是另一个数据集一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
action = 'API_createTextVectorizerPlus'parameters = {
    'token' : token,
    'name' : 'Wall Street and USA Today Vectorizer',
    'sources':[
              {'id_dataset':"5e2ef74e9516294390e810a9",
               'features' : ["text"]},
              {'id_dataset' : "5e32fd289516291e346c1726",
               'features' : ["text"]}
    ],
    'ngram_range' : {'min' : 1, 'max' : 2},
    'language' : 'en',
    'remove_stop_words' : 'on',
    'min_count_limit' : 2
}response = OpenBlender.call(action, parameters)
response

通过上面的代码,我们指定了以下内容:

  • name: 我们将其命名为“ Wall Street and USA Today Vectorizer”
  • sources: 需要数据集的ID和来源列(在这种情况下,两者都只有一个,并且都命名为“文本”)
  • ngram_range: 将被标记化的单词集的最小和最大长度
  • language: 英语
  • remove_stop_words: 它从源中消除了停用词
  • min_count_limit: 单词的最小重复次数(一次出现很少有帮助)

现在,如果我们注意OpenBlender的界面,我们可以看到矢量化器:

它生成了4999个n-gram,在最多2个单词的二进制特征中,如果提到n-gram,则为“ 1”,否则为“ 0”。

步骤三:准备数据集

现在,我们希望矢量化数据在24小时的时间段中压缩并与第二天的Apple股票价格保持一致。

您需要添加矢量转换器的id(它是由API返回的,也可以在Open Blender中获取。)

*注意:要下载所有矢量化数据,您需要支付约6美元的费用,在OpenBlender中将权限升级为“随用随付”。您仍然可以继续减少一小部分数据,以缩短日期间隔。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
action = 'API_getObservationsFromDataset'interval = 60 * 60 * 24 # One dayparameters = {
      'token' : token,
      'id_dataset':'5d4c39d09516290b01c8307b',
      'date_filter':{"start_date":"2017-01-01T06:00:00.000Z",
                     "end_date":"2020-03-29T06:00:00.000Z"},
      'aggregate_in_time_interval' : {
              'time_interval_size' : interval,
              'output' : 'avg',
              'empty_intervals' : 'impute'
      },
      'blends' :
       [{"id_blend" : "5e46c8cf9516297ce1ada712",
         "blend_class" : "closest_observation",
         "restriction":"None",
         "blend_type":"text_ts",
         "specifications":{"time_interval_size" : interval}
       }],
       'lag_feature' : {'feature' : 'change', 'periods' : [-1]}
}df = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)
df.reset_index(drop=True, inplace=True)

这是与以前相同的调用,但带有一些新参数:

  • aggregate_in_time_interval: 按24小时的平均间隔汇总数据,并估算是否存在没有观察到的间隔
  • blends: 按时间加入汇总的24小时内的新闻数据
  • lag_feature: 我们希望“change”功能与过去24小时内发生的新闻保持一致

让我们看一下数据的前几行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.shape)
df.head()

我们有1122个观测值和4908个特征。它们中的大多数是来自矢量化器的n-gram,而且我们还有原始的Apple Stock数据集。

“ lag-1_change”仅将“ change”值与“previous day data”对齐,这正是我们所需要的。最后一个观察结果是NaN,因为这就是“tomorrow”发生的情况。

现在,让我们按照之前的定义创建目标函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Where ‘change’ decreased more than 0.5%
df['negative_poc'] = [1 if val < 0.5 else 0 for val in df['lag-1_change']]# Where ‘change’ increased more than 0.5%
df['positive_poc'] = [1 if val > 0.5 else 0 for val in df['lag-1_change']]df[['lag-1_change', 'positive_poc', 'negative_poc']].head()

步骤三:应用ML并进行拟合

我们需要2种模型,一种模型将预测价格是否会上涨(高于0.5%),另一种模型将预测当量下降,然后将两者合并到交易策略中。

另外,我们希望通过时间序列进行训练和测试,以便模型可以学习更多的信息。

最后,我们想模拟一下,如果我们以$ 1,000美元开始,最终会得到什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# First we create separeate dataframes for positive and negativedf_positive = df.select_dtypes(['number']).iloc[::-1]
for rem in ['negative_poc']:
    df_positive = df_positive.loc[:, df_positive.columns != rem]df_negative = df.select_dtypes(['number']).iloc[::-1]
for rem in ['positive_poc']:
    df_negative = df_negative.loc[:, df_negative.columns != rem]

给定一个数据集和一个目标,下面的函数将返回应用ML的结果以及具有预测与结果的表格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getMetricsFromModel(target, df):
    # Create train/test sets
    X = df.loc[:, df.columns != target]
    X = X.loc[:, X.columns != 'lag-1_change'].values
    y = df.loc[:,[target]].values
    
    # Create X and y.
    div = int(round(len(X) * 0.89))
    
    real_values = df[div:].loc[:,['lag-1_change']].values
    
    X_train = X[:div]
    y_train = y[:div]    X_test = X[div:]
    y_test = y[div:]
    
    # Perform ML
    rf = RandomForestRegressor(n_estimators = 1000, random_state = 1)
    rf.fit(X_train, y_train)
    y_pred = rf.predict(X_test)
    
    # Get Metrics
    print("AUC score:")
    auc = roc_auc_score(y_test, y_pred)
    print(auc)
    print('---')    preds = [1 if val > 0.6 else 0 for val in y_pred]
    print('Confusion Matrix:')
    conf_matrix = metrics.confusion_matrix(y_test, preds)
    print(metrics.confusion_matrix(y_test, preds))
    print('---')
    
    print('Acurracy:')
    acc = accuracy_score(y_test, preds)
    print(acc)
    print('---')
    
    df_compare = pd.DataFrame({'real_values' : real_values.ravel(), 'y_test' : y_test.ravel(), 'preds' : y_pred})
    
    return auc, conf_matrix, acc, df_compare

我们希望通过300个观察值在时间上进行迭代学习,并在接下来的50天中进行预测,因此我们对每次跳跃进行重新训练

在执行此操作时,我们希望从两个模型(负面/正面)中收集建议。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_compare_acc = None
for i in range(0, df_positive.shape[0] - 450, 50):
    print(i)
    print(i + 450)
    print('-')
    auc, conf_matrix, acc, df_compare_p = getMetricsFromModel('positive_poc', df_positive[i : i + 450])
    auc, conf_matrix, acc, df_compare_n = getMetricsFromModel('negative_poc', df_negative[i : i + 450])
    df_compare = df_compare_p[['y_test', 'real_values']]
    df_compare.rename(columns={'y_test':'price_rised_5'}, inplace=True)
    df_compare['F_p'] = df_compare_p['preds']
    df_compare['price_dropped_5'] = df_compare_n['y_test']
    df_compare['F_n'] = df_compare_n['preds']
    df_compare
    if df_compare_acc is None:
        df_compare_acc = df_compare
    else:
        df_compare_acc = pd.concat([df_compare_acc, df_compare], ignore_index=True)

让我们看一下结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_compare_acc

real_values = 价格的实际变化百分比 price_rised_5 = 如果变化> 0.5 F_p = 预测在(0,1)范围内上升 price_dropped_5 = 如果变化> -0.5 F_n =预测在(0,1)范围内变化

我们的组合模型将很简单,如果一种模型推荐而另一种模型不反对,则我们购买/做空:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# This function will run a simulation on all the tested data
# given an invested 'starting_sum' and will return its
# trayectory.def runSimulation(include_pos, includle_neg, starting_sum):
    sum_lst = []
    actual_sum = starting_sum
    for index, row in df_compare_acc.iterrows():        if row['F_p'] > 0.5 and row['F_n'] < 0.5 and include_pos:
            actual_sum = actual_sum + (actual_sum * (row['real_values'] / 100))        if row['F_n'] > 0.5 and row['F_p'] < 0.5 and includle_neg:
            actual_sum = actual_sum - (actual_sum * (row['real_values'] / 100))        sum_lst.append(actual_sum)
    return sum_lst

首先,我们仅使用“积极”预测运行模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum_lst = runSimulation(True, False, 1000)
df_compare_acc['actual_sum'] = sum_lst
print(sum_lst[len(sum_lst)-1])
df_compare_acc.plot(y = ['actual_sum'])

在目前的COVID /石油/经济衰退情况下,这些年来,它绝对暴跌,几乎损失了一半的收益。

仅使用消极预测进行尝试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum_lst = runSimulation(False, True, 1000)
df_compare_acc['actual_sum'] = sum_lst
print(sum_lst[len(sum_lst)-1])
df_compare_acc.plot(y = ['actual_sum'])

它的表现要比积极预测的表现差,但在某些情况下确实表现良好

现在,让我们一起运行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum_lst = runSimulation(True, True, 1000)
df_compare_acc['actual_sum'] = sum_lst
print(sum_lst[len(sum_lst)-1])
df_compare_acc.plot(y = ['actual_sum'])

这是迄今为止表现最好的模型,在3年期结束时的回报率为574.4%,但这些天仍然非常不稳定

至此,自1月20日结束以来,预测已下跌近25%,而苹果价格仅暴跌了20%

下面需要做的是根据情况将积极预测或消极预测放在优先位置

我们还会发布后续文章,其中包含模型的结果,该模型会根据增加或减少最大化回报的时间而在积极/消极预测之间进行切换。

作者:Federico Riveroll

deephub翻译组:孟翔杰

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Windows系统日志分析工具– Log Parser「建议收藏」
可参考文章:日志分析工具 LogParser 学习笔记_Memetali_ss的博客-CSDN博客 写完才看见。吐了
全栈程序员站长
2022/10/04
5.5K0
Windows系统日志分析工具– Log Parser「建议收藏」
[ffffffff0x] 安全蓝队 : windows日志检索和分析
在运维工作过程中,如若windows服务器被入侵,往往需要检索和分析相应的安全日志。除了安全设备,系统自带的日志就是取证的关键材料,但是此类日志数量庞大,需要高效分析windows安全日志,提取出我们想要的有用信息,就显得尤为关键。
r0fus0d
2021/01/06
3.4K0
[ffffffff0x] 安全蓝队 : windows日志检索和分析
Windows主机日志分析办法与思路
看到有人问,windows主机日志怎么做分析,今天就分享一篇文章专门来说说windows主机日志分析。以下所有内容皆属于个人以往工作经验总结出来的,不是什么权威的行业标准,纯属个人理解,仅供参考使用。
FB客服
2021/01/22
1.6K0
Window日志分析
Windows系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。
Bypass
2019/07/08
2.3K0
Window日志分析
在Windows日志里发现入侵痕迹
有小伙伴问:Windows系统日志分析大多都只是对恶意登录事件进行分析的案例,可以通过系统日志找到其他入侵痕迹吗?
Bypass
2020/12/16
1.7K0
内网渗透 | 横向移动中MSTSC的密码获取
④:For Every: cmd开3389 win08 win03 win7 win2012 winxp win08,三条命令即可:
HACK学习
2021/07/21
2.2K0
Window日志分析
前提:开启审核策略,若日后系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等。
全栈程序员站长
2022/09/07
7920
Window日志分析
2024全网最全面及最新且最为详细的网络安全技巧 十一:应急响应系列之Windows,Linux及Web日志分析入侵排查;(2)[含2024护网行动各厂商面试精题及全网查杀工具整合]
Windows系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。
盛透侧视攻城狮
2024/10/21
2960
各种日志分析方式汇总
Windows 系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。
信安之路
2019/07/05
6.3K0
各种日志分析方式汇总
Windows系统安全|Windows Server系统加固
开始-->管理工具-->计算机管理-->本地用户和组-->用户,然后要操作哪个用户就右击,然后属性
谢公子
2022/01/19
2.5K0
Windows系统安全|Windows Server系统加固
闲聊Windows系统日志
最近遇到不少应急都提出一个需求,能不能溯源啊?这个事还真不好干,你把证据,犯案时间都确定的时候,要求翻看监控(日志)对应犯罪嫌疑人时,突然说监控(日志)没有记录。不过现在都要求保留至少6个月的日志,因此这种原因会少了很多,然而我对于Windows中系统日志不了解,在解读时经常摸不着头脑,所以就认真的分析了evtx格式的系统日志。这篇文章可能记录的不是很全面,师傅们多多指教。
FB客服
2018/07/30
12.3K0
闲聊Windows系统日志
Windows系统日志分析_windows系统事件日志
Windows操作系统在其运行的生命周期中会记录其大量的日志信息,这些日志信息包括:Windows事件日志,Windows服务器角色日志,FTP日志,邮件服务日志,MS SQL Server数据库日志等。主要记录行为当前的日期、时间、用户、计算机、信息来源、事件、类型、分类等信息。用户可以通过它来检查错误发生的原因,处理应急事件,提供溯源,这些日志信息在取证和溯源中扮演着重要的角色。
全栈程序员站长
2022/10/04
5.6K0
Windows系统日志分析_windows系统事件日志
Windows日志分析工具_Windows7激活工具
1.日志文件位置 控制面板→ 管理工具 → 事件查看器 或者win + R:eventvwr.msc
全栈程序员站长
2022/10/03
1.3K0
Windows日志分析工具_Windows7激活工具
威胁狩猎系列文章之四到六
Windows 提供了几种在应用程序之间传输数据的方式。其中一种方法是使用动态数据交换 (DDE,Dynamic Data Exchange) 协议。DDE 协议是一组规则集。它在共享数据的应用程序之间发送消息,并使用共享内存 (Shared Memory) 交换数据。应用可以使用 DDE 协议进行一次性的数据传输,也可以在当有新数据可用时互相推送更新做持续性的数据交换。
信安之路
2019/05/15
1.1K0
【攻防实战】Windows系统安全防御全攻略:从账户到日志的终极防护指南
本公众号专注于分享网络工程(思科、华为),系统运维(Linux)、以及安全等方面学习资源,以及相关技术文章、学习视频和学习书籍等。期待您的加入~~~关注回复“724”可领取免费学习资料(含有书籍)。
释然IT杂谈
2025/06/13
3280
【攻防实战】Windows系统安全防御全攻略:从账户到日志的终极防护指南
Windows 系统安全
目前,Windows 系统已经占据了绝大部分的桌面市场,同时在服务器市场也占有较大比重。长期以来,由于病毒攻击、黑客入侵等原因,给人们留下了易受攻击的不好印象。本文将以 Windows 系统安全方面展开分享一些 Windows 系统安全防护措施。
LuckySec
2022/11/02
2.8K0
Windows 系统安全
Windows日志取证
Windows常见安全事件日志ID汇总 适用于:Windows Server 2016
全栈工程师修炼指南
2020/10/23
4.2K0
Windows安全日志7关键事件ID分析
Windows日志里的事件分析有助于在系统出现异常时分析出异常原因,利于针对问题做出系统的修复和预防。今天阿祥就整理出Windows常见的事件,分析这些事件的具体原因,希望对系统运维工程师们有一定的帮助!
ICT系统集成阿祥
2024/12/03
8910
Windows安全日志7关键事件ID分析
Windows日志简介
Windows事件日志中记录的信息中,关键的要素包含事件级别、记录时间、事件来源、事件ID、事件描述、涉及的用户、计算机、操作代码及任务类别等。其中事件的ID与操作系统的版本有关,以下列举出的事件ID的操纵系统为Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本,一般情况下通过事件ID和时间段进行过滤分析
Windows技术交流
2020/04/24
2K0
02Windows日志分析[通俗易懂]
该日志主要记录行为当前的日期、时间、用户、计算机、信息来源、事件、类型、分类等信息
全栈程序员站长
2022/10/04
2K0
推荐阅读
相关推荐
Windows系统日志分析工具– Log Parser「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验