我们参考论坛,生成用于导入tick的脚本,数据库是MongoDB。
目前遇到的问题是:
我们之前发帖,得到的答复是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加入了时区信息,所以按照社区中的写法,将本地数据也加入了时区值
导入时的print也显示,datetime中含有正确的时区信息。
但在导入mongodb后,时区值由+8,变成了+0
同时,count值也明显错误。
请大佬指点一下问题所在
xiaohe wrote:
升级一下vnpy_mongodb吧
能否简单说明一下具体的问题?
是我代码有问题,还是因为官方团队对mongodb的模块升级导致现有代码不能使用?
我的疑问是,因为我们安装的是一站式的vn studio,这意味着各个模块之间的协同工作在同一版本下是没有问题的。即只要我们不主动升级,现有版本的正常运行就不会乱。
如果是因为模块升级导致代码不能执行,那将来在实盘中不是会引发很多问题吗?(原来的版本下运行的好好的,因为官方模块升级导致出错)
一来,vnpy官方没有详细的文档,说明具体使用方法;(有课程,但都是老版本的。)
二来,自行频繁升级,又导致用户需要实时修正。关键还不知道何时需要修正?怎么修正?
开发团队是如何考虑这个问题的呢?
有无实盘交易的用户,他们是如何解决这个问题的呢?
还请赐教,非常感谢!
我们尝试参考keke大佬的Tick data导入脚本载入Tick数据(csv格式)到数据库中,导入本地的玉米合约的tick数据。
但在save_tick_data()的使用中遇到了困难。
因为数据库模块的更新,我们尝试通过get_database()来获取BaseDatabase。
因为对类的使用不太懂,参考了社区中的建议:
但是,执行后仍有错误:
本人的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种数据周期:
但在我的终端上看到图形界面中并没有Tick周期的选择:
请管理员指教
已解决,谢谢
😔。。。又是一个死循环
因为是扫二维码登录的,所以只有用户名,没有原密码,所以没法改密码。。。同理无法设置邮箱
翻了之前的帖子,说再公众号里留言。。于是我留言了
但是得到的回复是——把要重置的邮箱信息提供一下。。。
我都没有原来的信箱,无法理解这个重置,所以留了新的邮箱。。。
然后就没有然后了
xiaohe wrote:
看报错像是qt环境配置的问题,新手还是建议卸掉别的python一键安装veighna_studio比较好
的确是qt的环境变量问题。这个按照相关信息也是能够解决的,犯事后续仍有cython的配置问题。。。
太容易踩坑了!
MTF wrote:
pip install vnpy_ctastrategy
另外,想问下大佬:
1、官方一直推荐使用一键安装的studio安装vnpy,如果我先安装studio,再安装anaconda会有什么问题吗?
2、看了之前的版本,最开始时,官方也是用anaconda来配置python的。是不是因为后续安装会碰到各种坑,所以才放弃推荐使用anaconda的方式呢?
3、miniconda会好些吗?
七月雪 wrote:
怀疑有不同版本的python,你现在的这个python环境找不到这个模块
我觉得是因为自己用anaconda安装python的原因所致,
但是vnpy又都是用pip安装的,所以找不到这些模块。。。
虽然后来再手动逐一把所有的模块都安装了一遍,但感觉这样不是事儿
不知道你是用conda单独给vnpy建立环境后,再使用的吗?
这样的单独环境,是否会引发其它莫名其妙的错误呢?
感觉vnpy的安装和anaconda很不兼容,总是引发这样或那样的错误。。。
但一定要用户安装stuido版本,会不方便其它项目的使用啊。。。
感觉十分矛盾
MTF wrote:
pip install vnpy_ctastrategy
我原以为安装了vn.py3.3就是安装了全部,后来发现所有的模块都需要手动安装。
于是,手动pip install了所有提示找不到的模块。但在最后执行run.py的时候,仍然出现了如下错误:
感觉有点奔溃啊:(
七月雪 wrote:
你试试conda命令安装创建一个虚拟环境,把vn.py装进里面去,这样不同版本的库不会混乱
是的,这次试用手动安装的vnpy成功后,要考虑把目前的vnpy卸载掉。通过conda来配置环境,太乱了!
手动安装vn.py成功,python3.9,win10,Anaconda
手动运行example下的run.py,出现如下错误:
请问是什么原因?
虽然安装成功,但是手动运行vn.py又遇到了问题。
还是新开一贴求助吧
简单记录一下解决的过程:
我们重新安装了win10,然后是Anaconda(目前官方的版本是Python3.9的,因为vn.py号称向前兼容的,因此估计问题不大!)
之后,是按照官方文档的手动安装。提示的error有两个:
**1. 提示需要安装vc++ 14.0以上的库;
ta模块安装不成功是社区中经常出现的,估计是下载不能。解决方式是手动下载所需的版本,在本地安装。下载的网址如下:
TA模块下载
我们选择的是之前提示的0.4.24版本
至于vc++库的问题,我们已经升级到了win10,查看系统后确认相应的最新库都已经安装了。估计是TA-lib安装不成导致的吧,不去管它。
在手动安装ta模块后,我们再次执行install.bat,提示安装成功!
唯一的提示是:spyder因为依赖库被改动,所以用不了。这目前不是大问题,至此安装结束。
QtGui之类的应该都是windows提供的用来处理图形界面的dll吧,难道win7是没有的?
反正升级到win10也是必须的,索性重装了。
看到其它帖子中也有类似问题,因此看看管理员这边有何建议?
感觉vn.py的安装很折磨人啊,从掘金过来的,主要看中vn.py的社区活跃度和tick级别回测功能,同时今后还可以用掘金的仿真交易接口。
平台的功能性、扩展性都很好,就是安装超级费事啊。
我没有选择一键安装,原因是本来有其它项目,而且用anaconda配置环境的。
win7、3.88下执行手动安装基本没有太大问题:
只是当中提示有warning,主要是依赖库变动后,Spyder不能用了。问题不大!
但在手动启动run.py时出现如下错误:
我们在社区中初步搜索,发现可能是c++库没有安装的问题。于是更新安装:
但是,重启后执行run.py,问题依旧:
不知道这是否与我使用的win7系统有关?
准备装系统了!
不过还是在社区发帖求助一下。