2022年 11月 4日

Python金融量化分析第一步

随着股民的专业素养越来越强,我们也开始从侧重基本面分析转向了侧重基本面+技术面分析,那技术面分析的第一步就是要有大量的对应股票的数据~

那老 amy 就提出问题,大家需要如何利用 Python 去获取数据呢?兄得们估计立马就会想到自己去撸一个爬虫~

实际上,duck 不必,我们强大的 Python 的先锋们早就发现了这个问题,所以封装了很多关于财经数据的接口(当然其本质还是爬虫哈),比如:pandas_datareader、tushare、baostock 等等。那么今天,我们就迈出金融量化的第一步,跟着 老Amy 一起来学习叭

开始学习叭

tushare

首先,一定要给大家介绍 tushare 这个包,这个包是真的好用,所以一定要“学它学它学它!”不过需要注意的是,这个包大家直接通过 pip install tushare 安装就可以用。但是社区的新版本它来了,需要大家注册个 token 才能免费使用,所以请大家点击这个:https://tushare.pro/register?reg=379314 ,以及官网里面的教程也是非常详细

初始化 pro 接口

# 导入模块
import tushare as ts

# 设置你的token,别拿我的...
token = "你的 token"

# 初始化pro接口 设置token
pro = ts.pro_api(token)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:获取 token

  • 登录成功后,点击右上角->个人主页
  • 在“用户中心”中点击“接口TOKEN”
  • 可以点击右侧复制按钮复制token

获取当前上市股票数据

  • 使用方法:stock_basic(is_hs,list_status,exchange)
    • is_hs 是否沪深港通标的,N否 H沪股通 S深股通
    • list_status 上市状态: L上市 D退市 P暂停上市,默认L
    • exchange 交易所 SSE上交所 SZSE深交所 HKEX港交所(未上线)
basic_data = pro.stock_basic(list_status="L")
basic_data.head()
  • 1
  • 2

在这里插入图片描述
注意:tushare pro 使用方法获取数据需要平台积分,详情请参考 https://tushare.pro/document/1?doc_id=13

获取万科A日行情数据

  • 使用方法:daily(ts_code,trade_date,start_date,end_date)
    • ts_code 股票代码(支持多个股票同时提取,逗号分隔)
    • trade_date 交易日期(YYYYMMDD)
    • start_date 开始日期(YYYYMMDD)
    • end_date 结束日期(YYYYMMDD)
# 获取万科A日行情数据
wanke = pro.daily(ts_code="000002.SZ", start_date="20190101")

# 获取前5行
wanke.head()
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

import pandas as pd

# 将时间设置为时间序列索引
wanke.index = pd.to_datetime(wanke["trade_date"])

# 将时间序列索引排序
wanke = wanke.sort_index()
wanke.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
注意:至于返回的每一列是啥意思,大家可以参考 https://tushare.pro/document/2?doc_id=27

绘制K线图

  • 构建x,y数据
    • x:时间
    • y:股票收盘价
  • 使用 pyecharts 绘制k线图
    • 参考链接:http://pyecharts.org/
# 取出 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

baostock

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

# 构建 数据列表
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

通过 seaborn 绘制折线图

import seaborn as sns

# 设置图片大小
sns.set(rc={'figure.figsize':(11,4)})

# 绘制折线图
sns.lineplot(x=result.index, y="close",data=result)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

pandas_datareader

这个接口我真的是无力吐槽了。但是,如果你阅读金融数据分析这本书,会发现上面有用到它,但是是真的很慢很慢~我基本上用 jupyter 获取一年的数据都要请求好久,所以大家如果有兴趣的话可以自行了解一下呀~我就不分享它了

好啦~今天的车就开到这里,司机要下车啦!如果觉得有所收获,欢迎给我33333,不过有朋友问我33333是啥意思,是3连呀

在这里插入图片描述