Qlib内置了A股、美股两个市场的历史数据,可以通过运行如下的脚本把数据自动获取到本地。
pythonscripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --regioncn
而且支持从yahoo finance对数据进行日更,使用的脚本在scripts/data_collector。
但我们希望使用ETF做投资,那么就需要自己来扩展数据源。Qlib提供了相应的工具scripts/dump_bin.py
Dump_bin是把csv格式的数据转换为qlib的格式,这样qlib就可以使用。
python scripts/dump_bin.py dump_all --csv_path ~/.qlib/csv_data/my_data --qlib_dir ~/.qlib/qlib_data/my_data --include_fields open,close,high,low,volume,factor
--csv_path指定本地路径上csv目录
--qlib_dir是qlib的数据目录
--include_fields 包含的字段,OHLCV 好理解,就是常规的价量数据,factor是复权因子,通常factor = adjusted_price / original_price
Qlib内置的数据采集里,已经支持了采集基金数据,是网上收集公募基金的数据,由于我们量化仅需要ETF的数据,所以,我自己写了一个下载CSV的工具。
Tushare作为基金数据来源
Tushare之前是以新浪财经作为网络的采集集,后来又推出了专业版本,背后的数据质量更高一些,可以通过积分或者赞助少量的一些钱获得更高的权限,基本够用的。
专业版的网址是:https://tushare.pro/
目前还有“数据工具”可以直接查看示例数据以及生成调用代码,让开发的效率提升不少。
我们需要查询场内的基金列表。
点击“运行调试”,然后导出csv就好了,由于是一次性操作,所以不用写成代码脚本。
导出结果场内基金1483支。
然后我们读出这个列表,遍历取日频交易数据。
def collect_etf(code):
#拉取数据
df = pro.fund_daily(**{
"trade_date": "",
"start_date": "",
"end_date": "",
"ts_code": code,
"limit": "",
"offset": ""
}, fields=[
"ts_code",
"trade_date",
"pre_close",
"open",
"high",
"low",
"close",
"change",
"pct_chg",
"vol",
"amount"
])
return df
数据读出结果就是dataframe格式,直接to_csv存储到指定的目录即可。
然后使用前面提及的dump_bin工具,可以转这个csv目录转为qlib可以使用的数据存储格式。
dump_all --csv_path D:\008dev\fund_data --qlib_dir~/.qlib/qlib_data/fund_data --date_field_name trade_date --include_fieldsopen,close,high,low,vol,factor
几个需要注意的点:
默认需要一个date字段,如果csv里的字段名称不一样,可以使用—date_field_name来指定。
Include_fields是默认要处理的字段,比如你的csv里有PE,PB可以在这里指定。
运行之后,得到如下目录结果和数据。
数据加载与使用
数据使用比较简单,指定我们刚才的新目录,然后使用D.features加载指定的instruments,可以设定起止的时间段。
返回的数据结构是pandas的dataframe,多索引,主索引是证券代码,次索引是日期。所以访问的时候,直接使用df.loc[‘instrument’]来访问。
import qlib
from qlib.config import REG_CN
from qlib.data import D
import matplotlib.pyplot as plt
class QlibMgr:
def __init__(self):
provider_uri = "~/.qlib/qlib_data/fund_data" # target_dir
qlib.init(provider_uri=provider_uri, region=REG_CN)
def load_df(self,instruments,fields,start_time,end_time):
df = D.features(instruments, fields, start_time=start_time,end_time=end_time, freq='day')
return df
比如这样直接读出收盘价字段,然后绘图。
se = df.loc['sz163415']['$close']
se.plot()
后面对数据的使用,计算指标,可视化都可以按照自己的意愿展开。Qlib是一个设计完整但松耦合的框架,这一点非常好。比如一个常见的回测框架Backtrader,你要扩展自己的东西,非常难。