pb字符串中的分号批量删掉_全市场期货数据的批量下载和更新

news/2024/7/24 9:47:55 标签: pb字符串中的分号批量删掉

不管是研究套利策略,还是多因子策略,都需要多品种的历史数据,所以下面介绍一下,如何调用vnpy的数据下载模块,来下载全市场的期货数据。

批量下载

1)设置合约品种

首先,我们要先生成一个字典,来指定需要下载的数据,关键字段有3个:

  • 交易所代号:上期所-> SHFE
  • 合约代号: 螺纹钢-> RB
  • 合约品种类型: 指数合约 -> 99

这样,在RQData中,我们要下载螺纹钢指数合约的历史数据,需要转成的代号为RB99.SHFE。

然后,由于是全市场行情的数据,所以字典的数据结构如下:key是交易所,value是列表,里面包含各种期货品种,这样,只要在遍历一下这个字典,就可以得到所有,如RB99.SHFE这样结构的字符串。

symbols = {
    "SHFE": ["CU", "AL", "ZN", "PB", "NI", "SN", "AU", "AG", "RB", "WR", "HC", "SS", "BU", "RU", "NR", "SP", "SC", "LU", "FU"],
    "DCE": ["C", "CS", "A", "B", "M", "Y", "P", "FB","BB", "JD", "RR", "L", "V", "PP", "J", "JM", "I", "EG", "EB", "PG"],
    "CZCE": ["SR", "CF", "CY", "PM","WH", "RI", "LR", "AP","JR","OI", "RS", "RM", "TA", "MA", "FG", "SF", "ZC", "SM", "UR", "SA", "CL"],
    "CFFEX": ["IH","IC","IF", "TF","T", "TS"]
}
​
symbol_type = "99"

2) 设置下载时间

我们只需要设置下载的开始和结束时间即可,需要注意的是,vnpy数据下载模块的入参是datetime.datetime格式,所以,要做到格式的一致,代码如下:

from datetime import datetime
start_date = datetime(2005,1,1)
end_date = datetime(2020,9,10)

3)批量下载全市场数据

批量下载数据,并不难,其运作步骤如下:

  1. 遍历symbols字典,
  2. 生成不同的HistoryRequest,
  3. 调用数据下载模块rqdata_client.query_history,得到数据data
  4. 调用数据保存模块database_manager.save_bar_data,把下载好的数据data写入数据库
from vnpy.trader.rqdata import rqdata_client
from vnpy.trader.database import database_manager
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.object import HistoryRequest
​
def load_data(req):
    data = rqdata_client.query_history(req)
    database_manager.save_bar_data(data)
    print(f"{req.symbol}历史数据下载完成")
​
for exchange, symbols_list in symbols.items():
    for s in symbols_list:
        req = HistoryRequest(
        symbol=s+symbol_type,
        exchange=Exchange(exchange),
        start=start_date,
        interval=Interval.DAILY,
        end=end_date,
        )
        load_data(req=req)

写好脚本后,我们运行一下代码,可以看到很快就下完全市场期货的日线数据啦。

b44e4fb521e741e21e90b0a0ed9ac60a.png

若要下载小时或者分钟级别数据,只要把日线周期(Interval.DAILY)改成对应的小时,或者分钟即可。

定时批量更新数据

有了历史数据后,自然产生每天定时更新数据的需求

1)设置定时器

我们希望在收盘后,某个时间点如下午5点启动脚本,来自动下载数据。这本质上是包含了一个父进程和一个子进程。

父进程可以是一个永远在运行的python程序,如while循环,然后设置触发条件,如当时间刚好到下午5点就启动子进程下载更新数据,其他时间则睡觉等待。

代码如下:

from datetime import datetime, time
from time import sleep
​
current_time = datetime.now().time()
start_time = time(17,0)
​
while True:
  sleep(10)
  
  if current_time == start_time:
    download_data()

2)获取数据库数据

更新数据时候,我们要以数据库里面最新的数据的时间点,作为开始时间,而结束时间就是当天。比如,昨天刚好下载完所有市场的数据,那么今天我们只需要下载从昨天到今天的所有数据即可。

这样实现起来也不难,步骤如下:

1)调用database_manager.get_bar_data_statistics来得到字典格式的数据数据库所有信息

data = database_manager.get_bar_data_statistics()

2)获取各品种最新数据的时间信息,并且插入到data字典中

for d in data:
    newest_bar = database_manager.get_newest_bar_data(
        d["symbol"], Exchange(d["exchange"]), Interval(d["interval"])
    )
    d["end"] = newest_bar.datetime

然后我们看看data字典,发现真的包含所有行情的数据,但我们是基于RQData来定期更新信息的,所以要进行筛选,得到国内期货品种(通过交易所来判断)并且是日线级别的数据。

ef2cf78ed7bba1fe327b766700b9841f.png

3)基于交易所和K线周期筛选品种,得到新的字典symbols,其中key包含合约代码,交易所,value就是数据库的结束时间,如下图:

symbols = {}
for i in data:
    if i["interval"] == "d" and  i["exchange"] in Exchanges:
        vt_symbol = f"{i['symbol']}.{i['exchange']}"
        end = i["end"].date()
        symbols[vt_symbol] = end

39126540bc2044d2f75554c1bc2e2cc5.png

4)设置下载结束时间为当天,基于symbols字典的信息,遍历组合得到HistoryRequest,然后再调用上面定义好的load_data函数下载数据并写入数据库中。

end_date = datetime.now().date()
​
for vt_symbol, start_date in symbols.items():
    symbol = vt_symbol.split(".")[0]
    exchange = vt_symbol.split(".")[1]
    req = HistoryRequest(
    symbol=symbol,
    exchange=Exchange(exchange),
    start=start_date,
    interval=Interval.DAILY,
    end=end_date,
    )
    load_data(req=req)

下载好之后,我们再获取数据库里面最新的K线时间,发现成功更新到今天了。

dbabb43b45865a5be404be76d93d8ceb.png

http://www.niftyadmin.cn/n/1275524.html

相关文章

web前端学习,几种浏览器存储数据的方式,平常遇到的一些问题(一)

浏览器端存储数据的用途很广泛,比如在保存用户信息、存储个性化设置信息、保存某种状态或是资料等方面都会用到。 其中方法主要有三种:cookie、sessionStorage、localStorage。下面主要讨论一下我在学习过程中发现这三者的区别。 1.是否与服务器端交互&a…

Jmeter 性能调优

在测试过程中,初学者(也包括早期的我),使用工具不当,添加众多监控组件,非常想看到实时报告,跑不了一会,jmeter就卡死甚至oom,只得重启,之前的统计报告没了&am…

python类方法定义_python类方法定义时为什么要定义两个几乎一致的?

歪栈 从API 设计方面说的很详细。 本人补充一下: 1、在类中用单下划线的意义PEP 8 -- Style Guide for Python Code​www.python.org _single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose n…

其他调用WebService方法

Ajax调用WebService 但是这样会出现跨域请求问题 1. 什么是跨域请求? Host 1. sina.com--->baidu.com/xxx.jsp 2. localhost----192.168.42.165 2. 解决ajax跨域请求webservice的问题? 在客户端应用中使用Java编码去请求webservice, 在页面中去请求自己的后台 jQuery调…

jmeter持续时间设置

设置调度器设置,需要将前面的循环次数设置为永远。 最后欢迎大家访问我的个人网站:1024s

【HDU 2586 How far away?】LCA问题 Tarjan算法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2586 题意:给出一棵n个节点的无根树,每条边有各自的权值。给出m个查询,对于每条查询返回节点u到v的最短路径的权值和,按查询顺序输出结果。 数据范围:…

一个主机可以属于多个组播组_华为二层组播CAC配置教程

二层组播CAC配置CAC(Call Admission Control)称为接入管理控制。二层组播CAC是指通过一系列规则来控制二层组播表项学习,对所有组播组或者节目组内的组播组数量进行限制。其中,节目组由一系列组播组构成。比如XXTV通过一个节目组表示,而XXTV1…

python编码转换语句_能把Python转化为Javascript的4个工具

原标题:能把Python转化为Javascript的4个工具Python部落组织翻译,禁止转载,欢迎转发 Python还是Java?我们经常会争论哪种语言更有前途。相比之下,哪种语言在浏览器中更好用则没有什么争论,因为那必然是Java…