欢迎来到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:\Users\HP\Desktop\TSLA.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()
本文分享自 小草学Python和SQL 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!