IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> vnpy试用candle_chart -> 正文阅读

[大数据]vnpy试用candle_chart

好久之前听过vnpy,前两天看到还在更新,觉得可以研究一下。

主要是对其中的K线的UI

写期货回测最主要的是图形化的工具比较缺,都是用数字图表,不直观。前段时间用plot画图,发现画出来的都是静态的,且数据量多后慢的要死。

看起来这个UI画的K线要好很多,值得研究一下。

网上有说明vnpy可保存为sqlite和mongdb.

一开始用的是sqlite,原因是无需安装,直接用,按照说明下载对应的组件,因为数据源这块vnpy已经抽象出BaseDatabase,需要用到哪一种组件再实现对应的组件,sqlite实现为vnpy-sqlite

先把数据准备好:

图中表示的是RBL9的1分钟的数据,我们只需要将其转换为vnpy识别的格式,然后利用vnpy提供的接口即可实现数据存入sqlite,最终通过

save_bar_data(self, bars: List[BarData])

接口将数据存入,不过我在存入的时候遇到了不小的问题:

1)sqlite要求存入时间时是一个指定格式的字符串,而提供的组件还是按照datetime格式存入的,导致无论如何存不进去。后来没有办法,强行在存入时修改为字符串,存进去的格式如下:

然后发现存进去了,取的时候又是按照datetime格式取出来的,而且 取的时候用的是这个接口:

load_bar_data, 一定要求输入开始时间和结束时间,使用datetime转换出来的格式为2021-01-05 00:00:00,这个东西作为参数直接就获取不到数据。实在不想重头改到尾,放弃使用sqlite,考虑使用mongodb(网上能成功的我看了一下应该代码比较旧了,我拉取的代码为:

因此之前网上的所有的做法由于代码的变动都失效了。

改用mongodb的比较容易 ,直接到官网上下载mongodb-windows-x86_64-5.0.6-signed.msi,进行安装后运行即可。

然后在vnpy的运行目录加上mongo的配置:

?至此,主要的工作就做完了,剩下的就是将表格中的数据与

BarData的数据对齐即可

由于datetime是一个时间数据,在表格中我们是用两个字段来表示的,这一步比较费点精神:

    datetime_format = '%Y-%m-%d %H:%M'
    t = data['时间'].astype('str')
    data['时间'] = pd.to_datetime(data['日期'] + " " + t.str[:-2] + ":" + t.str[-2:], format=datetime_format)
    del data['日期']

然后把字段名再进行对齐:

    data.columns = ['exchange', 'symbol', 'datetime', 'open', 'high', 'low', 'close', 'volume', '成交额',
                             'open_interest', 'interval']

最后通过接口把数据存入mongdb即可:

# 封装函数
def move_df_to_mongodb(imported_data: pd.DataFrame):
    bars = []
    start = None
    count = 0

    for row in imported_data.itertuples():

        bar = BarData(

            symbol=row.symbol,
            exchange=row.exchange,
            datetime=row.datetime,
            interval=row.interval,
            volume=row.volume,
            open_price=row.open,
            high_price=row.high,
            low_price=row.low,
            close_price=row.close,
            open_interest=row.open_interest,
            gateway_name="DB",

        )
        bars.append(bar)
        # do some statistics
        count += 1
        if not start:
            start = bar.datetime
    end = bar.datetime

    # insert into database
    mongo_manager.save_bar_data(bars)
    print(f"Insert Bar: {count} from {start} - {end}")

注意,存的过程会报错,这个没有去深究,因为我确定已经存成功了:

后面回头看了下错误细节:

百度搜索一下,确认是由于pymongo从4.1开始移除了update等相关函数,所以需要安装早一点版本的,看了一下系统的确实安装了4.0.1的pymongo,查看?vnpy_mongodb-1.0.1源码,在setup.cfg中查找到依赖项:

将之前的pymongo删除,安装指定版本,再次运行save_data.py, 发现错误消失

存完了以后可以直接运行candle_chart中的run.py,如果没有数据,运行的效果图如下:

数据存入成功后运行的效果图如下:

?

?最后附上save_data.py代码:

from vnpy.trader.constant import (Exchange, Interval)
import pandas as pd
from vnpy.trader.object import (BarData, TickData)
from vnpy_mongodb import Database

mongo_manager = Database()


# 封装函数
def move_df_to_mongodb(imported_data: pd.DataFrame):
    bars = []
    start = None
    count = 0

    for row in imported_data.itertuples():

        bar = BarData(

            symbol=row.symbol,
            exchange=row.exchange,
            datetime=row.datetime,
            interval=row.interval,
            volume=row.volume,
            open_price=row.open,
            high_price=row.high,
            low_price=row.low,
            close_price=row.close,
            open_interest=row.open_interest,
            gateway_name="DB",

        )
        bars.append(bar)
        # do some statistics
        count += 1
        if not start:
            start = bar.datetime
    end = bar.datetime

    # insert into database
    mongo_manager.save_bar_data(bars)
    print(f"Insert Bar: {count} from {start} - {end}")


if __name__ == "__main__":

    # 读取需要入库的csv文件,该文件是用gbk编码
    data = pd.read_csv('RBL9.csv', encoding='gbk')
    # 将csv文件中 `市场代码`的 SC 替换成 Exchange.SHFE SHFE
    data['市场代码'] = Exchange.SHFE
    # 增加一列数据 `inteval`,且该列数据的所有值都是 Interval.MINUTE
    data['interval'] = Interval.MINUTE
    # 明确需要是float数据类型的列
    float_columns = ['开', '高', '低', '收', '成交量', '持仓量']
    for col in float_columns:
        data[col] = data[col].astype('float')

    datetime_format = '%Y-%m-%d %H:%M'
    t = data['时间'].astype('str')
    data['时间'] = pd.to_datetime(data['日期'] + " " + t.str[:-2] + ":" + t.str[-2:], format=datetime_format)
    del data['日期']
    data.columns = ['exchange', 'symbol', 'datetime', 'open', 'high', 'low', 'close', 'volume', '成交额',
                             'open_interest', 'interval']
    move_df_to_mongodb(data)

最后感谢网上一个哥们的代码,很多做了参照,一下子找不到他的相关链接,后面找着了会补上参照的相关文章。?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:08:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:37:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码