使用pandas绘制股票均线【从零入门量化六】
前面的系列文章,有朋友反映技能树提升太快,看不明白。所以从这篇开始,加入一些基础的技能点。让学习的曲线更平滑一些。
做量化交易,首先需要能够对金融时序数据进行处理,pandas是Python中最常用,也是最好用的时序处理工具包。这里我们以绘制茅台的股价均线为例,展示pandas的处理方法。
技能点:
- 1 金融数据获取:使用tushare下载股票历史日线数据
- 2 把日期字符串转换成时间类型
- 3 使用pandas计算股票的N日均线,并绘制出来
一、使用tushare下载股票日线数据

1.1 安装Tushare
Tushare是一个第三方的数据采集工具包,提供了各类金融的数据的采集,而且是免费使用的。我们的开发语言是Python,开发环境是Anaconda,如果不了解怎么安装环境,可以看前面我的文章:搞金融的同学三小时快速入门python
安装了Python的开发环境anaconda后,我们需要安装tushare,在命令行运行:
pip install tushare
1.2 申请账号
如果网络顺畅,几秒钟就能安装好了。
到tushare.pro这个网站注册一个账号,系统会分配给你一个Token,这是在代码中会用到的。

1.3 下载数据
申请好Token后,我们开始下载股票的日线数据,以茅台为例。
import tushare as ts
import pandas as pd
import datetime
#设置pandas的打印范围参数
pd.set_option('display.max_colwidth',500)
pd.set_option('display.max_columns', None)
# 设置tushare pro的token并获取连接
ts.set_token('e65dada543********************************9f1984c9ba75')
pro = ts.pro_api()
# 设定获取日线行情的初始日期和终止日期,其中终止日期设定为昨天。
start_dt = '20100101'
time_temp = datetime.datetime.now() - datetime.timedelta(days=1)
end_dt = time_temp.strftime('%Y%m%d')
stock = '600519.SH'
# 获取单个股票的日线行情
df = pro.daily(ts_code=stock, start_date=start_dt, end_date=end_dt)
# 显示数据行数
c_len = df.shape[0]
print(c_len)
# 显示出来前面几行数据
print(df.head())
1.4 显示结果

这里面有高开低收,还有前一天的收盘价,当日变动价格,收益百分比等数据。
二、处理日期数据
因为股票的行情数据是时序数据,和时间的关系很密切,所以我们希望把时间作为数据的索引。tushare给我们返回的数据中,trade_date是字符串格式,我们需要先将它转换为系统能识别的时间类型格式,然后把trade_date设置为数据的索引。
、
# pandas有个专门把字符串转为时间格式的函数,to_datetime。第一个参数是原始数据,第二个参数是原始数据的格式
df['trade_date'] = pd.to_datetime(df['trade_date'],format='%Y%m%d')
# 把trade_date设置为索引
df.set_index('trade_date',inplace=True)
三、使用pandas计算股票的N日均线,并绘制出来
3.1 Pandas的rolling操作
pandas为我们提供了rolling函数,用来对某个区间的数据进行滚动的统计操作。比如,我们希望以5天为区间,滚动对一列[A1,A2,A3,A4,A5,A6,A7,A8,A9,A10]的数据进行做平均统计得到B列,那么A5对应的B5=(A1+A2+A3+A4+A5)/5。
3.2 使用rolling函数计算均线
#因为Tushare返回的数据是按照日期倒序排列的,我们先把数据按照日期颠倒一下,变成正序排列
df = df.sort_values("trade_date",ascending=True)
#计算30日均线
df["MA_30"] = df["close"].rolling(window=30).mean()
#计算60均线
df["MA_60"] = df["close"].rolling(window=60).mean()
#计算180日均线
df["MA_180"] = df["close"].rolling(window=180).mean()
#显示数据
print(df.head(50))
#保存数据
df.to_csv("maotai.csv",encoding='utf-8')
3.3 绘制均线
#使用均线和收盘价绘制图形
df[["close","MA_30","MA_60","MA_180"]].plot()
#设置标题
plt.title("maotai")
#保存图片
plt.savefig("maotai.png")
#显示图片
plt.show()

到这里,我们就已经能够Get到前面的技能点了:
- 1 金融数据获取:使用tushare下载股票历史日线数据
- 2 把日期字符串转换成时间类型
- 3 使用pandas计算股票的N日均线,并绘制出来
系列文章请看:
以DualThrust为例回测我们的第一个策略【从零入门量化五】