关于如何预测股票价格走势很多人还不了解,今天小编就为大家整理了相关内容,希望对各位有所帮助:
作为大众投资理财方式之一的股票投资,已经得到广大投资者的认可,投资股票市场也已经成为一种时尚。投资者都想在股市中挣大钱,但作为一种投资,有赚就必然有赔,而且赔钱的比例往往比较大。接下来具体说说如何通过期货商品价格波动判断行业个股走势
摘要: 用机器学习来把股价走势安排的明明白白!
机器学习和深度学习已经在金融机构中找到了自己的位置,因为它们能够以高精度预测时间序列数据,并且工程师们仍在继续研究以使模型更好。这篇文章是我使用机器学习来预测股票价格的入门项目。
它基于我的项目AlphaAI,这是一个 堆叠的神经网络架构 ,可以预测各个公司的股票价格。该项目是2018年iNTUtion的 决赛项目 之一。
工作流程
该项目的工作流程基本上是以下步骤:
1.获取股票价格数据;
2.使用小波变换去噪数据;
3.使用 Stacked Autoencoders 提取特征;
4.使用特征训练 LSTM;
5.测试预测准确性的模型;
在这篇文章中,我将详细介绍每个步骤以及为什么做出某些决定。
1.数据采集
pandas_datareader是借助雅虎财经的API,它可以很容易获得股票价格数据,只需使用以下命令即可完成:
stock_data = pdr.get_data_yahoo(self.ticker, self.start, self.end)
2.数据去噪
由于股票市场动态的复杂性,股票价格数据通常充满了可能分散机器学习算法分散趋势和结构的噪声。因此,删除一些噪声是符合我们的诉求,同时也可以保留数据中的趋势和结构。起初,我想使用傅里叶变换(不熟悉的人应该阅读这篇文章),但我认为小波变换可能是保留数据时间因素的更好选择,而不是仅产生基于频率的输出。
小波变换
小波变换与傅立叶变换密切相关,只是用于变换的函数是不同的,并且这种变换发生的方式也略有不同。
过程如下:
1.使用小波变换来变换数据;
2.消除超过完全标准偏差的系数(在所有系数中);
3.反变换新系数以获得去噪数据;
以下是小波变换如何对时间序列数据进行去噪的示例:
如你所见,在去噪版本中不存在初始信号中存在的随机噪声,这正是我们要查看的股票价格数据。
这是去噪数据的代码:
x = np.array(self.stock_data.iloc[i: i + 11, j]) (ca, cd) = pywt.dwt(x, "haar") cat = pywt.threshold(ca, np.std(ca), mode="soft") cdt = pywt.threshold(cd, np.std(cd), mode="soft") tx = pywt.idwt(cat, cdt, "haar")
该库pywt非常适合小波变换,这也极大地减轻了我的负担。
3.提取特征
在大多数机器学习环境中,提取特征需要专家领域知识,这是我没有的奢侈品。我或许可以尝试使用某种形式的技术指标,如平均线或平均收敛差异(MACD)或动量指标,但我觉得盲目地使用它可能不是最优的。
但是,通过使用堆叠自动编码器或其他机器学习算法(如受限的Boltzmann机器),可以实现自动特征提取。由于编码的可解释性与限制Boltzmann机器的概率相比,我选择使用堆叠自动编码器。
堆叠式自动编码器
从本质上讲,堆叠式自动编码器非常适合压缩数据并再次复制数据。我们感兴趣的是压缩部分,因为它意味着重现数据所需的信息以某种方式以压缩形式编码。这表明这些压缩数据在某种程度上可能是我们试图从中提取特征的数据的特征。以下是堆叠自动编码器的网络结构:
输入数据被压缩成所需的许多神经元,并且网络被迫使用自动编码器重建初始数据。这会强制模型提取数据的关键元素,我们可以将其解释为要素。需要注意的一点是,由于没有输入输出对,这个模型实际上属于无监督学习,但输入和输出其实都是相同的。
我们可以使用keras构建这样的模型。
class AutoEncoder: def __init__(self, encoding_dim): self.encoding_dim = encoding_dim def build_train_model(self, input_shape, encoded1_shape, encoded2_shape, decoded1_shape, decoded2_shape): input_data = Input(shape=(1, input_shape)) encoded1 = Dense(encoded1_shape, activation="relu", activity_regularizer=regularizers.l2(0))(input_data) encoded2 = Dense(encoded2_shape, activation="relu", activity_regularizer=regularizers.l2(0))(encoded1) encoded3 = Dense(self.encoding_dim, activation="relu", activity_regularizer=regularizers.l2(0))(encoded2) decoded1 = Dense(decoded1_shape, activation="relu", activity_regularizer=regularizers.l2(0))(encoded3) decoded2 = Dense(decoded2_shape, activation="relu", activity_regularizer=regularizers.l2(0))(decoded1) decoded = Dense(input_shape, activation="sigmoid", activity_regularizer=regularizers.l2(0))(decoded2) autoencoder = Model(inputs=input_data, outputs=decoded) encoder = Model(input_data, encoded3) # Now train the model using data we already preprocessed autoencoder.compile(loss="mean_squared_error", optimizer="adam") train = pd.read_csv("preprocessing/rbm_train.csv", index_col=0) ntrain = np.array(train) train_data = np.reshape(ntrain, (len(ntrain), 1, input_shape)) # print(train_data) # autoencoder.summary() autoencoder.fit(train_data, train_data, epochs=1000)
我使用从2000年到2008年的去噪股票价格数据训练了自动编码器。经过1000个epoch的训练后,RMSE降至0.9左右。然后,我使用该模型将剩余的股票价格数据编码为特征。
4. LSTM模型
LSTM模型不需要介绍,因为它在预测时间序列中变得非常普遍和流行。它从细胞状态的存在中获得了卓越的预测能力,使其能够理解和学习数据的长期趋势。这对我们的股票价格数据尤为重要,下面我将讨论我认为重要的设计选择的某些方面。
优化器
所使用的优化器类型可以极大地影响算法收敛到最小值的速度。此外,重要的是存在一些随机性概念,以避免陷入局部最小值且未达到全局最小值。这其中有一些很棒的算法,但我选择使用Adam优化器。Adam优化器成功的结合了另外两个优化器的优势:ADAgrad和RMSprop。
ADAgrad优化器基本上对每个参数和每个时间步使用不同的学习速率。ADAgrad背后的问题是:不常见的参数必须具有较大的学习率,而频繁的参数必须具有较小的学习率。换句话说,ADAgrad的随机梯度下降更新成为:
,其中
基于已经为每个参数计算的过去梯度来计算学习速率。因此,
其中G是过去梯度平方和的矩阵,这种优化的问题是随着迭代次数的增加,学习率开始迅速消失。
RMSprop考虑通过仅使用一定数量的先前梯度来固定递减的学习速率。更新成为
其中
既然我们已经理解了这两个优化器是如何工作的,那么我们可以研究一下Adam的工作方式。
自适应矩估计(Adam)是另一种通过考虑过去平方梯度的指数衰减平均值来计算每个参数的自适应学习率的方法。这可以表示为
v和m可以分别被认为是梯度的靠前和第二时刻的估计,因此得到自适应矩估计的名称。当这是靠前次使用时,研究人员观察到存在0的固有偏差,他们通过使用以下估计来反驳这一点:
这导致我们进入最终的梯度更新规则
这是我使用的优化器,其好处总结如下:
1. 每个参数和每次迭代的学习率都不同;
2. 与ADAgrad一样,学习并没有减少;
3. 梯度更新使用权重分布矩阵。
正则化
训练模型的另一个重要方面是确保权重不会太大并关注一个数据点,或者称为过度拟合。所以我们应该对大权重设置惩罚(大的程度取决于所使用的常规者的类型)。我选择使用Tikhonov正则化,可以将其视为以下最小化问题:
函数空间在再生核Hilbert空间(RKHS)中确保了规范的概念存在。这允许我们将规范的概念编码到我们的正则化器中。
Dropout
一种新的防止过度拟合的方法,具体用在当一些神经元突然不起作用时会发生什么。这迫使模型不要过度依赖任何神经元组,而是考虑所有这些神经元。dropout已经发现它们可以使神经元更加健壮,从而使它们能够预测趋势,而无需关注任何一个神经元。以下是使用dropout的结果:
5.模型实施
上述所有分析都可以在keras及其功能API轻松地实现。这是模型的代码(查看整个代码,查看我的GitHub:AlphaAI)
class NeuralNetwork: def __init__(self, input_shape, stock_or_return): self.input_shape = input_shape self.stock_or_return = stock_or_return def make_train_model(self): input_data = kl.Input(shape=(1, self.input_shape)) lstm = kl.LSTM(5, input_shape=(1, self.input_shape), return_sequences=True, activity_regularizer=regularizers.l2(0.003), recurrent_regularizer=regularizers.l2(0), dropout=0.2, recurrent_dropout=0.2)(input_data) perc = kl.Dense(5, activation="sigmoid", activity_regularizer=regularizers.l2(0.005))(lstm) lstm2 = kl.LSTM(2, activity_regularizer=regularizers.l2(0.01), recurrent_regularizer=regularizers.l2(0.001), dropout=0.2, recurrent_dropout=0.2)(perc) out = kl.Dense(1, activation="sigmoid", activity_regularizer=regularizers.l2(0.001))(lstm2) model = Model(input_data, out) model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mse"]) # load data train = np.reshape(np.array(pd.read_csv("features/autoencoded_train_data.csv", index_col=0)), (len(np.array(pd.read_csv("features/autoencoded_train_data.csv"))), 1, self.input_shape)) train_y = np.array(pd.read_csv("features/autoencoded_train_y.csv", index_col=0)) # train_stock = np.array(pd.read_csv("train_stock.csv")) # train model model.fit(train, train_y, epochs=2000)
结果
这些是我对各公司的预测结果。
对于雪佛龙来说,MSE是2.11
对于埃克森美孚,MSE为0.0945
很明显,使用这种神经网络架构的结果令人印象深刻,并且如果实施到策略中可以是有利可图的。
在线学习
除了从历史数据中学习模型之外,我还想让模型实时学习,甚至从预测中学习。因此,我已经使它成为一个学习和预测的在线模型。换句话说,它可以学习历史数据,预测明天的价格,另外当实际价格已知时,它也会学习使用它。所以模型总是在改进。
除了使用实际价格来改善之外,我还考虑制作一个二级模型,该模型使用关于公司的新闻和Twitter的情绪值。我将首先概述如何获取这些数据。
Twitter数据
除了股票价格数据,我还想尝试一些自然语言处理。因此,我尝试深入研究使用来自Twitter和新闻的情绪数据来改进股票预测。
靠前个斗争就是免费获取推文,因为获取整个实时数据的Twitter API已经被禁止。但是,我找到了一个允许我在过去10天内获取推文的API,然后我可以实现某种形式的NLP来从推文中提取情绪数据。这不是最佳的,但对我的在线学习模型仍然有用。
新闻数据
与Twitter类似,获取新闻数据非常困难。我尝试分析彭博文章的网址,但实现从2000年手动报废网站几乎是不可能的。因此,我选择了具有相当强大的抓取模型的Aylien API。
这些新闻文章被删除的条件是他们只包括股票和财经新闻,过滤到前150个Alexa网站,并且使用指数加权移动平均线平均情绪分数,以考虑最近的新闻而不是旧的新闻。
在线模型
鉴于我的情绪分数,我使用额外的神经网络层来更正我的预测误差。但是,在本文发布时,结果不可用,因为生成一个数据点需要一天的时间。
结论
神经网络非常善于预测时间序列数据,当与情感数据结合时,可以真正建立一个实用的模型。虽然这里的结果令人印象深刻,但我仍然想方设法改进它,也许实际上可以从中制定完整的交易策略。目前,我正在研究使用强化学习来开发一个使用预测模型结果的交易代理。
本文由阿里云云栖社区组织翻译。
文章原标题《using-machine-learning-to-predict-stock-prices》
今天市场收盘虽然指数涨跌不大,但是个股表现还是很明显分化的;涨10%以上个股107只,另外加上 鸿福前面分享挖掘到的300332天壕环境、600956新天绿能涨幅在9.6%以上没封板 ,对比下跌超9%的票仅9只,算赚钱效应还是不错的,算普涨。 收盘数据看:入选鸿福日线级别股票池数量为570只, 同比昨天收盘统计480只,算上升,说明市场震荡还在持续;
最近有色受大宗商品价格波动影响较大,鸿福晚上给大家分享下:如何通过期货商品价格波动判断行业个股走势?
先拿前段时间玻璃板块来说,大家看看下图,是在郑州期货交易所上市的玻璃主力合约,自去年4月份,玻璃从最低1177元每吨涨到今年7月底的3163元每吨,对该品种来说这是牛市啊,当下从图表看明显是一个头肩顶形态,所以结合看玻璃股调整也正常了。
如果你是曹德旺,是不是笑惨了?市场需求没有停,车间每天24小时嗨起干,企业能不赚钱吗?下图可见福耀玻璃600660股价自去年4月份18元每股涨到*高时65元,18万经过1年不到变65万了,你嗨不嗨?
但是,同样是玻璃,咱们再看另一只票对比就明显感觉:毕竟不是命不由人;
洛阳玻璃600876明显就没有福耀玻璃那么稳且猛了,一年多也就涨1倍;而且最近一波爆涨,还是在玻璃期货价创3000历史新高调整下来后,才爆发。
同样的道理,咱们对比看看上海期货交易所的铝价合约(下图),明显单边牛市,从2020年3月底,11225元每吨,经过362个交易日, 价格飙升到了23895元这已经接近2006年的历史高点了;
主要挖铝矿生产的企业,产品每个月都在涨价供不应求, 你说凭什么中国铝业等龙头不翻倍涨?
中国铝业从去年6月最低2.74元的股价飙到前几天的10.23元,假如自己投1万股相当于投27400元,1年多变成102300元,是不是很爽? 赚钱很难吗?
投资股市要赚钱,说难真不难,难在能否忍受无聊的震荡,能否净心坚守。这也是为何牛市总是赚指数,亏本钱的重要原因 ;
最后,给大家分享个喜悦: 今天起鸿福将每天公布入选股票池数据,比如今天是480只;同比昨天下降了1半多,新老朋友注意了,只要这个数据跌破或者接近200只 ,那就说明市场严重超跌,反弹指日可待。
以上仅供参考,股市有风险,入市需谨慎!感谢新老朋友的关注和支持,觉得鸿福的策略不错,请点赞+转发朋友圈,算是对鸿福的赞赏!
作为大众投资理财方式之一的股票投资,已经得到广大投资者的认可,投资股票市场也已经成为一种时尚。投资者都想在股市中挣大钱,但作为一种投资,有赚就必然有赔,而且赔钱的比例往往比较大。也许有的投资者认为,股市里赚钱无非是低买高卖,然后重复操作,就可以不断获利。这话似乎很有道理,也很正确。然而实际情况却并非如此,很多时候往往买的不是低点却卖在了低点;该卖的时候没卖,该买的时候没买。
造成投资失误的原因就是投资者不知道如何把握买点和卖点。也就是说,投资者没有一个明确的概念要在什么时候买,在什么时候卖,更没有一个合理的止损和止盈计划,这在股市中是非常危险的。我们除了要关注账面上那些时刻变化的数字,更重要的是要关注随时到来的风险与机遇,也就是关注买点和卖点的提示信号,只有这样,才能在股市中做到游刃有余,张弛有度,实现稳定的获利。
股市中,当价格处在明显的上涨行情之中,投资者最关心的是价格是否还会继续上涨。如果能判断价格还会继续上涨,则可以继续加仓做多,进一步增加投资收益。
如何判断价格是否还会继续上涨呢?这需要从三个方面入手,具体如下。
靠前,关注上涨后的调整时间;
第二,关注上涨后的调整空间;
第三,关注价格调整时的量能变化。
一、利用调整时间判断价格是否会继续上涨
价格在分时图经过一波上涨之后,出现回调是必然的。因为价格经过一波上涨,短线获利单有主动止赢的,也有逆势做空的(即本来看空或想猜顶,看价格上涨了,就做空了)。
在价格调整时,我们就要看做多力量和做空力量的对比情况了。如果做多力量很强大,一般不会调整太长时间,因为调整的时间长了,做多力量就会不坚定,所以做多主力会用很短的时间略做调整,然后继续上涨。
图1.1中显示了沈阳机床(000410)11月15日的分时走势图。
11月15日,沈阳机床(000410)开盘略做震荡之后,先是开始一波小幅上涨,成交量放得不大。靠前波上涨之后再度回调,但回调的空间很小,成交量也很小。
价格调整结束后,开始一波快速上涨行情,并且成交量放得很大。在上涨行情中,可以对价格调整的时间进行分析,因为价格调整时间的长短,代表了多方交易的积极性和力量的强弱。如果调整时间较长,说明空方有一定能力压住价格,那么后期继续上涨的难度会比较大。如果调整时间短暂,就说明空方根本没有还手之力,多方力量超强,那么价格继续上涨的概率就很大,只要及时介入多单,赢利是比较容易的事。
二、利用调整空间判断价格是否会继续上涨的技巧
价格经过一波上涨之后,出现了调整走势,如果调整时间较短,那么就可以继续看涨。但如果调整时间略长,就需要结合调整时的空间进一步分析了。
调整时的空间,就是价格出现回调时的幅度大小。一般情况下,回调的幅度越小,则调整的力量越弱,价格继续上涨的概率越大。回调的幅度越大,说明调整的力量越大,价格越不易继续上涨。
图1.2中显示了沈阳机床(000410)10月13日的分时走势图。
10月13日,沈阳机床(000410)开盘小幅震荡,经过一段时间的震荡之后,价格出现了一波快速上拉。注意,这一波急拉是放量上涨的,表明上涨是良性的,随后出现了回调,回调的时间虽然比较长,但空间较小,价格始终在均价线上方,并且回调是缩量,表明回调后仍会上涨,即图中A处。
价格经过较长时间回调之后,再度放量上涨,并且仍是急拉,这时进多单的朋友会有不错的收益。
第二波急拉后,价格再度回调,回调的时间虽然也比较长,但空间较小,并且回调时是缩量的,表明仍会上涨,即图中B处。所以,B处回调结束后仍可以介入多单。
B处经充分调整后,价格再度放量急拉,三波上涨结束后,价格在高位震荡,随后价格出现了回调,这一波回调的时间较长,但价格始终在均价线上方。由于这一波回调是缩量的,所以仍可以看涨,即图中C处。
总之,在对调整进行分析时,调整时的空间最能反映出多空双方的力量对比。只要调整的空间不大,哪怕调整的时间长一些,价格也能继续上涨。因为价格调整的空间小,意味着空方力量不强,也意味着做多主力只是为了清洗短线多单,以便更好地上涨。
所以,通过价格调整的力度变化,便可以精确判断出后期上涨将会延续,这样一来,就不会错过后期的主升浪行情。
三、利用调整时的量能变化判断价格是否会继续上涨的技巧
在判断价格是否会继续上涨时,我们重点关注调整的时间和空间,但也不要忘记量能分析。因为量为价先,没有成交量的有效配合,价格想要继续上涨也是很难的。
在价格调整时,较好成交量是萎缩的,并且缩得越小越好。成交量在调整区间明显萎缩,意味着之前的做多资金没有大规模平仓,并且调整时也没有大资金进场做空,因此,价格后期继续上涨的概率就会很大。
将调整的时间、空间及量能变化进行综合分析,我们就可以全面了解盘中多空力量的对比情况,从而更加精准地判断价格是否会继续上涨。
图1.3中显示了中国中车(601766)2月10日的分时走势图。
2月10日,中国中车(601766)开盘略高开,然后就开始震荡上涨,并且是放量上涨的。这一波上涨结束后,价格出现了回调,不过回调是缩量的,并且回调的空间不大,这表明回调后仍会上涨,所以仍可以介入多单,即图中A处。
价格经过充分调整后再度上涨,并且伴随着放量,所以上涨仍是良性的。
第二波上涨之后,价格再度回调,不过回调是缩量的,并且回调的空间不大,这表明回调后仍会上涨,所以仍可以介入多单,即图中B处。
B处价格经过充分调整后再度上涨,但第三波上涨没有放量,这表明价格上涨很可能不是良性的,所以多单要注意止赢。
以上就是如何预测股票价格走势?如何通过期货商品价格波动判断行业个股走势?的详细内容,希望通过阅读小编的文章之后能够有所收获!更多请关注壹榜财经其它相关文章!