VeighNa量化社区
你的开源社区量化交易平台
saji's Avatar
Member
离线
20 帖子
声望: 0

我们参考论坛,生成用于导入tick的脚本,数据库是MongoDB。

目前遇到的问题是:

  • 若使用offset-naive格式的tick时间导入,则脚本只能导入一天的数据。第二天的数据会因为在生成tickoverview时,出现“不能比较含时区和不含时区的datetime数据”的错误,而中止执行导入;

description

  • 若使用offset-aware格式的tick时间导入,则所有的数据虽能完成导入,但导入数据库后的时间值有错误。并导致tickoverview错误。

description

我们之前发帖,得到的答复是vnpy在将datetime导入时,会做自动的时区转换。

因此,我们的理解就是,原始的datetime即便是不含时区的也无所谓,会自动处理。但是实际用save_tick_data()导入时,发现官方的脚本是在用导入后含有时区的datetime,和原始不含时区的datetime直接比较。因此必然报错;

但如果我们自行转换原始的datetime,添加时区信息。官方脚本在写入数据库后,这个值会被改写,小了8小时。因此,自觉上认为是官方的脚本可能有bug。

我们数据的第一条是:
2020-02-03 08:59:00.157000+08:00

写入mongodb后,对应的第一条变成了:
2020-02-03T00:59:00.157+00:00

我们的脚本代码:

import os                              # 导入标准库,后续要使用其listdir()
import csv                             # 导入csv库,后续要使用其DictReader()
from datetime import datetime, time    # 用于处理datetime类型
import pytz

### vnpy中的模块导入
from vnpy.trader.constant import Exchange    # 导入交易所的缩写
from vnpy.trader.database import get_database    # 导入get_database()获取对象,使用对象的save_tick_data()
from vnpy.trader.object import TickData    # 导入object模块中的TickData数据对象的定义

def run_load_csv():
    """
    遍历同一文件夹内所有csv文件,并且载入到数据库中
    """
    for file in os.listdir("."): 
        if not file.endswith(".csv"): 
            continue

        print("载入文件:", file)
        csv_load(file)

def csv_load(file):
    """
    读取csv文件内容,并写入到数据库中    
    """
    with open(file,'r') as f:
        reader = csv.reader(f)

        ticks = []    # 用于存放所合成的tick数据
        start = None
        count = 0

        # 遍历迭代器,其实items就是每一行的内容,是个list
        for items in reader:

            # 生成dt时间
            date = items[3]
            second = items[4]
            millisecond = items[5]
            standard_time = date + " " + second + "." + millisecond
            dt = datetime.strptime(standard_time, "%Y%m%d %H:%M:%S.%f")
            # 添加时区信息
            db_tz = pytz.timezone("Asia/Shanghai")
            dt = dt.astimezone(db_tz)

            # 筛选无效时间段
            if dt.time() < time(8,59,0) or dt.time() > time(15,0,0):
                continue
            elif dt.time() > time(10,15,0) and dt.time() < time(10,30,0):
                continue
            elif dt.time() > time(11,30,0) and dt.time() < time(13,30,0):
                continue

            # 生成单条tick
            tick = TickData(
                symbol = 'c2005',
                datetime = dt,
                exchange = Exchange.DCE,

                last_price = float(items[6]),
                last_volume = float(items[7]),
                high_price = float(items[8]),
                low_price = float(items[9]),
                open_price = float(items[10]),
                ask_price_1 = float(items[13]),
                ask_volume_1 = float(items[14]),
                bid_price_1 = float(items[15]),
                bid_volume_1 = float(items[16]),

                limit_up = float(items[17]),
                limit_down = float(items[18]),
                open_interest = float(items[19]),
                turnover = float(items[20]),
                pre_close = float(items[21]),
                gateway_name = "DB",
            )
            ticks.append(tick)

            count += 1
            if not start:
                start = dt
            end = dt

        data_manager = get_database()
        data_manager.save_tick_data(ticks)

        print("插入数据",start,"-",end,"总数量:",count)  

if __name__ == "__main__":
    run_load_csv()

我们参考KeKe大佬的Tick数据导入脚本,尝试将本地的tick数据导入mongodb中。

因为发现新版的vnpy加入了时区信息,所以按照社区中的写法,将本地数据也加入了时区值

description

导入时的print也显示,datetime中含有正确的时区信息。

description

但在导入mongodb后,时区值由+8,变成了+0
同时,count值也明显错误。

description

请大佬指点一下问题所在

xiaohe wrote:

升级一下vnpy_mongodb吧

能否简单说明一下具体的问题?
是我代码有问题,还是因为官方团队对mongodb的模块升级导致现有代码不能使用?

我的疑问是,因为我们安装的是一站式的vn studio,这意味着各个模块之间的协同工作在同一版本下是没有问题的。即只要我们不主动升级,现有版本的正常运行就不会乱。
如果是因为模块升级导致代码不能执行,那将来在实盘中不是会引发很多问题吗?(原来的版本下运行的好好的,因为官方模块升级导致出错)

一来,vnpy官方没有详细的文档,说明具体使用方法;(有课程,但都是老版本的。)
二来,自行频繁升级,又导致用户需要实时修正。关键还不知道何时需要修正?怎么修正?

开发团队是如何考虑这个问题的呢?
有无实盘交易的用户,他们是如何解决这个问题的呢?

还请赐教,非常感谢!

我们尝试参考keke大佬的Tick data导入脚本载入Tick数据(csv格式)到数据库中,导入本地的玉米合约的tick数据。
但在save_tick_data()的使用中遇到了困难。

因为数据库模块的更新,我们尝试通过get_database()来获取BaseDatabase。

description

因为对类的使用不太懂,参考了社区中的建议:

description

但是,执行后仍有错误:

description

本人的vnpy版本是3.3.0

代码如下:

import os                              
import csv                              
from datetime import datetime, time     

### vnpy中的模块导入
from vnpy.trader.constant import Exchange     
from vnpy.trader.database import  get_database     
from vnpy.trader.object import TickData     



file = "c2005_20200203.csv"
with open(file,'r') as f:
    reader = csv.reader(f)

    ticks = []     
    start = None
    count = 0


    for items in reader:

        # 生成dt时间
        date = items[3]
        second = items[4]
        millisecond = items[5]
        standard_time = date + " " + second + "." + millisecond
        dt = datetime.strptime(standard_time, "%Y%m%d %H:%M:%S.%f")

        # 筛选无效时间段
        if dt.time() < time(8,59,0) or dt.time() > time(15,0,0):
            continue
        elif dt.time() > time(10,15,0) and dt.time() < time(10,30,0):
            continue
        elif dt.time() > time(11,30,0) and dt.time() < time(13,30,0):
            continue

        # 生成单条tick
        tick = TickData(
            symbol = 'c2005',
            datetime = dt,
            exchange = Exchange.DCE,

            last_price = float(items[6]),
            last_volume = float(items[7]),
            high_price = float(items[8]),
            low_price = float(items[9]),
            open_price = float(items[10]),
            ask_price_1 = float(items[13]),
            ask_volume_1 = float(items[14]),
            bid_price_1 = float(items[15]),
            bid_volume_1 = float(items[16]),

            limit_up = float(items[17]),
            limit_down = float(items[18]),
            open_interest = float(items[19]),
            turnover = float(items[20]),
            pre_close = float(items[21]),
            gateway_name = "DB",
        )
        ticks.append(tick)

        count += 1
        if not start:
            start = dt
        end = dt

    #print(ticks[:5])    
    database_manager = get_database()
    database_manager.save_tick_data(ticks)

    print("插入数据",start,"-",end,"总数量:",count)

社区中看到的另一种写法是:

from vnpy.trader.database import BaseDatabase, get_database
.....

database:BaseDatabase = get_database()
database.save_tick_data(ticks)

得到的错误是一样的

MTF wrote:

DataManager没有支持TICK数据的CSV导入,可以自己写个脚本来实现了

明白了,在看社区keke大神的帖子学习中!

在尝试使用数据管理模块,加载本地Tick数据时,遇到问题:

使用文档中,说模块支持5种数据周期:

description

但在我的终端上看到图形界面中并没有Tick周期的选择:

description

请管理员指教

已解决,谢谢

😔。。。又是一个死循环

因为是扫二维码登录的,所以只有用户名,没有原密码,所以没法改密码。。。同理无法设置邮箱

description

description

翻了之前的帖子,说再公众号里留言。。于是我留言了

但是得到的回复是——把要重置的邮箱信息提供一下。。。

我都没有原来的信箱,无法理解这个重置,所以留了新的邮箱。。。

然后就没有然后了

xiaohe wrote:

看报错像是qt环境配置的问题,新手还是建议卸掉别的python一键安装veighna_studio比较好

的确是qt的环境变量问题。这个按照相关信息也是能够解决的,犯事后续仍有cython的配置问题。。。
太容易踩坑了!

MTF wrote:

pip install vnpy_ctastrategy

另外,想问下大佬:
1、官方一直推荐使用一键安装的studio安装vnpy,如果我先安装studio,再安装anaconda会有什么问题吗?
2、看了之前的版本,最开始时,官方也是用anaconda来配置python的。是不是因为后续安装会碰到各种坑,所以才放弃推荐使用anaconda的方式呢?
3、miniconda会好些吗?

七月雪 wrote:

怀疑有不同版本的python,你现在的这个python环境找不到这个模块

我觉得是因为自己用anaconda安装python的原因所致,

但是vnpy又都是用pip安装的,所以找不到这些模块。。。

虽然后来再手动逐一把所有的模块都安装了一遍,但感觉这样不是事儿

不知道你是用conda单独给vnpy建立环境后,再使用的吗?

这样的单独环境,是否会引发其它莫名其妙的错误呢?

感觉vnpy的安装和anaconda很不兼容,总是引发这样或那样的错误。。。

但一定要用户安装stuido版本,会不方便其它项目的使用啊。。。

感觉十分矛盾

MTF wrote:

pip install vnpy_ctastrategy

我原以为安装了vn.py3.3就是安装了全部,后来发现所有的模块都需要手动安装。

description

于是,手动pip install了所有提示找不到的模块。但在最后执行run.py的时候,仍然出现了如下错误:

description

感觉有点奔溃啊:(

七月雪 wrote:

怀疑有不同版本的python,你现在的这个python环境找不到这个模块

没有不同的版本,就一个。

七月雪 wrote:

你试试conda命令安装创建一个虚拟环境,把vn.py装进里面去,这样不同版本的库不会混乱

是的,这次试用手动安装的vnpy成功后,要考虑把目前的vnpy卸载掉。通过conda来配置环境,太乱了!

手动安装vn.py成功,python3.9,win10,Anaconda
手动运行example下的run.py,出现如下错误:

description
请问是什么原因?

虽然安装成功,但是手动运行vn.py又遇到了问题。
还是新开一贴求助吧

简单记录一下解决的过程:

我们重新安装了win10,然后是Anaconda(目前官方的版本是Python3.9的,因为vn.py号称向前兼容的,因此估计问题不大!)
之后,是按照官方文档的手动安装。提示的error有两个:

description

**1. 提示需要安装vc++ 14.0以上的库;

  1. TA-Lib安装不成功。**

ta模块安装不成功是社区中经常出现的,估计是下载不能。解决方式是手动下载所需的版本,在本地安装。下载的网址如下:
TA模块下载
我们选择的是之前提示的0.4.24版本

description

至于vc++库的问题,我们已经升级到了win10,查看系统后确认相应的最新库都已经安装了。估计是TA-lib安装不成导致的吧,不去管它。

description

在手动安装ta模块后,我们再次执行install.bat,提示安装成功!
唯一的提示是:spyder因为依赖库被改动,所以用不了。这目前不是大问题,至此安装结束。

QtGui之类的应该都是windows提供的用来处理图形界面的dll吧,难道win7是没有的?

反正升级到win10也是必须的,索性重装了。

看到其它帖子中也有类似问题,因此看看管理员这边有何建议?

感觉vn.py的安装很折磨人啊,从掘金过来的,主要看中vn.py的社区活跃度和tick级别回测功能,同时今后还可以用掘金的仿真交易接口。
平台的功能性、扩展性都很好,就是安装超级费事啊。

我没有选择一键安装,原因是本来有其它项目,而且用anaconda配置环境的。
win7、3.88下执行手动安装基本没有太大问题:

description

只是当中提示有warning,主要是依赖库变动后,Spyder不能用了。问题不大!

description
但在手动启动run.py时出现如下错误:

description

我们在社区中初步搜索,发现可能是c++库没有安装的问题。于是更新安装:

description
但是,重启后执行run.py,问题依旧:

description

不知道这是否与我使用的win7系统有关?
准备装系统了!
不过还是在社区发帖求助一下。

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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