Python在Finance上的应用4 :处理股票数据进阶

  • 2020 年 2 月 10 日
  • 笔记

欢迎来到Python for Finance教程系列的第4部分。 在本教程中,我们将基于Adj Close列创建烛形/ OHLC图,这将允许我介绍重新采样和其他一些数据可视化概念。

名为烛形图的OHLC图表是一种将开盘价,最高价,最低价和收盘价数据全部集中在一个很好的格式中的图表。 另外,它有漂亮的颜色和前面提到的美丽的图表?

在之前的教程中已经涉及的codes:

import datetime as dt  import matplotlib.pyplot as plt  from matplotlib import style  import pandas as pd  import pandas_datareader.data as web  style.use('ggplot')  df = pd.read_csv(r"C:UsersHPDesktopTSLA.csv", parse_dates=True, index_col=0)

不幸的是,即使创建OHLC数据,也不能直接从Pandas利用内置函数制作烛形图。我确信这个图表类型终有一天将会被提供,现在不是没关系,但我们会做到这一点! 首先,我们需要导入两个库

from matplotlib.finance import candlestick_ohlc  import matplotlib.dates as mdates

第一个导入是来自matplotlib的OHLC图形类型,第二个导入是特殊的mdates类型,这是matplotlib图形的日期类型。Pandas自动为你处理,但就像我说的那样,我们没有烛形图的奢侈品。

首先,我们需要适当的OHLC数据。 目前的数据确实有OHLC的价值,除非我错了,特斯拉从未有过送转,但你永远不会是这样的幸运。 因此,我们将创建自己的OHLC数据,这也将使能够显示来自Pandas的另一个数据转换:

df_ohlc = df['Adj Close'].resample('10D').ohlc()

我们在这里所做的是创建一个基于df ['Adj Close']列的新数据框,重新封装10天的窗口,并且重采样是一个ohlc(开高低关闭)。我们也可以用.mean()或.sum()做10天的平均值或10天的总和。请记住,这10天的平均值是10天的平均值,而不是移动平均值。由于我们的数据是每日数据,因此将其重新采样为10天的数据会显着缩小数据的大小。这是你可以如何规范化多个数据集。有时,您可能会在每个月的一个月初记录一次数据,每个月末记录的其他数据,以可能终每周记录一些数据。您可以将该数据框重新采样到月末,每个月,并有效地将所有数据归一化!如果你喜欢的话,这是更高级的Pandas功能,你可以从中了解更多。

我们想要绘制烛形数据以及成交量数据。我们不必重新采样数据,应该,因为它与10D定价数据相比太细致。

df_volume = df['Volume'].resample('10D').sum()

在这对成交量求和,因为我们确实想知道这10天内交易的总量,但也可以使用平均值。 现在如果我们这样做:

print(df_ohlc.head())

得到:

open     high     low   closeDate  2015-01-01  222.410  222.410  191.87  191.93  2015-01-21  196.570  220.990  196.57  217.48  2015-02-10  216.290  217.110  202.88  203.34  2015-03-02  197.325  202.435  188.68  198.08  2015-03-22  199.630  210.900  185.00  210.90

正如之前想的一样,现在想要将这些信息移动到matplotlib中,并将日期转换为mdates版本。 由于仅仅只要在Matplotlib中绘制列,所以实际上不希望日期成为索引,可以这样做:

df_ohlc = df_ohlc.reset_index()

现在的日期只是一个普通的列。 接下来,我们要转换它:

df_ohlc['Date'] = df_ohlc['Date'].map(mdates.date2num)

接下来开始制图:

fig = plt.figure()  ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)  ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1,sharex=ax1)  ax1.xaxis_date()

除了ax1.xaxis_date()之外,已经看到过的所有内容。 这对我们来说就是将轴从原始的生成号码转换为日期。

现在我们可以绘制烛形图:

candlestick_ohlc(ax1, df_ohlc.values, width=2, colorup='g')

接着加上成交量:

ax2.fill_between(df_volume.index.map(mdates.date2num), df_volume.values, 0)

fill_between函数将绘制x,y,然后填充/之间的内容。 在我们的例子中,我们选择0。

plt.show()