随着股民的专业素养越来越强,我们也开始从侧重基本面分析转向了侧重基本面+技术面分析,那技术面分析的第一步就是要有大量的对应股票的数据~
那老 amy 就提出问题,大家需要如何利用 Python 去获取数据呢?兄得们估计立马就会想到自己去撸一个爬虫~
实际上,duck 不必,我们强大的 Python 的先锋们早就发现了这个问题,所以封装了很多关于财经数据的接口(当然其本质还是爬虫哈),比如:pandas_datareader、tushare、baostock 等等。那么今天,我们就迈出金融量化的第一步,跟着 老Amy 一起来学习叭
首先,一定要给大家介绍 tushare 这个包,这个包是真的好用,所以一定要“学它学它学它!”不过需要注意的是,这个包大家直接通过 pip install tushare 安装就可以用。但是社区的新版本它来了,需要大家注册个 token 才能免费使用,所以请大家点击这个:https://tushare.pro/register?reg=379314 ,以及官网里面的教程也是非常详细
# 导入模块
import tushare as ts
# 设置你的token,别拿我的...
token = "你的 token"
# 初始化pro接口 设置token
pro = ts.pro_api(token)
注意:获取 token
basic_data = pro.stock_basic(list_status="L")
basic_data.head()
注意:tushare pro 使用方法获取数据需要平台积分,详情请参考 https://tushare.pro/document/1?doc_id=13
# 获取万科A日行情数据
wanke = pro.daily(ts_code="000002.SZ", start_date="20190101")
# 获取前5行
wanke.head()
import pandas as pd
# 将时间设置为时间序列索引
wanke.index = pd.to_datetime(wanke["trade_date"])
# 将时间序列索引排序
wanke = wanke.sort_index()
wanke.head()
注意:至于返回的每一列是啥意思,大家可以参考 https://tushare.pro/document/2?doc_id=27
# 取出 open high low close 列的值 转为列表
k_data = list(wanke.loc[:,["open","close","low","high"]].values)
# 获取时间索引
k_idx = wanke.index
# 类型为:DatetimeIndex
type(k_idx)
# 将DatetimeIndex 转为 字符串
k_idx2 = list(k_idx.strftime("%Y%m%d"))
# 绘制日k
import matplotlib.pyplot as plt
from pyecharts import Kline
kline = Kline("万科K线图")
kline.add("", k_idx2 ,k_data, is_datazoom_show=True,
mark_line = ["average"],
mark_point = ["max","min"],
mark_point_symbolsize = 50,
mark_line_valuedim = ["highest", "lowest"]
)
kline
baostock 也叫作证券宝,它是一款开源、免费的证券数据平台。直接通过 pip install baostock 就可以使用,它的地址:http://baostock.com/baostock/index.php/Python_API
but…我是觉得它的代码没有 tushare 好懂鸭~
import baostock as bs
# 登陆系统
lg = bs.login()
# 获取历史 k 线数据
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2017-07-01', end_date='2019-01-01',
frequency="d", adjustflag="3")
rs
# 构建 数据列表
data_list = []
# 当 错误代码为0 并且 rs.next() 存在时 获取行添加到 data_list 中
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
# 构建 数值:data_list 列索引:rs.fields
result = pd.DataFrame(data_list, columns=rs.fields)
# 将索引 设置为 时间序列索引
result.index = pd.to_datetime(result.date)
# 将某些字段的 object类型 转化为 numeric类型
result = result.apply(pd.to_numeric, errors="ignore")
result.head()
import seaborn as sns
# 设置图片大小
sns.set(rc={'figure.figsize':(11,4)})
# 绘制折线图
sns.lineplot(x=result.index, y="close",data=result)
plt.show()
这个接口我真的是无力吐槽了。但是,如果你阅读金融数据分析这本书,会发现上面有用到它,但是是真的很慢很慢~我基本上用 jupyter 获取一年的数据都要请求好久,所以大家如果有兴趣的话可以自行了解一下呀~我就不分享它了
好啦~今天的车就开到这里,司机要下车啦!如果觉得有所收获,欢迎给我33333,不过有朋友问我33333是啥意思,是3连呀