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

CSV格式数据示例如下

description

 

表头及第一行数据示例

 

交易日,合约代码,交易所代码,合约在交易所的代码,最新价,上次结算价,昨收盘,昨持仓量,今开盘,最高价,最低价,数量,成交金额,持仓量,今收盘,本次结算价,涨停板价,跌停板价,昨虚实度,今虚实度,最后修改时间,最后修改毫秒,申买价一,申买量一,申卖价一,申卖量一,申买价二,申买量二,申卖价二,申卖量二,申买价三,申买量三,申卖价三,申卖量三,申买价四,申买量四,申卖价四,申卖量四,申买价五,申买量五,申卖价五,申卖量五,当日均价,业务日期
20190102,ru1905,,,11280.0000,11290.0000,11305.0000,322472,11280.0000,11280.0000,11280.0000,246,27748800.0000,322468,0.0000,0.0000,12080.0000,10495.0000,0,0,08:59:00,500,11280.0000,10,11290.0000,10,0.0000,0,0.0000,0,0.0000,0,0.0000,0,0.0000,0,0.0000,0,0.0000,0,0.0000,0,112800.0000,20190102

 

可以发现几个问题:

  • 表头是中文的
  • datetime需要由3列数据合成
  • 在非交易时间可能出现垃圾数据,需要剔除(不包含集合竞价发出的那一个Tick数据)

 

基于csv格式的特点,开发载入tick数据到数据库的脚本,脚本功能如下:

  1. 在同一文件夹下,用for循环读取csv文件并载入到数据库
  2. 合成时间字符串,并且最终转换为datetime格式
  3. 通过datetime来判断非交易时间段,剔除垃圾数据的载入

脚本实现代码如下:

import os 
import csv
from datetime import datetime, time

from vnpy.trader.constant import Exchange
from vnpy.trader.database import database_manager
from vnpy.trader.object import 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.DictReader(f)

        ticks = []
        start = None
        count = 0

        for item in reader:

            # generate datetime
            date = item["交易日"]
            second = item["最后修改时间"]
            millisecond = item["最后修改毫秒"]

            standard_time = date + " " + second + "." + millisecond
            dt = datetime.strptime(standard_time, "%Y%m%d %H:%M:%S.%f")

            # filter
            if dt.time() > time(15, 1) and dt.time() < time(20, 59):
                continue

            tick = TickData(
                symbol="RU88",
                datetime=dt,
                exchange=Exchange.SHFE,
                last_price=float(item["最新价"]),
                volume=float(item["数量"]),
                bid_price_1=float(item["申买价一"]),
                bid_volume_1=float(item["申买量一"]),
                ask_price_1=float(item["申卖价一"]),
                ask_volume_1=float(item["申卖量一"]), 
                gateway_name="DB",       
            )
            ticks.append(tick)

            # do some statistics
            count += 1
            if not start:
                start = tick.datetime

        end = tick.datetime
        database_manager.save_tick_data(ticks)

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


if __name__ == "__main__":
    run_load_csv()

 

效果展示

 

description

description

Administrator
avatar
加入于:
帖子: 4500
声望: 320

必须加精

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

🤗🤗🤗

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

请问您的“ru主力连续”用的是从哪里的数据?谢谢。

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

点赞 请教下 lz的数据怎么下载的呀

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

在导入到sqlite中提示:peewee.IntegrityError: NOT NULL constraint failed: dbtickdata.name
没有name字段的值,请问是怎么处理的?

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

@KEKE, 请问,导入tick 数据的目的是什么?是为了回测吗?

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

请问一下,为什么按照这个载入之后,一直提示
Traceback (most recent call last):
File "untitled_1.py", line 73, in <module>
run_load_csv()
File "untitled_1.py", line 19, in run_load_csv
csv_load(file)
我把csv_load(file)注释掉就好了,但是只显示载入完成,没有插入数据呢
description

Super Moderator
avatar
加入于:
帖子: 31
声望: 13

原文中run_load_csv函数其实进行了两个操作:

  1. 在给定的文件夹路径下,找到每一个.csv文件,并显示载入数据...
  2. 对每一个.csv文件,运行函数csv_load(file),并显示插入数据...

因此,当你把csv_load(file)注释掉时,run_load_csv函数就只能进行上面的第一个操作了。因此,只显示载入数据

根据你的截图,你报错的原因应该是列名的问题,请你检查一下列名。
另外,数据入库可以参考编写python脚本实现数据入库.

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

谢谢,学习一下

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

李怡然 wrote:

原文中run_load_csv函数其实进行了两个操作:

  1. 在给定的文件夹路径下,找到每一个.csv文件,并显示载入数据...
  2. 对每一个.csv文件,运行函数csv_load(file),并显示插入数据...

因此,当你把csv_load(file)注释掉时,run_load_csv函数就只能进行上面的第一个操作了。因此,只显示载入数据

根据你的截图,你报错的原因应该是列名的问题,请你检查一下列名。
另外,数据入库可以参考编写python脚本实现数据入库.
函数csv_load(file) 这个函数我貌似没有啊,是在data_manage下面么?

Super Moderator
avatar
加入于:
帖子: 31
声望: 13

函数csv_load(file)是本帖作者KeKe自己编写的函数,并不在vnpy中。

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

我用楼主的代码加载tick数据到mysql的时候,500毫秒级的数据就存不到mysql, 就被忽略了,楼主的代码我用的没问题,但是感觉python 在处理mysql数据的datetime的时候,吧毫秒级别的处理没了。
mysql5.6 和 mysql8.0 我都试验过,都是这样的结果。

这块儿怎么改。有遇到过的吗?

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

自己找到问题点了, 需要把第三方库peewee.py文件里的 DATETIME='DATETIME', 修改位 DATETIME='DATETIME(3)', 如下:
FIELD = attrdict(
AUTO='INTEGER',
BIGAUTO='BIGINT',
BIGINT='BIGINT',
BLOB='BLOB',
BOOL='SMALLINT',
CHAR='CHAR',
DATE='DATE',
DATETIME='DATETIME(3)',
DECIMAL='DECIMAL',
DEFAULT='',
DOUBLE='REAL',
FLOAT='REAL',
INT='INTEGER',
SMALLINT='SMALLINT',
TEXT='TEXT',
TIME='TIME',
UUID='TEXT',
UUIDB='BLOB',
VARCHAR='VARCHAR')

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

很实用的代码,参考写法也能导入bar数据。

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

**你好,我载入数据没问题,但是用database_manager.save_tick_data(ticks),写入数据库,却未见精确到毫秒的数据,如下图,请问遇到这样的问题了吗?
description

**
description

description

Member
avatar
加入于:
帖子: 11
声望: 2

zhuyunfengnan wrote:

**你好,我载入数据没问题,但是用database_manager.save_tick_data(ticks),写入数据库,却未见精确到毫秒的数据,如下图,请问遇到这样的问题了吗?
description

**
description

description

数据导出来看看,应该没问题只是显示的问题

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

稍微改了一下,有个错误,谁能给指点一下,多谢
import os
import csv
from datetime import datetime, time

from vnpy.trader.constant import Exchange
from vnpy.trader.database import BaseDatabase
from vnpy.trader.object import 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,collection_name="IC1711.CFFEX"):
"""
读取csv文件内容,并写入到数据库中
"""
with open(file, "r") as f:
reader = csv.DictReader(f)

    ticks = []
    start = None
    count = 0

    for item in reader:

        # generate datetime
        date = item["交易日"]
        second = item["最后修改时间"]
        millisecond = item["最后修改毫秒"]

        standard_time = date + " " + second + "." + millisecond
        dt = datetime.strptime(standard_time, "%Y%m%d %H:%M:%S.%f")

        # filter
        if dt.time() > time(15, 1) and dt.time() < time(20, 59):
            continue


        tick = TickData(
            symbol="IC1711",
            datetime=dt,
            exchange=Exchange.CFFEX,
            last_price=float(item["最新价"]),
            volume=float(item["数量"]),
            bid_price_1=float(item["申买价一"]),
            bid_volume_1=float(item["申买量一"]),
            ask_price_1=float(item["申卖价一"]),
            ask_volume_1=float(item["申卖量一"]),
            gateway_name="DB",
        )
        ticks.append(tick)

        # do some statistics
        count += 1
        if not start:
            start = tick.datetime

    end = tick.datetime
    BaseDatabase.save_tick_data(ticks)

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


if name == "main":
run_load_csv()

Traceback (most recent call last):
File "C:/Users/David/Desktop/test/combine.py", line 74, in <module>
run_load_csv()
File "C:/Users/David/Desktop/test/combine.py", line 19, in run_load_csv
csv_load(file)
File "C:/Users/David/Desktop/test/combine.py", line 68, in csv_load
BaseDatabase.save_tick_data(ticks)
TypeError: save_tick_data() missing 1 required positional argument: 'ticks'

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

数据库模块已更新,通过database.py中的get_database()函数来获取BaseDatabase, 不要直接导入使用

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

郭易燔 wrote:

数据库模块已更新,通过database.py中的get_database()函数来获取BaseDatabase, 不要直接导入使用

已经解决了,一语道破天机,多谢多谢

您看下站内消息,多谢

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

沪公网安备 31011502017034号

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