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

请大佬指点一下问题所在

我们尝试参考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)

得到的错误是一样的

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

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

description

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

description

请管理员指教

😔。。。又是一个死循环

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

description

description

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

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

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

然后就没有然后了

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

description
请问是什么原因?

感觉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号

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