Python学了半个多月,学了基础语法的一点点皮毛。但是,我已经急不可耐了。先从小项目做起,边做边学吧。这个文章是我实战Python的第一篇文章,内容会很小白(小白写的当然会很小白啦!)主要是记录自己的学习过程。

需求

绘制A股大盘均线。其实是希望以后能绘制所有指数的均线,但是先从上证指数(000001.SH)开始。

思路

  1. 获取大盘每日数据
  2. 绘制均线图表

步骤

使用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()

得到的结果是:

结语

双均线的绘制已经初具雏形了,但还是相当简陋。新的需求是:

  1. 在同一张图片上显示K线。
  2. 显示两条均线交叉的日期(和数值)。
  3. 将这一过程打包,可以应用在上证、深证、恒指、美股三大指数上。
  4. 在两条均线交叉时,给我发送通知。

编程好难哦。

对本文有帮助的链接:

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据