各位小伙伴周末好,本周想给大伙分享的内容是使用Python进行复盘,有小伙伴问到自己是否有必要学习Python,不可否认Python在进行数据分析时有很多优势,学习曲线也不算特别陡峭,但每个人具体情况各有不同,我的建议是如果你同时具有计算机和金融背景,Python是非常值得学一学的,因为针对这类人群,学习Python(不需要精通)真的不需要花多少时间,对于单纯计算机背景的人群,可以进行学习,但你可能要自己找一找Python的使用场景,至于仅财务金融背景,可以自己评估一下必要性,以下内容我尽可能写得简单,争取让大家能够复现本文中的一些效果。本文相关环境在Windows10
开始之前
大家需要安装一个Python运行环境(已经安装的小伙伴跳过),对于新手而言,我推荐直接安装Anaconda软件包,官方网站:https://www.anaconda.com/ 安装的时候注意以下几点:注意下载的软件要和你的操作系统相匹配,如果不知道你的操作系统是什么版本,推荐安装32位版本。安装时尽量以管理员身份进行,方法是右键点击安装包,选择以管理员身份运行,并在Install for 界面下选择All users
在以下界面将两个都勾上
一直到安装完成,之后点开你的“开始”菜单(就是电脑左下角)任务栏第一个图标,我们应该可以看到Anancoda的相关程序了
我们点击其中的Jupyter Notebook打开运行时界面
同时,系统也会弹出一个浏览器界面,如下
如果没有弹出,请把上面黑乎乎界面里面提到的链接http://localhost..... 复制到浏览器里面打开(注:选择以后点击右键就复制了)。
我们点Upload旁边的New按钮,选择Python3新建一个Notebook文件,下面的操作都在这个Notebook中进行
准备数据
要进行复盘,先得有数据,我们这里首先需要获取的是指定交易日期的全市场股票数据,如收盘价,市盈率,行业之类。经过查找,我们选择以下两个数据来源进行实验。
沪深300指数数据(聪明的小伙伴肯定智能把000300换成其他指数):
http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?st=TDATE&sr=-1&ps=1&p=1&type=GZFX_SCTJ&token=70f12f2f4f091e459a279469fe49eca5&source=WEB&js=(x)&filter=(MKTCODE='000300')
这个接口里面包括了最新交易日期,指数市盈率,总市值等数据
沪深两市某一个交易日市场数据
http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?callback=jQuery112306332370442347532_1606547158677&st=SECURITYCODE&sr=1&ps=50&p=1&type=GZFX_GGZB&token=70f12f2f4f091e459a279469fe49eca5&js=(%7Bdata%3AdataDistinc((x)%2C%22PE9%22)%2Cpages%3A(tp)%7D)&filter=(TRADEDATE%3D%5E2020-11-27%5E)
这个交易包含了两市所有上市公司基本信息,如收盘价、历史市盈率、市净率、行业等数据。
我们打开两个网页会发现一些像这样:
或者这样
的乱码数据,不过没关系,我们后续对其进行转化处理成可以识读的数据。注意:我们使用互联网公开数据进行实验,但公开数据由特定的互联网或券商提供,因此非常不建议大家去一下获取很多数据,或者以大并发数去请求数据。
数据的转化处理
为了将上面的一些乱码转化成可识读及Python常用的数据集格式,我们需要编写两个函数,注释前用“#”标识,把以下代码输入到Notebook的第一个Cell并按下Shift+Enter运行
# 引入需要的办件包
# json 与 DataFrame 用于转换数据集
# requests包用来访问互联网并获取数据
import json
from pandas import DataFrame
from requests import get
# 获取最新交易日
def trade_date(offset=1):
# 数据接口为url,offset为所需采集的页码,因为在接口中定义了每次仅采集一页,因此我们可以通过该方法获取指定的交易日
url="http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?st=TDATE&sr=-1&ps=1&p={offset}&type=GZFX_SCTJ&token=70f12f2f4f091e459a279469fe49eca5&source=WEB&js=(x)&filter=(MKTCODE='000300')"
url=url.replace("{offset}",str(offset))
r=get(url).text # 下载数据
return json.loads(r)[0]['TDATE'].split("T")[0] #返回 2020-12-04
# 获取指定交易日数据
def stock_data(trade_date):
url="http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?st=SECURITYCODE&sr=1&ps=5000&p=1&type=GZFX_GGZB&token=70f12f2f4f091e459a279469fe49eca5&js={\"data\":(x),\"pages\":(tp)}&filter=(TRADEDATE%3D%5E{tdate}%5E)"
url=url.replace("{tdate}",trade_date)
t=get(url).text
di = json.loads(t)['data'] # 将返回数据转换为dict对象
if len(di)==0:
raise ValueError("空数据集!")
# 将dict数据集转换为DataFrame 数据集,并只取其中我们需要的数据
df = DataFrame(di)[["SECURITYCODE","SName","HYName","PE9","PB8","ZSZ","NEW","TRADEDATE"]]
# 将表头修改为我们看得懂的名字
df.columns = ['代码','简称','行业','滚动市盈','市净','总市值','最新价','交易日期']
return df
这段代码正常运行后没有任何结果,如果弹出了任何错误信息,都要检查原因。
我们来测试一下,在第二个Cell中继续输入以下代码并按下Shift+Enter键运行
t=trade_date(1) #获取最新交易日期
t1=trade_date(2) #获取前一天交易日期
# 以下代码获取最新的全市场股票数据,当然接口里面包含的数据不只这么点,可以自己根据需要提出其他数据,Try和Except之间的代码表示如果最新一个交易日的数据没有出来,则使用前一个交易日的数据
try:
df=stock_data(t)
except ValueError as e:
df=stock_data(t1)
df
返回结果集如下:
至此我们获取到所需的数据,除了直接在这个Notebook中分析以外,我们还可以将数据进行导出,在其它工具中进行分析。
由于篇幅原因,就暂时写这么多吧,下一篇我们聊聊怎样使用Python进行简单查询和统计,下周见。
本文中涉及到的Notebook文件下载,见评论区