Python学了半个多月,学了基础语法的一点点皮毛。但是,我已经急不可耐了。先从小项目做起,边做边学吧。这个文章是我实战Python的第一篇文章,内容会很小白(小白写的当然会很小白啦!)主要是记录自己的学习过程。
需求
绘制A股大盘均线。其实是希望以后能绘制所有指数的均线,但是先从上证指数(000001.SH)开始。
思路
- 获取大盘每日数据
- 绘制均线图表
步骤
使用tushare.pro获取大盘每日数据
A股数据方面,首选tushare.pro,无人能出其右。这基本上是全网共识了,数据全,而且免费。因为要获取的是大盘数据,非个股,所以要用到tushare的“指数接口”。相关的用法在“指数日线行情”里。
#载入tushare,需要提前安装 import tushare as ts #获取tushare接口 #在xxxxxxx处输入你的token,我已经提前设置好,这里不需要 # token='xxxxxxxxx' # pro = ts.pro_api(token) pro = ts.pro_api() #获取上证指数2020年初至今行情数据 df = pro.index_daily(ts_code='000001.SH', start_date='20200101') print(df.head())
得到的结果是:
ts_code trade_date close open high low pre_close change pct_chg vol amount 0 000001.SH 20200925 3219.4179 3234.3739 3239.4662 3208.0349 3223.1764 -3.7585 -0.1166 164822419.0 220674477.0 1 000001.SH 20200924 3223.1764 3262.8790 3265.3451 3221.2365 3279.7105 -56.5341 -1.7238 206736011.0 258259919.7 2 000001.SH 20200923 3279.7105 3278.8358 3289.7624 3264.8907 3274.3015 5.4090 0.1652 169178068.0 240742428.8 3 000001.SH 20200922 3274.3015 3290.6656 3320.2278 3265.7025 3316.9351 -42.6336 -1.2853 214015065.0 269113293.7 4 000001.SH 20200921 3316.9351 3348.8988 3350.5893 3313.0714 3338.0897 -21.1546 -0.6337 216503093.0 287691308.1
但是这里的结果是时间倒序的,第一排的数字是最近的交易日。这种排序不能得出正确的均线。所以要把全部顺序翻转过来。
#载入tushare,需要提前安装 import tushare as ts #获取tushare接口 #在xxxxxxx处输入你的token,我已经提前设置好,这里不需要 # token='xxxxxxxxx' # pro = ts.pro_api(token) pro = ts.pro_api() #获取上证指数2020年初至今行情数据 df = pro.index_daily(ts_code='000001.SH', start_date='20200101') #将所有数据倒过来,第一步:将"trade_date"(交易日期)设为索引栏;第二步:按升序排序,也就是从早到晚 df = df.set_index('trade_date') df = df.sort_index(ascending=True) print(df.head())
输出的结果如下:
ts_code close open high low pre_close change pct_chg vol amount trade_date 20200102 000001.SH 3085.1976 3066.3357 3098.1001 3066.3357 3050.1240 35.0736 1.1499 292470208.0 327197122.6 20200103 000001.SH 3083.7858 3089.0220 3093.8192 3074.5178 3085.1976 -1.4118 -0.0458 261496667.0 289991708.4 20200106 000001.SH 3083.4083 3070.9088 3107.2032 3065.3088 3083.7858 -0.3775 -0.0122 312575842.0 331182549.9 20200107 000001.SH 3104.8015 3085.4882 3105.4507 3084.3290 3083.4083 21.3932 0.6938 276583111.0 288159227.7 20200108 000001.SH 3066.8925 3094.2389 3094.2389 3059.1313 3104.8015 -37.9090 -1.2210 297872553.0 306517394.5
这样做有两个效果。第一,所有的数据都按照时间顺序排列好,可以得到正确的均线数值。第二,时间成为图标x轴。
原始数据到目前为止就准备好了。
使用pandas计算均线
所谓均线MA,就是“N日MA=N日收市价的总和/N(即算术平均数)”。我习惯看4日均线和27日均线。这个要用pandas的rolling实现。
#载入tushare和pandas,需要提前安装 import tushare as ts import pandas as pd #获取tushare接口 #输入你的token,我已经提前设置好,这里不需要 # token='xxxxxxxxx' # pro = ts.pro_api(token) pro = ts.pro_api() #获取上证指数2020年初至今行情数据 df = pro.index_daily(ts_code='000001.SH', start_date='20200101', adj='qfq') #将所有数据倒过来,第一步:将"trade_date"(交易日期)设为索引栏;第二步:按升序排序,也就是从早到晚 df = df.set_index('trade_date') df = df.sort_index(ascending=True) #第二步,计算MA均线。下面的意思是在df添加一列'ma4',数据是取'close'这一列数据,计算滚动窗口4天的平均值。 df['ma4'] = df['close'].rolling(4).mean() df['ma27'] = df['close'].rolling(27).mean() print(df.head())
输出的结果是:
ts_code close open high low pre_close change pct_chg vol amount ma4 ma27 trade_date 20200102 000001.SH 3085.1976 3066.3357 3098.1001 3066.3357 3050.1240 35.0736 1.1499 292470208.0 327197122.6 NaN NaN 20200103 000001.SH 3083.7858 3089.0220 3093.8192 3074.5178 3085.1976 -1.4118 -0.0458 261496667.0 289991708.4 NaN NaN 20200106 000001.SH 3083.4083 3070.9088 3107.2032 3065.3088 3083.7858 -0.3775 -0.0122 312575842.0 331182549.9 NaN NaN 20200107 000001.SH 3104.8015 3085.4882 3105.4507 3084.3290 3083.4083 21.3932 0.6938 276583111.0 288159227.7 3089.298300 NaN 20200108 000001.SH 3066.8925 3094.2389 3094.2389 3059.1313 3104.8015 -37.9090 -1.2210 297872553.0 306517394.5 3084.722025 NaN
27天均值那里没有数字,是因为我只显示了前五行数据,后面第28行就有了。
用matplotlib绘制均线
数据有了,可以绘制均线了,要把这两条均线画在同一张图上。这里用到了matplotlib。
#载入tushare、pandas、numpy和matplotlib,需要提前安装 import tushare as ts import pandas as pd import numpy as np import matplotlib.pyplot as plt #获取tushare接口 #输入你的token,我已经提前设置好,这里不需要 # token='xxxxxxxxx' # pro = ts.pro_api(token) pro = ts.pro_api() #获取上证指数2020年初至今行情数据 df = pro.index_daily(ts_code='000001.SH', start_date='20200101', adj='qfq') #将所有数据倒过来,第一步:将"trade_date"(交易日期)设为索引栏;第二步:按升序排序,也就是从早到晚 df = df.set_index('trade_date') df = df.sort_index(ascending=True) #第二步,计算MA均线。下面的意思是在df添加一列'ma4',数据是取'close'这一列数据,计算滚动窗口4天的平均值。 df['ma4'] = df['close'].rolling(4).mean() df['ma27'] = df['close'].rolling(27).mean() #第三步,选取两列均值,绘制图表,并在图表上显示格子线 df[['ma4','ma27']].plot(grid=True, figsize=(14,5)) plt.show()
得到的结果是:
结语
双均线的绘制已经初具雏形了,但还是相当简陋。新的需求是:
- 在同一张图片上显示K线。
- 显示两条均线交叉的日期(和数值)。
- 将这一过程打包,可以应用在上证、深证、恒指、美股三大指数上。
- 在两条均线交叉时,给我发送通知。
编程好难哦。