历史数据
回测历史数据
回测所需要的历史数据可通过运行getdata.py文件进行下载。该文件处于根目录下tests\backtesting文件夹内。下载历史数据的原理是调用RQData的get_price()函数把数据下载到内存里面;再通过generate_bar_from_row()函数,以固定格式把数据从内存载入到硬盘数据库中。
下面介绍具体流程:
- 填写RQData的账号密码,初始化RQData
- import rqdatac as rq
- USERNAME = ""
- PASSWORD = ""
- FIELDS = ["open", "high", "low", "close", "volume"]
- rq.init(USERNAME, PASSWORD, ("rqdatad-pro.ricequant.com", 16011))
- 定义数据插入格式。需要插入的数据包括:合约代码、交易所、K线周期、开盘价、最高价、最低价、收盘价、成交量、数据库名称、vt_symbol(注意:K线周期可以是”1m”、”1h”、”d”、”w”。to_pydatetime()用于时间转换成datetime格式)
- def generate_bar_from_row(row, symbol, exchange):
- """"""
- bar = DbBarData()
- bar.symbol = symbol
- bar.exchange = exchange
- bar.interval = "1m"
- bar.open_price = row["open"]
- bar.high_price = row["high"]
- bar.low_price = row["low"]
- bar.close_price = row["close"]
- bar.volume = row["volume"]
- bar.datetime = row.name.to_pydatetime()
- bar.gateway_name = "DB"
- bar.vt_symbol = f"{symbol}.{exchange}"
- return bar
- 定义数据下载函数。主要调用RQData的get_price()获取指定合约或合约列表的历史数据(包含起止日期,日线或分钟线)。目前仅支持中国市场的股票、期货、ETF和上金所现货的行情数据,如黄金、铂金和白银产品。(注意:起始日期默认是2013-01-04,结束日期默认是2014-01-04)
- def download_minute_bar(vt_symbol):
- """下载某一合约的分钟线数据"""
- print(f"开始下载合约数据{vt_symbol}")
- symbol, exchange = vt_symbol.split(".")
- start = time()
- df = rq.get_price(symbol, start_date="2018-01-01", end_date="2019-01-01", frequency="1m", fields=FIELDS)
- with DB.atomic():
- for ix, row in df.iterrows():
- print(row.name)
- bar = generate_bar_from_row(row, symbol, exchange)
- DbBarData.replace(bar.__data__).execute()
- end = time()
- cost = (end - start) * 1000
- print(
- "合约%s的分钟K线数据下载完成%s - %s,耗时%s毫秒"
- % (symbol, df.index[0], df.index[-1], cost)
- )
实盘历史数据
在实盘中,RQData通过实时载入数据进行策略的初始化。该功能主要在CTA实盘引擎engine.py内实现。下面介绍具体流程:
配置json文件:在用户目录下.vntrader文件夹找到vt_setting.json,输入RQData的账号和密码,如图。
初始化RQData客户端:从vt_setting.json中读取RQData的账户、密码到rq_client.init()函数进行初始化
- def init_rqdata(self):
- """
- Init RQData client.
- """
- username = SETTINGS["rqdata.username"]
- password = SETTINGS["rqdata.password"]
- if not username or not password:
- return
- import rqdatac
- self.rq_client = rqdatac
- self.rq_client.init(username, password,
- ('rqdatad-pro.ricequant.com', 16011))
- RQData载入实盘数据:输入vt_symbol后,首先会转换成符合RQData格式的rq_symbol,通过get_price()函数下载数据,并且插入到数据库中。
- def query_bar_from_rq(
- self, vt_symbol: str, interval: Interval, start: datetime, end: datetime
- ):
- """
- Query bar data from RQData.
- """
- symbol, exchange_str = vt_symbol.split(".")
- rq_symbol = to_rq_symbol(vt_symbol)
- if rq_symbol not in self.rq_symbols:
- return None
- end += timedelta(1) # For querying night trading period data
- df = self.rq_client.get_price(
- rq_symbol,
- frequency=interval.value,
- fields=["open", "high", "low", "close", "volume"],
- start_date=start,
- end_date=end
- )
- data = []
- for ix, row in df.iterrows():
- bar = BarData(
- symbol=symbol,
- exchange=Exchange(exchange_str),
- interval=interval,
- datetime=row.name.to_pydatetime(),
- open_price=row["open"],
- high_price=row["high"],
- low_price=row["low"],
- close_price=row["close"],
- volume=row["volume"],
- gateway_name="RQ"
- )
- data.append(bar)