vn.py量化社区
By Traders, For Traders.
Administrator
avatar
加入于:
帖子: 163
声望: 20

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
加入于:
帖子: 1868
声望: 85

必须加精

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

🤗🤗🤗

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

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

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

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

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