从0到1学量化:第4天 - Python读取价格数据并生成K线图

360影视 动漫周边 2025-03-13 11:52 2

摘要:注意,虽然我们用的是windows,用反斜杠来代表目录结构,但反斜杠在Python及一些计算机语言里通常用作转义符,所以这里统一改成正斜杠,或者用双反斜杠\\来代替。读取文本文件后输出表格内容如下:

今天我们使用Python来读取一份文本文件,并针对文件中的数据来画图。文本文件我们从交易软件下载,例如某ETF的开盘收盘价格数据,存成csv文件。

然后用pandas来读取该文件,并输出表格:

df = pd.read_csv("C:/Learnings/Investment/ETF_Price.csv")print("\nCSV 原始数据:")print(df)

注意,虽然我们用的是windows,用反斜杠来代表目录结构,但反斜杠在Python及一些计算机语言里通常用作转义符,所以这里统一改成正斜杠,或者用双反斜杠\\来代替。读取文本文件后输出表格内容如下:

我们把日期类型的字段处理成索引,可以加快处理速度:

df['date'] = pd.to_datetime(df['date']) # 转换日期列为 datetime 类型df.set_index('date', inplace=True)

接下来,调用matplotlib库来进行简单的画图,代码如下:

import matplotlib.pyplot as pltplt.figure(figsize=(10, 6)) #设置图表的宽度和高度,单位英寸plt.plot(df.index, df["open"], label="Open", marker="o")plt.plot(df.index, df["close"], label="Close", marker="o")plt.plot(df.index, df["high"], label="High", marker="o")plt.plot(df.index, df["low"], label="Low", marker="o")

同样,import库的时候如果报错,需要用pip命令来安装一下:pip install matplotlib。安装成功后继续运行,并使用plt库的函数来画图,得到如下散点图,显示了ETF的走势。

这个图缺少标题,缺少坐标轴名称,也缺少图例,我们进行一些修正,在原来的代码下面添加一些代码,并重新运行(注意不是另起一段程序,而是把这些代码附在刚才的五行代码后面,并一起执行):

plt.title("xx ETF") #添加标题plt.xlabel("Date") #添加横坐标名称plt.ylabel("Price") #添加纵坐标名称plt.legend #添加图例plt.grid(True) #添加网格线plt.tight_layout #自动调整布局plt.show

得到如下图形,这下有了标题、图例、横纵坐标轴、以及网格,可读性提高了不少:

但是,本质上这张图还是四个指标独立产生的折线图叠在一起,不像K线图能展示开盘收盘最高最低价,我们尝试用专门画K线图的库来试试,找到一个金融画图包mplfinance,这个库在调用的时候需要数据里必须包含开盘价、收盘价、最高价、最低价四个字段,如果有交易量数据也可以作为可选。我们看看效果:

mpf.plot(df, type='ohlc', style='yahoo', title='K plot', ylabel='Price', mav=(5, 10), # 添加移动平均线(5日和10日均线) tight_layout=True)

看起来好多了,但仍然挤在一起,注意到有一条warning:

WARNING: YOU ARE PLOTTING SO MUCH DATA THAT IT MAY NOT BE POSSIBLE TO SEE DETAILS (Candles, Ohlc-Bars, Etc.)

应该是要展示的数据行数太多导致图上的点挤在了一起。我们的csv文件包含了从2018年5月22日至2023年5月22日这5年的数据,确实有点多,让我们改一下日期范围。

用什么操作来筛选日期范围?df本质上是一个对象,你可以把它想象成一张数据库表,如果是用SQL来写程序进行筛选操作,你可以直接执行语句select * from df where date between ...这样来操作,而在面向对象的程序里,你直接调用df.query这个方法,括号里加上where条件即可,我们试试:

start_date = '2023-01-01'end_date = '2023-05-22'filtered_df = df.query("index >= @start_date and index

这里我们定义两个变量分别代表起始日期和结束日期,分别为2023年1月1日和2023年5月22日,然后把这两个变量用在query方法里,并将筛选出来的结果集赋给一个新的对象叫filtered_df。然后我们对新的对象进行画图,看看效果:

mpf.plot(filtered_df, type='ohlc', style='yahoo', title='K plot', ylabel='Price', mav=(5, 10), # 添加移动平均线(5日和10日均线) tight_layout=True)

确实是数据太多导致的问题,限制了时间范围为5个月后,我们就能清晰的看到日K线图,以及对应的5日和10日均线图。

小结一下:

pandas文件读取和变换:我们使用pandas库里面的read_csv方法从csv文件读取数据,生成了一个对象df,对象里是一张表格,除了原有的字段之外,另外有一个从0开始逐一递增的索引字段,我们可以用df的set_index方法把日期字段变成索引,这样就不再需要原始的那个,再设置索引之前需要先将date这一列用to_datetime方法处理成真正的日期类型(原始导入的类型是字符串)matplotlib作图:用对象的plot方法来作图,横轴为索引字段(日期),纵轴为其他的指定的字段,可以用相应的方法来添加标题、横纵坐标名称、图例、网格等元素使用mplfinance库来画K线图,需要原始数据里有开盘价、收盘价、最高价、最低价等四个元素(交易量字段可选),可以生成K线图,以及对应的均线,均线周期可配置筛选数据范围,把df看作一个对象,query方法相当于SQL里的查询语句,条件写在方法传入的参数里

先摸索到这里,具体的每一个库的详细内容,在使用的时候,利用搜索引擎去搜索各自的官网文档即可。

来源:散文随风想

相关推荐