1.获取金融数据
在整个量化交易中,最重要的莫过于数据。数据就是信息,如果数据不够准确,建立在错误的数据上的交易思维也很难正确。有位名人讲过:无数据,不量化。
数据有收费和免费的。收费自然有收费的好处,收费的一般数据质量过关,数据应该也比较及时。数据收费市场目前相对杂乱,有的可能几百,有的收几千。
如果确定要走量化交易之路,在技术达到要求后,应该还是购买收费的数据为好。免费的收据存在很大的不确定性,接口关了,数据缺失等意外情况很可能会发生。
无论采取何种框架,无论使用何种编程语言,都要保证数据质量。
为了方便学习,接下来介绍两种数据源数据源。这里只是介绍最简单的方法,更多方法参考官方网址。
注意事项:
- 数据格式
- 数据字段
- 数据形式
- 时间序列
1.1akshare
akshare官网:Welcome to AKShare’s Online Documentation! — AKShare 1.6.57 文档
安装:
pip install akshare
1.1.1ahshare介绍
-
AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。
-
AKShare 的特点是获取的是相对权威的财经数据网站公布的原始数据,通过利用原始数据进行各数据源之间的交叉验证,进而再加工,从而得出科学的结论。
1.1.2ahshare优点
akshare采用的数据源多种,网易,东方财富,新浪等主流财经媒体。
akshare数据采用的pandas的Dateframe格式,可以直接使用。
1.1.3使用
以历史行情为例
在官网左侧导航栏中以此点击AKShare 数据字典----->AKShare股票数据------->A股------->历史行情数据(如下图)
import akshare as ak
# 使用的是东财数据接口,开始结束为空则为全部,
# adjust默认返回不复权数据;qfq前复权;hfq后复权数据
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20170301", end_date='20210907', adjust="")
print(stock_zh_a_hist_df)
输出如下
日期 开盘 收盘 最高 ... 振幅 涨跌幅 涨跌额 换手率
0 2017-03-01 9.49 9.49 9.55 ... 0.84 0.11 0.01 0.21
1 2017-03-02 9.51 9.43 9.54 ... 1.26 -0.63 -0.06 0.24
2 2017-03-03 9.41 9.40 9.43 ... 0.74 -0.32 -0.03 0.20
3 2017-03-06 9.40 9.45 9.46 ... 0.74 0.53 0.05 0.24
4 2017-03-07 9.44 9.45 9.46 ... 0.63 0.00 0.00 0.17
... ... ... ... ... ... ... ... ...
1100 2021-09-01 17.48 17.88 17.92 ... 5.11 0.45 0.08 1.19
1101 2021-09-02 18.00 18.40 18.78 ... 5.48 2.91 0.52 1.25
1102 2021-09-03 18.50 18.04 18.50 ... 4.35 -1.96 -0.36 0.72
1103 2021-09-06 17.93 18.45 18.60 ... 4.55 2.27 0.41 0.78
1104 2021-09-07 18.60 19.24 19.56 ... 6.56 4.28 0.79 0.84
字段说明
既然是pandas的DataFrame格式,可以直接用pandas的方法进行操作,比例设置索引,列排序等
akhist.py
from akshare import stock_zh_a_hist
import pandas as pd
stock_history = stock_zh_a_hist(symbol='601318',period='daily',adjust='').iloc[:,0:6]
# 列名
stock_history.columns = [
'date',
'open',
'close',
'high',
'low',
'volume',
]
# 对列进行重新排序设置成OHLC
stock_history = stock_history[['date','open','high','low','close','volume']]
# 设置以日期为索引
stock_history.set_index('date',drop=True,inplace=True)
# 保存成csv文件
stock_history.to_csv('./601318.csv')
print(stock_history)
输出如下
open high low close volume
date
2007-03-01 50.00 50.97 45.80 46.79 1977634
2007-03-02 47.00 47.44 45.88 46.41 425048
2007-03-05 45.98 46.17 43.53 44.38 419197
2022-07-15 43.61 44.09 42.70 42.71 694042
2022-07-18 42.75 43.69 42.72 43.45 355244
2022-07-19 43.42 43.77 42.90 43.40 356106
2022-07-20 43.78 43.83 43.36 43.40 249566
2022-07-21 43.23 43.25 42.65 42.74 405568
生成csv文件如下:
从akshare左侧导航栏中,我们可以很快找到所需要的数据接口。
1.2tushare
1.2.1介绍
-
拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据
-
SDK开发包支持语言,同时提供HTTP Restful接口,最大程度方便不同人群的使用
-
提供多种数据储存方式,如Oracle、MySQL,MongoDB、HDF5、CSV等,为数据获取提供了性能保证
1.2.2使用
安装:
pip install tushare
tushare有积分制,不同的积分使用的数据量,次数不同,积分越高权限越大。
首次注册就有50积分,如果想要更多积分,可以加入其网站群,有相关规则可以提高自己的积分。
tushare下载的数据也是pandas的DateFrame格式。
在使用tushare中是需要独特的密码的。
注册以后,点击顶部右侧图像,选择个人主业,点击接口TOKEN
出现下图
点击右侧复制密码,参照数据接口的使用,用法跟akshare类似。
tushare特色功能图形化:
有个图形化获取工具,在主页点击数据工具
既可以运行,也可以生成代码。简单方便
生成的代码如下:
tuhist.py
# 导入tushare
import tushare as ts
# 初始化pro接口
pro = ts.pro_api('自己的接口TOKEN')
# 拉取数据
df = pro.daily(**{
"ts_code": "000001.SZ",
"trade_date": "",
"start_date": "",
"end_date": "",
"offset": "",
"limit": ""
}, fields=[
"ts_code",
"trade_date",
"open",
"high",
"low",
"close",
"vol"
])
print(df)
运行结果:
ts_code trade_date open high low close vol
0 000001.SZ 20220715 13.48 13.56 13.22 13.24 1598637.40
1 000001.SZ 20220714 13.70 13.71 13.29 13.37 2632120.87
2 000001.SZ 20220713 14.42 14.47 13.89 13.97 2175996.06
3 000001.SZ 20220712 14.41 14.73 14.38 14.42 742882.42
4 000001.SZ 20220711 14.50 14.57 14.36 14.46 611691.94
... ... ... ... ... ... ... ...
4995 000001.SZ 20010417 16.98 17.00 16.66 16.76 89307.99
4996 000001.SZ 20010416 17.00 17.11 16.80 16.90 175754.28
4997 000001.SZ 20010413 16.48 16.97 16.40 16.85 222942.73
4998 000001.SZ 20010412 16.50 16.66 16.33 16.44 72915.15
4999 000001.SZ 20010411 16.70 16.70 16.38 16.49 39723.27
[5000 rows x 7 columns]
注意:trade_date 列是时间倒序,需要处理,导入backtrader中时间序列是正序的。
1.3前复权后复权
复权就是对股价和成交量进行权息修复,按照股票的实际涨跌绘制股价走势图,并把成交量调整为相同的股本口径,然后用相同成本进行比较。复权可以消除由于除权除息造成的价格走势畸变,保持股价走势的连续性
-
前复权以目前价为基准复权,可以很清楚的看到成本分布情况,如相对最高、最低价,成本密集区域,以及目前股价所处的位置是高还是低。如果进行技术分析,最好用前复权,这样当前的价格是最新的实际价格,且K线均线的走势是连续性的,不影响看盘 。
-
后复权保持上市第一天的价格不变,根据分红配股数据处理之后的价格,这会导致最后一天的价格显示出来不是实际成交价,但可以看出股票真实价值的增加及持股者的真实收益率。如果进行价值投资,建议采用后复权,这样计算的收益率是相对正确的,查询也比较直观 。
那我们采用股票数据是用前复权还是后复权的形式呢。
量化交易是一门严谨的科学,但又是艺术的。自己的量化投资成功就是大道,不必采用名家之言。网上关于采取前后复权,是否复权的文章众说纷纭,但都是一家之谈基于自己的交易逻辑而已。
回测本身就是检测自己的思维逻辑,交易理念。即是检验,自然包括各种情况的检验。所以,不必太纠结这个问题。让自己检测的交易成果数据来选择。数据的展示的形式也可以作为复权的检验。
在使用数据源时,注意数据形式,是复权还是不复权,是前复权还是后复权。
2.加载数据
backtrader自身附带了data feed解析器,可以不同的数据源加载数据。如下例
import backtrader as bt
import backtrader.feeds as btfeeds
data = btfeeds.YahooFinanceCSVData(dataname='wheremydatacsvis.csv')
cerebro = bt.Cerebro()
cerebro.adddata(data) # a 'name' parameter can be passed for plotting purposes
在国内使用更多的是csv格式,Pandas DateFrame读取的数据以及在线api,一些数据库存储的。国外数据源对国内量化交易者不太友好。
数据加载后,会按照顺序保存在self.datas, self.datas是一个列表可循环。self.datas[0]表示第一个加载的行情数据,self.datas[1]表示第二个加载的行情数据。数据加载时,可以对加载的数据起个名称,在框架内使用名称获取数据的相关信息。
加载数据别名
-
self.data 和 self.data0 都是第一个加载的数据。等价于self.datas[0]
-
self.dataX 等价于 self.datas[X]
2.1加载数据常用参数参数
-
dataname 默认是None,必须提供。加载的文件对象
-
name 默认是空,数据的名字,方便内部根据名字对数据进行操作。
-
fromdate 开始时间。数据小于这个时间的数据会被忽略
-
todate 结束时间。数据大于这个时间的数据会被忽略
-
timeframe 时间颗粒度。默认值是天TimeFrame.Days。可以改成Ticks,Seconds,Minutes,Days,Weeks,Months,Year
-
compression 压缩。压缩就是把很多bar压缩成一个bar.例如我们看K线图,可以选择日,在选择看周线。把5个交易日压缩成了一个周单位。压缩只有在Resampling/Replaying时才有效。
-
sessionstart sessionend 指标开始/结束时间。只在resampling有效
2.2 CSV 常用参数
-
headers 默认为True 指示csv数据是否具有标题行。例如open,high,low.close的标题
-
separator 分隔符 默认"," 分割csv文件
2.3 注意事项
加载的数据是按照时间顺序排列的。有些数据源可能是倒序,数据排列需要提前处理。akshare案例date列显示按照时间顺序的,tushare案例trade_date列则是按照时间倒序的,所以tushare需要提前处理。
sessionstart sessionend 指标开始/结束时间。只在resampling有效
2.2 CSV 常用参数
-
headers 默认为True 指示csv数据是否具有标题行。例如open,high,low.close的标题
-
separator 分隔符 默认"," 分割csv文件
2.3 注意事项
加载的数据是按照时间顺序排列的。有些数据源可能是倒序,数据排列需要提前处理。akshare案例date列显示按照时间顺序的,tushare案例trade_date列则是按照时间倒序的,所以tushare需要提前处理。