.电子商务网站规划,医院推广营销方式,网页设计在哪里接单,兰州网络seoqteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并… qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并管理金融数据
qteasy是一个完全本地化部署和运行的量化交易分析工具包具备以下功能
金融数据的获取、清洗、存储以及处理、可视化、使用量化交易策略的创建并提供大量内置基本交易策略向量化的高速交易策略回测及交易结果评价交易策略参数的优化以及评价交易策略的部署、实盘运行
通过本系列教程您将会通过一系列的实际示例充分了解qteasy的主要功能以及使用方法。
开始前的准备工作
在开始本教程前请完成以下工作
完成qteasy的安装并升级到最新版本注册tushare pro账户并确保有一定的积分大多数高级数据需要较多积分才能下载完成qteasy.cfg文件的配置将tushare_token写入配置文件完成mysql数据库的配置并将数据库配置写入qteasy.cfg·(可选项)完成ta-lib的安装 (可选项)
在上一篇教程中我介绍了如何新建一个虚拟环境并在新的虚拟环境中安装并初始化qteasy如果还没有完成这一步的朋友请移步前一篇教程完成qteasy的安装和基础配置。
另外为了方便后续图表等功能的使用建议使用jupyter notebook来进行开发您可以在新建的虚拟环境中运行以下命令安装jupyter notebook
pip install notebook安装完成后可以使用下面命令启动jupyter notebook
jupyter notebook启动后就可以在浏览器中的一个交互式开发环境中运行代码了如下图所示 如果不使用jupyter notebook也可以使用ipython
pip install ipythonipython 运行在terminal中但是对图表的支持没有那么好
获取基础数据以及价格数据
如上一篇教程介绍刚刚初始化的qteasy是无法调用任何历史数据的所有历史数据都必须首先下载到本地保存到一个称为Datasource的数据仓库之后才能完成后续所有需要数据的工作例如调用历史数据进行策略的回测和优化等等。
qteasy需要使用的数据种类很多所有的数据都是保存在一些预定义的数据表中Datasource就是一系列数据表的集合。其中最基础的数据表包括
trade_calendar - 交易日历数据包括不同交易所的开市、闭市日期计划每年底更新下一年的交易日历stock_basics - 股票基础信息包括沪深股市所有股票的基本信息包括代码、名称、全称、上市日期、分类等等基础信息index_basics - 指数基础信息包括沪深股市所有指数的基本信息包括代码、名称、全称等等信息
在配置好tushare_token以后第一次导入qteasy时如果系统未找到交易日历数据会显示以下提示信息
import qteasy as qt
UserWarning: trade calendar is not loaded, some utility functions may not work properly, to download trade calendar, run
qt.refill_data_source(tablestrade_calendar)warnings.warn(ftrade calendar is not loaded, some utility functions may not work qteasy提供了一个函数get_table_overview()来显示本地存储的数据信息运行这个函数可以打印出本地保存的数据表的清单存储的数据量、占用的磁盘空间大小、以及数据范围等等。
import qteasy as qt
qt.get_table_overivew()
[Out]:
Analyzing local data source tables... depending on size of tables, it may take a few minutes
[########################################]62/62-100.0% Analyzing completed!orhtor
file://csvqt_root/data/
Following tables contain local data, to view complete list, print returned DataFrame
Empty DataFrame
Columns: [has_data, size, records, min2, max2]
Index: []如果本地数据源中没有数据将会显示上面的内容。此时需要下载数据到本地数据源。
下载交易日历和基础数据
我们可以调用refill_data_source函数下载交易日历和基础数据。这个函数是qteasy的标准数据下载接口函数所有的历史数据类型均可以通过此接口下载。这个函数的基本参数是tables传入数据表的名称即可下载相应的数据到本地存储了。使用refill_data_source下载交易数据时qteasy会自动进行数据清洗排除重复数据去除错误数据发生错误自动重试并将下载的数据合并到本地数据表中。目前qteasy仅支持通过tushare下载金融数据未来还会增加其他的金融数据接口丰富用户选择。
要下载前面提到的交易日历、股票和指数的基本信息只需要运行下面的代码
qt.refill_data_source(tablestrade_calendar, stock_basic, index_basic)
[out]:
Filling data source file://csvqt_root/data/ ...
[########################################]9/9-100.0% trade_calendar:SSE-XHKG74804wrtn in ~9t
[########################################]3/3-100.0% stock_basic:SSE-BSE5365wrtn in ~1t
[########################################]7/7-100.0% index_basic:SSE-OTH10365wrtn in ~1t数据下载过程中会显示一个进度条下载完成后再次运行qt.get_table_overview()函数可以看到数据已经成功下载到本地
qt.get_table_overivew()
[Out]:
Analyzing local data source tables... depending on size of tables, it may take a few minutes
[########################################]62/62-100.0% Analyzing completed!orhtor
file://csvqt_root/data/
Following tables contain local data, to view complete list, print returned DataFrameHas_data Size_on_disk Record_count Record_start Record_end
table
trade_calendar True 1.9MB 75K 19901012 20241231
stock_basic True 355KB 2K None None
index_basic True 3.4MB 10K None None 可以看到三张数据表已经被下载到本地数据源数据源的类型为file://csvqt_root/data/类型即数据以csv文件形式存储在qt根路径的/data/路径下包含三张数据表其中交易日历的范围涵盖到2024年年底。
查看股票和指数的基础数据
上面的基础数据下载好之后建议重新启动IDE重新导入qteasy。这时我们就可以使用qteasy筛选和查找股票/指数了。
查找股票/指数详细信息可以使用get_stock_info()或者get_basic_info()函数两个函数功能相同都可以根据输入的证券代码、名称或者关键字查找证券的信息支持通配符或者模糊查找如果同一个代码对应不同的qt_code例如股票000001代表平安银行对应qt_code: 000001.SZ而指数000001代表上证指数qt_code: 000001.SZqteasy会罗列出所有的证券信息
import qteasy as qt# 通过完整的qt_code获取信息
qt.get_basic_info(000001.SZ)
[Out]:
found 1 matches, matched codes are {E: {000001.SZ: 平安银行}, count: 1}
More information for asset type E:
------------------------------------------
ts_code 000001.SZ
name 平安银行
area 深圳
industry 银行
fullname 平安银行股份有限公司
list_status L
list_date 1991-04-03
-------------------------------------------# 如果不知道完整的qt_code可以通过六位数字证券代码获取所有相关的证券信息并列出他们的qt_code
qt.get_basic_info(000001)
found 4 matches, matched codes are {E: {000001.SZ: 平安银行}, IDX: {000001.CZC: 农期指数, 000001.SH: 上证指数}, count: 3}
More information for asset type E:
------------------------------------------
ts_code 000001.SZ
name 平安银行
area 深圳
industry 银行
fullname 平安银行股份有限公司
list_status L
list_date 1991-04-03
-------------------------------------------
More information for asset type IDX:
------------------------------------------
ts_code 000001.CZC 000001.SH
name 农期指数 上证指数
fullname 农期指数 上证综合指数
publisher 郑州商品交易所 中证公司
category 商品指数 综合指数
list_date None 1991-07-15
-------------------------------------------# 通过中文名称关键字搜索相关证券代码
qt.get_basic_info(平安银行)
found 4 matches, matched codes are {E: {000001.SZ: 平安银行, 600928.SH: 西安银行}, IDX: {802613.SI: 平安银行养老新兴投资指数}, count: 3}
More information for asset type E:
------------------------------------------
ts_code 000001.SZ 600928.SH
name 平安银行 西安银行
area 深圳 陕西
industry 银行 银行
fullname 平安银行股份有限公司 西安银行股份有限公司
list_status L L
list_date 1991-04-03 2019-03-01
-------------------------------------------
More information for asset type IDX:
------------------------------------------
ts_code 802613.SI
name 平安银行养老新兴投资指数
fullname 平安银行养老新兴投资指数
publisher 申万研究
category 价值指数
list_date 2017-01-03
-------------------------------------------# 有时候精确匹配证券名称无法找到结果
qt.get_basic_info(贵州钢绳)
No match found! To get better result, you can
- pass match_full_nameTrue to match full names of stocks and funds# 此时可以指定搜索全名从而找到相关的证券
qt.get_basic_info(贵州钢绳, match_full_nameTrue)
found 1 matches, matched codes are {E: {600992.SH: 贵绳股份}, count: 1}
More information for asset type E:
------------------------------------------
ts_code 600992.SH
name 贵绳股份
area 贵州
industry 钢加工
fullname 贵州钢绳股份有限公司
list_status L
list_date 2004-05-14
-------------------------------------------在上面的例子中系统只找到了类型为股票和指数的证券如果还需要查找基金、期货等更多的证券信息用同样的方法下载更多的基础数据表即可
fund_basic: 基金基础数据future_basic: 期货基础数据
除了查找股票或证券的基本信息以外我们还能用qt.filter_stock()函数来筛选股票
qt.filter_stocks(date20240212, industry银行, area上海)
[Out]:name area industry market list_date exchange
qt_code
600000.SH 浦发银行 上海 银行 主板 1999-11-10 SSE
601229.SH 上海银行 上海 银行 主板 2016-11-16 SSE
601328.SH 交通银行 上海 银行 主板 2007-05-15 SSE
601825.SH 沪农商行 上海 银行 主板 2021-08-19 SSE下载沪市股票数据
金融数据中最重要的数据类型非量价数据莫属。接下来我们就来下载历史价格数据。
qteasy的历史数据全都是以K线数据的形式存储在数据表中的目前支持的K线数据包括
分钟K线 - 1分钟/5分钟/15分钟/30分钟/60分钟K线日K线周K线月K线
我们同样使用qt.refill_data_source()函数下载股票数据。最常用的股票日K线数据保存在stock_daily表中。不过由于数据量较大我们最好在下载数据时限定数据的范围通过start_date/end_date参数指定下载数据的起始日期分批下载历史数据否则下载的过程将会非常漫长
qt.refill_data_source(tablesstock_daily, start_date20230101, end_date20231231)
[Out]:
Filling data source file://csvqt_root/data/ ...
[########################################]247/247-100.0% stock_daily:20230104-2023122997486200wrtn in ~49上面的代码下载了2023年全年所有已上市股票的日K线数据同样下面的代码可以用来下载常用指数上证指数和沪深300指数的日K线数据
qt.refill_data_source(tablesindex_daily, symbols000001, 000300, start_date20231231, end_date20240208)
[Out]:
Filling data source file://csvqt_root/data/ ...
[########################################]7/7-100.0% index_basic:SSE-OTH10365wrtn in ~1t
[########################################]2/2-100.0% index_daily:000001.SH-000300.SH97050wrtn in ~2从本地获取股价数据
当股价数据保存在本地之后就可以随时提取出来使用了。
我们可以使用qt.get_history_data()函数来获取股票的量价数据。这个函数时qteasy的一个通用接口可以用来获取各种类型的数据。在函数的参数中指定数据的类型通过数据类型ID、股票的代码以及其他参数就可以获取相应的数据了。如果要获取刚刚下载的K线价格需要设置数据类型为open, high, low, close, vol以获取开盘价、最高价、最低价、收盘价和交易量
qt.get_history_data(htypesopen, high, low, close, vol, shares000001.SZ, start20230101, end20230201)
[Out]:
{000001.SZ:open high low close vol2023-01-04 13.71 14.42 13.63 14.32 2189682.532023-01-05 14.40 14.74 14.37 14.48 1665425.182023-01-06 14.50 14.72 14.48 14.62 1195744.712023-01-09 14.75 14.88 14.52 14.80 1057659.112023-01-10 14.76 14.89 14.39 14.44 1269423.392023-01-11 14.45 14.78 14.39 14.67 830566.122023-01-12 14.77 14.77 14.53 14.67 625694.842023-01-13 14.67 14.95 14.55 14.95 949085.832023-01-16 14.95 15.28 14.85 15.08 1560039.892023-01-17 15.13 15.18 14.77 14.97 935834.542023-01-18 14.95 15.18 14.91 15.11 718434.032023-01-19 15.13 15.25 14.87 15.09 641875.202023-01-20 15.16 15.24 15.00 15.13 608590.082023-01-30 15.60 15.74 14.89 15.15 1374317.502023-01-31 15.24 15.51 14.96 14.99 1030497.842023-02-01 15.03 15.08 14.51 14.70 1653421.48}上面函数的输出是一个字典字典的键为shares参数指定的所有股票的代码而值为一个DataFrame包含该股票在指定期间的历史数据这里我们指定了数据类型为K线量价数据。当然我们也可以指定其他的数据类型只要这些数据已经下载到了本地就可以直接读取。
例如指定数据类型htypespe, pb, total_mv’可以获取股票的市盈率、市净率和总市值等三项财务指标。如果某些指标存在缺失值的时候可以定义填充方式填充缺失值还可以对数据进行重新采样将每日的数据变为每周或每小时数据。
关于get_history_data函数参数的详细解释请参见qteasy文档
生成K线图
使用量价数据更加方便易读的方法是将数据显示为K线图。
qteasy提供了qt.candle()函数用于显示专业K线图只要数据下载到本地后就可以立即显示K线图
qt.candle(600004.SH, start20230101, end20230301)下载复权因子数据到本地后就可以显示复权价格了
qt.refill_data_source(tablesadj, start_date20230101, end_date20230601)
[Out]:
Filling data source file://csvqt_root/data/ ...
[########################################]99/99-100.0% stock_adj_factor:20230103-20230601508575wrtn in ~56
[########################################]99/99-100.0% fund_adj_factor:20230103-20230601121647wrtn in ~4
qt.candle(600004.SH, start20230101, end20230301, adjb)qt.candle()函数支持传入K线图的开始日期、结束日期、K线频率、复权方式以显示不同区间和频率的K线图也支持传入移动均线的时长和macd的不同参数显示不同的均线qt.candle()函数还支持通过股票名称显示K线图如果输入是股票名称会自动模糊查找并且支持通配符。
下面是更多的K线图例子展示了股票、基金、指数等不同的资产类别不同的数据频率不同的均线设定、不同的图表类型等为了显示下面示例中的K线图您需要下载相应的数据。
import qteasy as qt
df qt.candle(159601, start20210420, freqd) # 根据证券代码模糊搜索显示K线图
df qt.candle(000001.SH, start 20211221, asset_typeIDX, plot_typec) # 设置K线图的开始日期结束日期为今天
df qt.candle(000300.SH, start 20220331, asset_typeIDX, mav[], plot_typec) # 不显示移动平均价
df qt.candle(000300.SH, start 20221021, asset_typeIDX, mav[], plot_typec, freq30min) # 显示30分钟K线
df qt.candle(601728, freq30min, adjb, plot_typec) # 后复权
df qt.candle(沪镍主力, start 20211130, mav[5, 12, 36]) # 指定计算5日/12日/36日移动平均价
df qt.candle(510300, start20200101, asset_typeFD, adjb, mav[])
df qt.candle(格力电器, start20220101, asset_typeE, adjf, mav[5, 10, 20, 30])
df qt.candle(513100, asset_typeFD, adjf, mav[]) # 显示基金的净值
df qt.candle(110025, asset_typeFD, adjf, mav[9, 28])
df qt.candle(001104, asset_typeFD, adjf, mav[12, 26])数据类型的查找
前面提到过qteasy中的所有数据类型均有一个唯一的ID通过这个ID可以提取数据在交易策略中引用该数据类型完成qteasy中所需的工作。
为了更加了解qteasy中的数据类型我们可以用qt.find_history_data()函数来查询所需的数据类型。qteasy中定义的数据类型是与数据频率、资产类型挂钩的也就是说不同资产的收盘价是不同的数据类型不同频率的收盘价也是不同的。
qt.find_history_data()函数可以根据输入查找相关的数据类型并且显示它们的ID数据表、说明等相关信息例如搜索‘close’收盘价可以找到所有相关的数据类型
qt.find_history_data(close)
[Out]:
matched following history data,
use qt.get_history_data() to load these historical data by its data_id:
------------------------------------------------------------------------freq asset table desc
data_id
close d E stock_daily 股票日K线 - 收盘价
close w E stock_weekly 股票周K线 - 收盘价
close m E stock_monthly 股票月K线 - 收盘价
close 1min E stock_1min 股票60秒K线 - 收盘价
close 5min E stock_5min 股票5分钟K线 - 收盘价
close 15min E stock_15min 股票15分钟K线 - 收盘价
close 30min E stock_30min 股票30分钟K线 - 收盘价
close h E stock_hourly 股票小时K线 - 收盘价
close d IDX index_daily 指数日K线 - 收盘价
close w IDX index_weekly 指数周K线 - 收盘价
close m IDX index_monthly 指数月K线 - 收盘价
close 1min IDX index_1min 指数60秒K线 - 收盘价
close 5min IDX index_5min 指数5分钟K线 - 收盘价
close 15min IDX index_15min 指数15分钟K线 - 收盘价
close 30min IDX index_30min 指数30分钟K线 - 收盘价
close h IDX index_hourly 指数小时K线 - 收盘价
close d FT future_daily 期货日K线 - 收盘价
close 1min FT future_1min 期货60秒K线 - 收盘价
close 5min FT future_5min 期货5分钟K线 - 收盘价
close 15min FT future_15min 期货15分钟K线 - 收盘价
close 30min FT future_30min 期货30分钟K线 - 收盘价
close h FT future_hourly 期货小时K线 - 收盘价
close d OPT options_daily 期权日K线 - 收盘价
close 1min OPT options_1min 期权60秒K线 - 收盘价
close 5min OPT options_5min 期权5分钟K线 - 收盘价
close 15min OPT options_15min 期权15分钟K线 - 收盘价
close 30min OPT options_30min 期权30分钟K线 - 收盘价
close h OPT options_hourly 期权小时K线 - 收盘价
close d FD fund_daily 基金日K线 - 收盘价
close 1min FD fund_1min 基金60秒K线 - 收盘价
close 5min FD fund_5min 基金5分钟K线 - 收盘价
close 15min FD fund_15min 基金15分钟K线 - 收盘价
close 30min FD fund_30min 基金30分钟K线 - 收盘价
close h FD fund_hourly 基金小时K线 - 收盘价
close d Any top_list 融资融券交易明细 - 收盘价再例如搜索市盈率pe可以得到
qt.find_history_data(pe)
[Out]:
matched following history data,
use qt.get_history_data() to load these historical data by its data_id:
------------------------------------------------------------------------freq asset table desc
data_id
initial_pe d E new_share 新股上市信息 - 发行市盈率
pe d IDX index_indicator 指数技术指标 - 市盈率
pe d E stock_indicator 股票技术指标 - 市盈率总市值/净利润 亏损的PE为空
pe_2 d E stock_indicator2 股票技术指标 - 动态市盈率查找到相应的数据之后只需要查看该数据所属的数据表将该数据表下载到本地数据源中(refill_data_source(tables, ...))即可使用这些数据(qt.get_history_data(htype, shares, ...))了。
定期下载数据到本地
为了保持本地数据源的数据更新我们可以使用qt.refill_data_source()函数定期下载数据到本地。创建一个文件refill_data.py并在其中写入以下代码
import qteasy as qtif __name__ __main__:# 解析命令行参数--tabls参数表示数据表类型--start_date和--end_date表示下载数据的起始日期和结束日期import argparseparser argparse.ArgumentParser(descriptionrefill data source)parser.add_argument(--tables, typestr, defaultstock_daily, helpdata table type)parser.add_argument(--start_date, typestr, default20230101, helpstart date)parser.add_argument(--end_date, typestr, default20231231, helpend date)parser.add_argument(--parallel, typebool, defaultTrue, helpparallel download)parser.add_argument(--merge_type, typestr, defaultupdate, helpmerge type)args parser.parse_args()tables args.tablesstart_date args.start_dateend_date args.end_dateparallel args.parallelmerge_type args.merge_typeif tables events:# 下载低频data和event数据下载周期较长以cover所有的季度月度周度数据 每周下载或每月下载tables stock_weekly, stock_monthly, index_weekly, index_monthly, tables income, balance, cashflow, financial, forecast, express, comp, report, eventselif tables basics:# 下载基础数据下载周期较长以cover所有的季度月度周度数据 每周下载或每月下载tables basicselif tables daily:# 下载日频数据下载周期较短以减少下载负载 每天或每周下载tables adj, stock_daily, fund_daily, future_daily, options_daily, stock_indicator, stock_indicator2, index_indicator, shibor, libor, hibor, index_dailyelif tables stock_mins:tables adj, stock_1min, stock_5min, stock_15min, stock_30min, stock_hourlyelif tables index_mins:tables adj, index_1min, index_5min, index_15min, index_30min, index_hourlyelif tables fund_mins:tables adj, fund_1min, fund_5min, fund_15min, fund_30min, fund_hourlyelse:tables tablesqt.refill_data_source(tablestables, start_datestart_date, end_dateend_date, parallel parallel, merge_typemerge_type)上面的脚本文件提供了最基本的数据下载功能可以根据需要修改tables和start_date、end_date参数以及parallel和merge_type参数来下载不同的数据类型和不同的数据范围。 您可以自行改进脚本文件以实现更多的功能
要下载2023年全年的stock_daily数据只需要在命令行中运行以下命令
python -m refill_data --tables stock_daily --start_date 20230101 --end_date 20231231回顾总结
至此我们已经初步了解了qteasy中对数据的管理方式了解了数据下载的方法。下载了基本数据以及一些量价数据。我们学会了如何提取数据、如何显示K线图。最后我们还学会了查询数据的方法如果需要某种数据知道如何查询如何下载和调用这些数据。
在下一篇教程中我们将进一步加深对qteasy的了解我们将学会如何创建交易策略如何运行并回测交易策略。
关于qteasy的更多介绍请参见qteasy文档