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

最近购买了些tick数据准备做回测用。需要批量把数据导入到数据库里,这里我用的默认的sqlite数据库。

文章结尾这些数据也分享给大家,是5月全市场所有期货合约的tick数据

插入数据的代码如下:

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 csv_load(file,symbol,exchange):
    """
    file: str; 文件路径
    symbol: str; 合约代码
    exchange: str; 交易所代码(SHFE, DCE, CZCE, INE, CFFEX)
    """
    with open(file, "r") as f:
        reader = csv.DictReader(f)
        ticks = []
        start = None
        count = 0
        for item in reader:
            # generate datetime
            date = item["datetime"]

            standard_time = date
            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
            exchange_map = {"SHFE":Exchange.SHFE, "DCE":Exchange.DCE, "CZCE":Exchange.CZCE, "CFFEX":Exchange.CZCE, "INE":Exchange.INE}
            tick = TickData(
                symbol = symbol,
                datetime = dt,
                exchange = exchange_map[exchange],
                last_price=float(item["last_price"]),
                volume=float(item["volume"]),
                bid_price_1=float(item["bid_price1"]),
                bid_volume_1=float(item["bid_volume1"]),
                ask_price_1=float(item["ask_price1"]),
                ask_volume_1=float(item["ask_volume1"]), 
                gateway_name="DB",       
            )
            ticks.append(tick)
            count += 1
            if not start:
                start = tick.datetime

        end = tick.datetime
        database_manager.save_tick_data(ticks)
        print("【已插入】 数据起点: ", start, "。数据终点: ", end, "总tick数:", count)

def insert_all_csvs(symbol, exchange):
    """
    找到当前文件夹内所有的csv文件,逐个插入数据库
    """
    count = 1
    for file in os.listdir("."): 
        if not file.endswith(".csv"): 
            continue
        print(str(count), + " 文件名:", file)
        csv_load(file,symbol, exchange)
        count += 1
    print("数据入库结束")

if __name__ == "__main__":
    symbol = "rb88" ## 螺纹主力合约
    exchange = 'SHFE'
    insert_all_csvs(symbol, exchange)
    print("全部数据插入结束")

使用方法:

  1. 所有要插入的csv文件放在一个文件夹里(注意是同一个期货合约/主力合约)
  2. 将这个py文件放在同一个文件夹里
  3. 命令行里运行这个文件,就可以将所有csv文件插入数据库啦

数据在哪里?
可以在回测里使用。但是有时候我更喜欢从notebook里直接去找这些数据,做些分析和测试。那么这个sqlite的database在这个文件夹里,是个隐藏文件夹。这里可以通过sqlalchemy这些包create_engine了之后直接读取这个database文件。

题外话:可以看到一些其他数据也都在这里。有时候需要修改程序设置里的一些值我会直接改cta_strategy_setting,这样就不用打开图形界面去修改了。

description

数据请自取:
链接:https://pan.baidu.com/s/1JdnZ-y7Sr7MTJU1bkYtSvQ?pwd=8bsw
提取码:8bsw

Member
加入于:
帖子: 6
声望: 1

补充下从notebook里读取数据库数据代码:

import pandas as pd
import numpy as np
import sqlite3
con = sqlite3.connect("database.db")
con = sqlite3.connect("database.db")
df = pd.read_sql_query("SELECT * FROM sqlite_master WHERE type = 'table';", con)

description

Member
avatar
加入于:
帖子: 1508
声望: 109

感谢分享!

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

楼主,请问我用jupyter notebook读K线数据时,出现“历史数据加载完成,数据量:0”是怎么回事呢? 已经将database.db 拷贝到C:\Users\admin.jupyter\

图片如下:
description

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

Vincent_Zhan wrote:

楼主,请问我用jupyter notebook读K线数据时,出现“历史数据加载完成,数据量:0”是怎么回事呢? 已经将database.db 拷贝到C:\Users\admin.jupyter\

图片如下:
description

把vnpy的K线数据库 C:\Users\你的用户名.vntrader\database.db (没有更改文件夹)拷贝到cta_backtesting
就可以解决以上问题。

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

沪公网安备 31011502017034号

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