VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 7
声望: 5

数据库模块原理

在量化中,研究策略和实盘交易,都离不开数据。如果要提升回测速度,那么就需要搭建本地数据库。

VNPY集成的数据源

  • 国内期货市场: 米匡推出的RQData数据服务
  • 海外市场: 盈透证券(IB)

1)RQData数据服务

vn.py对米匡的rqdatac库进行了再次封装调用实现。

实现类: RqdataClient
相关代码: vnpy\trader\rqdata.py

demo:从rqdata获取历史行情

操作步骤:

    1) 初始化rqdataClient
    2) 构造请求对象
    3) 从rqdata获取数据
    4) 将数据保存到本地数据库

from vnpy.trader.rqdata import RqdataClient
from vnpy.trader.object import HistoryRequest

#初始化rqdataClient
rqdataClient=RqdataClient()
rqdataClient.init()

#构造请求对象
historyReq=HistoryRequest(
    #symbol='C2105.DCE',
    symbol='C2105',
    exchange=Exchange('DCE'),
    start=datetime(2021,1,1),
    end=datetime(2021,2,1),
    interval=Interval.DAILY
)

#从rqdata获取数据
retData=rqdataClient.query_history(historyReq)

#将数据保存到本地数据库
database_manager.save_bar_data(retData)

2)其它数据源

对应接口交易接口Gateway类的query_history函数,实现历史数据的下载。这里亿盈透证券(IB)接口为例。
实现类: IbGateway(BaseGateway)
相关代码: vnpy\gateway\ib\ib_gateway.py

3)本地数据库

通过对象database_manager实现,该对象通过抽象工厂模式,根据实际情况调用具体的数据库实现类:
相关类: BaseDatabase
相关代码

driver: str = SETTINGS["database.driver"]
module_name: str = f"vnpy.database.{driver}"
try:
    database_manager: BaseDatabase = import_module(module_name).database_manager
except ModuleNotFoundError:
    print(f"找不到数据库驱动{module_name},使用默认的SQLite数据库")
    database_manager: BaseDatabase = import_module("vnpy.database.sqlite").database_manager

代码位置: vnpy\trader\database.py
类的具体实现: vnpy\database

MongoDB

为了提高性能,使用MongoDB,因此,只需要关注MongoDB的实现。
相关类: MongodbDatabase(BaseDatabase)
代码位置: vnpy\database\mongodb\mongodb_database.py

在使用monggoDB时,使用了mongoengine的ORM功能,实现了以下三个对象:

  • DbBarData:对应数据库的db_bar_data集合
  • DbTickData:对应数据库的db_tick_data
  • DbBarOverView:对应数据库的db_bar_overview

demo:获取本地数据库的数据


from datetime import datetime
from vnpy.trader.database import database_manager
from vnpy.trader.object import Interval
from vnpy.trader.constant import Exchange


barDatas=database_manager.load_bar_data(
    'C2105',
    Exchange('DCE'),
    Interval.MINUTE,
    start=datetime(2021,1,1),
    end=datetime(2021,1,10)
)


for bar in barDatas:
    print(f"{bar.datetime} {bar.symbol}:open_price:{bar.open_price}")


barOverViews=database_manager.get_bar_overview()


for barOverView in barOverViews:
    print(f"{barOverView.symbol} start:{barOverView.start} end:{barOverView.end} count:{barOverView.count}")

一句话概括:用好database_manager这个对象,提供了如下方法:

  • def load_bar_data( self, symbol: str, exchange: Exchange,  interval: Interval,  start: datetime, end: datetime) -> List[BarData]
  • def load_tick_data(self,  symbol: str, exchange: Exchange,  start: datetime,  end: datetime ) -> List[TickData]:
  • def get_bar_overview(self) -> List[BarOverview]
  • def delete_bar_data( self,  symbol: str,  exchange: Exchange, interval: Interval ) -> int:
  • def delete_tick_data(self,  symbol: str, exchange: Exchange ) -> int:
Member
avatar
加入于:
帖子: 8
声望: 0

请问 如果连接的是 盈透证券(IB)接口怎么获取历史数据呢? 我在主页面有成功订阅了黄金的合约,但是在数据管理模块与历史数据回测均不能获取历史数据,显示下载总数据量为0.。。。rqdate这个我有配置过,但这个应该是能直接下载国内的,所以不行。那我要历史回测数据,只能从本地导入数据么???还有没有其他办法呢??如果从本地导入具体应该怎么做的呢???

Member
avatar
加入于:
帖子: 4622
声望: 284

使用IB接口可参考https://www.vnpy.com/forum/topic/1945-vn-pykuai-su-ru-men-4-hai-wai-shi-chang-ib

Member
avatar
加入于:
帖子: 5
声望: 0

database的database_mangaer现在改成什么了?

Member
avatar
加入于:
帖子: 716
声望: 62

description
使用get_databases()获取数据库实例

Member
avatar
加入于:
帖子: 5
声望: 0

问下现在是不是database_mongodb.py和rqdaya.py都没有了

Member
avatar
加入于:
帖子: 101
声望: 9

白川 wrote:

问下现在是不是database_mongodb.py和rqdaya.py都没有了
被剥离到了相应的项目中,比如mongodb_database.py在vnpy_mongodb中,这个文件夹在vnstudio/Lib/site-packages目录下

Member
avatar
加入于:
帖子: 1
声望: 0

vnpy2.0.7 没有改动
使用下面的
`
from vnpy.trader.constant import Exchange, Interval #交易所,kline周期类型
from vnpy.trader.object import BarData #类名驼峰命名
from vnpy.trader.database import database_manager #对象小写,中间下划线
CHINA_TZ = pytz.timezone("Asia/Shanghai") #时区
with open("if_data.csv") as f:
reader = csv.DictReader(f)

bars = []
for d in reader:
    dt = datetime.strptime(d["datetime"], "%Y-%m-%d %H:%M:%S")
    dt = CHINA_TZ.localize(dt)#带上时区

    bar = BarData(
        symbol=d["symbol"],
        exchange=Exchange(d["exchange"]),
        interval=Interval.MINUTE,
        datetime=dt,
        open_price=d["open"],
        high_price=d["high"],
        low_price=d["low"],
        close_price=d["close"],
        volume=d["volume"],
        open_interest=d["open_interest"],
        gateway_name="DB"
    )
    bars.append(bar)#添加到列表

database_manager.save_bar_data(bars)

`
载入.csv文件时,发生下面的报错,请问如何解决?

Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py",
line 2829, in execute_sql
cursor.execute(sql, params or ())
sqlite3.IntegrityError: NOT NULL constraint failed: dbbardata.turnover

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File ".\load_data_36.py", line 34, in <module>
database_manager.save_bar_data(bars)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\vnpy\trader\database\database_sql.py", line 373, in save_bar_data
self.class_bar.save_all(ds)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\vnpy\trader\database\database_sql.py", line 148, in save_all
DbBarData.insert_many(c).on_conflict_replace().execute()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 1698, in inner
return method(self, database, args, **kwargs)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 1769, in execute
return self._execute(database)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2473, in _execute
return super(Insert, self)._execute(database)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2236, in _execute
cursor = database.execute(self)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2842, in execute
return self.execute_sql(sql, params, commit=commit)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2836, in execute_sql
self.commit()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2627, in exit
reraise(new_type, new_type(
exc_args), traceback)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 178, in reraise
raise value.with_traceback(tb)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\peewee.py", line 2829, in execute_sql
cursor.execute(sql, params or ())
peewee.IntegrityError: NOT NULL constraint failed: dbbardata.turnover

Member
avatar
加入于:
帖子: 4622
声望: 284

可以删除用户名目录下的.vntrader目录下的database.db再运行试试,删除前可以做好数据库的备份。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】