18910140161

用Python快速分析 可视化和预测股票价格

顺晟科技

2021-06-16 10:43:39

207

用Python快速分析、可视化、预测股价

Table of Contents

加载雅虎财务数据集

探索股票的均线和收益率

移动平均线:识别趋势

回报偏差:用于确定风险和收益

分析竞争对手股票

相关性分析:竞争对手会互相影响吗?

股票收益和风险

预测股价

特色工程

预处理和交叉验证

模型生成的有趣部分——预测过程开始了

简单线性分析和二次判别分析

k最近的邻居(KNN)

评价

绘制预测图

未来的改进/挑战

文森特塔坦

翻译:李杰

整理:柠檬比特

翻译:Python数据方式

img01

前言

有,我的一个朋友告诉我,实现经济自由的关键是股票投资。虽然这是市场繁荣时期的真相,但在业余时间交易股票仍然是一个有吸引力的选择。由于网上交易平台的便利,出现了许多独立的价值投资者或家庭主妇交易者。甚至有一些成功的故事和广告,吹嘘有一个“快速致富计划”,学习如何投资回报率在40%以上的股票。投资已经成为当今专业人士的福音。

现在的问题是:哪些股票?如何分析股票?与其他股票相比,所选股票的收益和风险如何?

本文的目标是一种让你知道如何用快速简单的Python代码分析股票的方法。看这篇文章——只需要12分钟,更好自己看完。然后你可以快速浏览到你的份财务分析报告。

为了开始学习和分析股票,我们将从快速查看历史股价开始。这将通过从熊猫网络数据阅读器和雅虎财经中提取最新的股票数据来实现。然后,我们将尝试通过探索性分析来查看数据,例如相关热图、Matplotlib可视化以及使用线性分析和K近邻(KNN)的预测分析。

加载雅虎财经数据集

熊猫web数据阅读器是熊猫图书馆的延伸,用来与大部分最新的财务数据进行交流,包括雅虎财经、谷歌财经、英格玛等资源。

我们将使用以下代码来提取苹果的股价:

导入熊猫为pd导入datetime导入熊猫_datareader.data为web从熊猫导入系列,data frame start=datetime . datetime(2010,1,1) end=datetime.datetime(2017,1,11) df=web。DataReader('AAPL ','雅虎',开始,结束)df.tail()

img02

雅虎金融的股价

该代码将提取2010年1月至2017年1月的7年数据。您可以根据需要调整开始和结束日期。在接下来的分析过程中,我们将使用收盘价,即股票在交易结束时的最终价格。

探索股票的移动平均值和收益率

在这个分析中,我们使用两个关键的衡量指标来分析股票:移动平均线和收益率。

移动平均值:确定趋势

滚动平均/移动平均(MA)通过不断更新平均价格来平滑价格数据,这有助于减少价目表中的“噪音”。另外,均线可能充当“阻力位”,代表股票的下行和上行趋势,从中可以预期其未来走势,不太可能偏离阻力位。

让我们开始编写代码,以获得:的滚动平均值

Close _ px=df[' Adj Close ']mavg=Close _ px . rolling(window=100)。平均值()

img03

最近10个移动平均线

这将计算股票收盘价的最后100个滑动窗口(100天)的移动平均值,并取每个滑动窗口的移动平均值。如你所见,均线在滑动窗口上平稳上升,并不遵循股价曲线的之字形。为了更好的理解,我们用Matplotlib来画吧。我们将使用移动平均线来绘制股票价格列表。

% matplotlib inline import matplotlib . py plot as PLT from matplotlib import style #调整matplotlib import matplotlib as mpl . RC(' fig ',figsize=(8,7)) mpl的大小。__版本__ #调整matplotlib style . use(' ggplot ')close _ px . plot(label=' AAPL ')mavg . plot(label=' mavg ')PLT . legend()

img04

苹果股票移动平均价格(mavg)

均线平滑曲线,显示股价涨跌趋势。

在这张图表中,均线显示了股价的上涨或下跌趋势。从逻辑上讲,你应该在股市下跌的时候买入,在股市上涨的时候卖出。

回报偏差:用于确定风险和收益

预期回报衡量投资回报概率分布的平均值或预期值。投资组合的预期回报是通过将每项资产的权重乘以其预期回报,再加上每项投资的价值来计算的。(摘自投资媒体)

您可以参考以下公式:

img05

收入公式

根据这个公式,我们可以得出如下回报。

RETs=close _ px/close _ px . shift(1)-1 RETs . plot(label=' return ')

img06

得出回报率

从逻辑上讲,我们理想的股票回报应该是尽可能的高和稳定。如果你是一个风险厌恶者(像我一样),你可能想避开这只股票,因为你在2013年看到了10%的下跌。这个决定很大程度上取决于你对股票的整体看法和你对其他竞争对手股票的分析。

分析竞争对手股票

在本节中,我们将分析一家公司相对于其竞争对手的表现。假设我们对科技公司感兴趣,想比较一下这些巨头:苹果、通用电气、谷歌、IBM、微软。

dfcomp=web。DataReader(['AAPL ',' GE ',' GOOG ',' IBM ',' MSFT'],' yahoo ',start=start,end=end)['Adj Close']

img07

苹果、通用电气、谷歌、IBM和微软的股价

你会从雅虎金融的股价中得到一个相当整洁平滑的收盘价表。

相关性分析:竞争对手会互相影响吗?

我们可以通过运行熊猫的百分比变化和相关函数来分析竞争关系。百分比变化将定义利润,并找出与前相比价格变化的程度。了解相关性有助于我们了解收益是否受到其他股票收益的影响。

RETs comp=dfcomp . pct _ change()corr=RETs comp . corr()

img08

我们画个散点图来观察苹果和GE的利润分布。

PLT . spread(RETs comp .AAPL,retscomp。通用电气)plt.xlabel('退货AAPL') plt.ylabel('退货通用电气')

img09

苹果和通用电气的散点图

我们可以看到,GE的收益和苹果的收益之间有轻微的正相关关系。似乎大多数情况下,苹果的回报率越高,GE的回报率就越高。

让我们通过绘制分散矩阵来进一步改进我们的分析,以可视化竞争股票之间的可能相关性。在对角点,我们将运行核密度估计,KDE)。KDE问题是一个基本的数据平滑问题,它基于有限的数据样本来推断人口。它有助于生成总体分布的估计值。

pd .散点图_矩阵(retscomp,对角线='kde ',figsize=(10,10))

img10

KDE图和散布矩阵

由此我们可以得出大多数股票的分布是近似正相关的。

为了证明正相关性,我们将使用热图来可视化竞争股票之间的相关性。注意,颜色越浅,两只股票的相关性越强。

plt.imshow(corr,cmap='hot ',interpolation=' none ')PLT . color bar()PLT . xtpicks(range(len(corr)),corr.columns)PLT . yticks(range(len(corr)),corr . columns)

img11

竞争股票之间相互关系的热图

从散点图和热图中,我们可以发现相互竞争的股票之间有很大的相关性。但这也许不能说明因果关系,只能说明科技行业的走势,而不能说明竞股如何相互影响。

股票回报率和风险

除了相关性,我们还分析了每只股票的风险和收益。在这个例子中,我们提取了平均回报(回报率)和回报的标准差(风险)。

PLT . spread(retscomp.mean(),RETs comp . STD())PLT . xlabel(' Expected returns ')PLT . ylabel(' Risk ')for label,x,y in zip(retscomp.columns,RETs comp . mean()),RETs comp . STD()): PLT . annotation(label,xy=(x,y),xytext=(20,-20),textcoords='offset points ',ha='right ',va='bottom ',bbox=dict(boxstyle='round,pad=0.5 ',fc

img12

股票风险和收益的快速散点图

现在你可以看到这张清晰的图表,比较了竞争股票的风险和收益。从逻辑上来说,你希望风险最小化,收益更大化。所以,你需要为你的风险-回报容忍度划一条线(红线)。然后,你会创建规则——,买入红线以下的股票(微软、通用电气、IBM),卖出红线以上的股票(苹果、谷歌)。这条红线显示了你的期望阈值和买卖决策的基线。

预测股票价格

特征工程

我们将使用这三个机器学习模型来预测股票:的简单线性分析、二次判别分析(QDA)和K近邻(KNN)。但是首先我们需要设计一些特性:高低百分比和百分比变化。

dfreg=df.loc[:['Adj Close ',' Volume ']]df reg[' HL _ PCT ']=(df[' High ']—df[' Low '])/df[' Close ']* 100.0 df reg[' PCT _ change ']=(df[' Close ']—df[' Open '])/df[' Open ']* 100.0

img13

生成的最终数据帧

预处理和交叉验证

在将数据放入预测模型之前,我们将按照以下步骤对数据进行清理和处理:

1.删除缺失的值

2.分开标签,我们要预测Adjclose

3.缩放x,使每个样本具有相同的线性回归分布。

4.最后需要找到最近X和早期X的数据系列(用于训练)进行模型生成和评估。

5.将标签分开,标记为y。

6.分别通过交叉验证训练模型和测试

请参考以下代码。

#丢弃缺失值dfreg.fillna(值=-99999,inplace=True) #我们希望将1%的数据分离到预测_ out=int(math . ceil(0.01 * len(dfreg)))#分离此处的标签,我们希望预测AdjClose预测_ col=' Adj Close ' dfreg[' label ']=dfreg[forecast _ col]。shift(-forecast _ out)X=NP . array(dfreg . drop([' label '],1)) #缩放X,使每个人对于线性回归都可以有相同的分布X=预处理. scale(X) #最后我们想找到用于模型生成和评估的晚X和早X的Data Series(train)X _ latest=X[-forecast _ out :]X=X[:-forecast _ out]#分离标签并将其标识为y y y=NP . array(dfreg[' label '])y=y

模型生成-预测过程有意思的地方开始了

首先,让我们添加以下代码来导入我们的SciKit-Learn库:

from sklearn . linear _ model import linear revolution from sklearn . neighbors import kneighbors gressor from sklearn . linear _ model import Ridge from sklearn .预处理从sklearn.pipeline导入多项式特征导入make_pipeline

简单线性分析和二次判别分析

简单的线性分析给出了两个或多个变量之间的线性关系。当我们在两个变量之间画一个图时,我们会得到一条直线。二次判别分析类似于简单的线性分析,只是模型允许生成多项式(如: x平方)并产生曲线。

线性回归预测因变量(y)为输出,自变量(x)为输入。在绘制过程中,我们会得到一条直线,如下图:所示

img14

简单线性回归

下面是一篇干巴巴的文章,对线性回归做了全面的回顾。

Python带Sciket的线性回归初学者指南-Learn https://towards data science.com/a-初学者-python带Sciket的线性回归指南-learn-83a8f7ae2b4f

我们将导入并使用现有的SciKit库,通过选择X和Y训练集来训练模型。代码如下。

#线性回归clf reg=Linear revolution(n _ jobs=-1)clf reg . fit(X _ train,y_train) #二次回归2 clfpoly2=make_pipeline(多项式特征(2),Ridge()) clfpoly2.fit(X_train,y_train) #二次回归3 clfpoly3=make_pipeline(多项式特征(3,Ridge()) clfpoly3.fit(X_train,y_train)

K最近邻(KNN)

KNN使用特征相似度来预测数据点的值。这可确保分配的新点与数据集中的点相似。为了找到相似性,我们提取这些点之间的最小距离(例如欧氏距离)。

img15

在KNN模型的可视化中,您将用K个元素对问题元素进行分组

有关该模型的更多信息,请参见以下链接。加深理解很有用。

k-近邻简介:简体(用Python实现)https://www . analyticsvidhya.com/blog/2018/03/introduction-k-近邻-算法-聚类/

# KNN回归

评估

一种简单、快速和粗略的评估方法是在每个训练好的模型中使用评分方法。分数可以得到测试数据集的自我预测(X)和y的平均精度。

置信度g=clfreg.score(X_test,y _ test)confidence poly 2=clf poly 2 . score(X _ test,y _ test)confidence poly 3=clf poly 3 . score(X _ test,y _ test)confidence KNN=clf KNN . score(X _ test,y_test) # results('线性回归置信度为',0.9639964182651985)('二次回归2置信度为',0.96496206

结果表明,大多数模型的准确率为0.95。然而,这并不意味着我们可以盲目持有这些股票。还有很多问题需要考虑,尤其是不同的公司,随着时间的推移,它们的价格趋势会有所不同。

为了全面测试,让我们输出一些股票预测。

Forecast _ set=clf . predict(X _ neutral)dfreg[' Forecast ']=NP . nan # result(array([115.44941187,115.20206522,116.78688393,116.70244946,116.58503739,115.9876407

绘制预测图

根据预测值,我们将使用现有的历史数据来可视化绘图。这将有助于我们想象该模型如何预测未来的股价。

last_date=dfreg.iloc[-1]。name last _ UNIX=last _ date next _ UNIX=last _ UNIX datetime . time delta(days=1)for I in forecast _ set : next _ date=next _ UNIX next _ UNIX=datetime . time delta(days=1)dfreg . loc[next _ date]=[NP . nan for _ in range(len(dfreg . columns)-1)][I]dfreg[' Adj Close '].尾巴(500)。绘图()dfreg['预测']。尾巴(500)。PLT . legend(loc=4)PLT . xlabel(' Date ')PLT . ylabel(' Price ')PLT . show()

img16

预测值的图形表示

如图,蓝线显示基于回归的股价预测。预测显示,衰退不会持续很久,然后会恢复。因此,我们可以在经济低迷时买入股票,在经济好转时卖出。

未来的改进/挑战

为了进一步分析股票,这里有一些你可以实现的想法。这些想法将有助于对股票进行更全面的分析。如果你需要更多的说明,请随时告诉我。

分析经济定性因素,比如新闻(新闻来源和情感分析)

分析经济数量因素,如某个的HPI和经济不平等公司的起源

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航