做策略的时候,想在Strategy内部获得,总资金、滑点、和pricetick的信息,这样方便更精确的控制下单函数
发现在github上的样例代码中,这些参数全部传给了一个BactestingEngine类, 观察了一下该类的add_strategy函数
发现该函数初始化了一个strategy类, 但是第一个参数是self,也就是BacktestingEngine类自己, 但是在strategyTemplate类模板的构造函数中,要求第一个参数的类型是StrategyEngine类。 这两个Engine没有继承关系,为什么可以用BacktestingEngine类作为参数去初始化一个Strategy呢?
情况是这样的:
当我使用了移仓助手进行了换月的操作,我的策略现在开始订阅新的合约了,那么我自然希望把老的合约数据乘上一个赋权系数继续转移到新策略中,我并不想像策略初始化时那样,先要传入历史数据那样麻烦。
我该如何完成这件事呢?
AlexYang wrote:
我已经实现了回测换月、实盘no_ui模式自动换月,欢迎交流:微信849322520
回测中换月:
需要在数据库中存储各个月份合约的数据,还有换月的信息,以便代码判断
更改BacktestingEngine的run_backtesting函数,每个交易日开始或结束时判断一下是否换月,若换月则更改策略合约并且重新初始化
实盘中换月:
1、移植策略持仓、策略名称、策略设置信息strategy_setting、策略变量信息strategy_data;2、变更合约策略映射self.symbol_strategy_map,当tick行情推送的时候,通过这个映射来将合约tick行情推送给指定的策略实例;3、删除strategy_orderid_map和orderid_strategy_map中旧合约的挂单,这些用于保存策略的挂单信息;4、订阅新合约;5、策略初始化和启动策略
那在旧合约上的仓位怎么办呢?手动去换到新合约上吗?
我有两个问题:
加入我有一个日级别的策略,我的持仓计划是:
我希望的策略操作是,收盘前20分钟计算出这些手数,并在收盘前20分钟,以市价单进行快速的买入并且执行。核心是:在收盘时完成这些操作,要让这些订单过夜。
但实际在回测中,由于我使用的是日级别的数据,我发现在portfolio_backtesting模块,我的实际持仓是:
在vnpy回测中,在计算出因子之后,不会在当天换仓,而是会将需要换仓的订单保存在一个self.active_limit_orders的变量中,并且在下一个bar到来之后,用corss_limit_order计算是否能成交,如果能成交,则形成trade。
也就是说,我希望的,上一天应该交易的trade——在回测中实际上是下一天交易的!由于交易的时间点不一样,有的订单会从能成交变成不能成交。不过有一点欣慰的地方在于,如果能成交的话,实际上产生的收益还是我想象中一样的。
我应该如何修改vnpy的回测方式,才能让它想我想象中那样回测呢?我是不是不该用日数据回测呢?谢谢各位了!
因为vnpy提供了 多合约组合策略的 批量化处理功能,可以一键启动多个多合约策略。
但是策略一多,就难免出现,A策略在做多螺纹钢,B策略在做空螺纹钢的情况。
为了节省手续费,我希望能够在内部完成一些“撮合”,避免重复的下单。我知道在vnpy内部 单策略模块中其实是有订单撮合的功能的,将方向相反的订单进行撮合;我想问的是,对于多个多合约策略的情况,是否也有这样的功能呢?
由于我个人的需求,我按照自己的需求修改了vnpy的源代码。
但是,众所周知,vnpy是会不断更新版本的。因此,我每次在更新版本时,就必须重新修改一次代码,非常痛苦。由于我修改的代码涉及到许多不同的文件,即使我都已经记录了修改的流程,每次修改起来还是很困难。由于我并不是CS出身,所以我想问一下,有没有什么代码管理的方法,能够让版本更新后,修改的代码尽可能的少呢?
说明一下:因为我的数据就是小时级别的数据,而不是由tick或者分钟 合成 为小时的,所以我的数据并不能捕捉到下一分钟的价格。
问题
(1)在portfolio的回测中,发出去的订单 成交与否 的逻辑是在哪部分代码中呢?
(2)虽然没有找到对应的代码,但根据我的观察,发出的订单是否成交,似乎和订单的价格以及下一个bar的价格有关。可我使用的是小时级别的数据,下一个小时的价格大幅上升或者下降,并不意味着上一个小时发出的订单就不能成交。实盘中,这个订单是否能成交主要由后几秒、后几分钟的价格决定。因此,在小时级别的回测中,我想设置为发出去的订单默认成交,我该如何修改代码呢?
我本人也是那个假的VNPY的受害者。
一开始百度VNPY,点进去就是那个假的VNPY,那个界面一进去全是广告,令我非常疑惑。
直到后来,我研究了3天那个假代码,越研究越不对劲的时候,才发现我被骗了。
王登高用心险恶,举报的内容全部都是恶毒的;所以我也想要支持一下陈晓优。
又看了一遍BarGenerator 和PortfolioBarGenerator的实现代码, 好像这两个类说白了也就是一个单品种 和 一个多品种的区别?
看了下系统自带的四个portofolio策略,分别是:
$_arbitrage_strategy.py
portfolio_boll_channel_strategy.py
pair_trading_strategy.py
trend_following_strategy.py
发现他们在保存K线时,有的使用了一个字典(键名为品种,值为BarGenerator类), 有的直接使用了PortfolioBarGenerator类。这个K线被保存在bgs或者pbg的成员变量中。
在社区的使用文档中,也说明了,当需要进行K线合成时,应该使用PortfolioBarGenerator类,
可是在trend_following_strategy中,没有进行K线合成,也使用了PortfolioBarGenerator类。
所以我想问一下,使用一个BarGenerator的字典 和 使用PortfolioBarGenerator 有什么差别呢?
我有一个策略,它不会给出每天需要买多少手期货,它只会给出每天需要把30%的钱分配到品种A,把40%的钱分配到品种B, 把30%的钱分配给品种C。
因此,为了计算下单时的volume,我必须首先获得当前时刻我有多少资金。然而,资金的初始值capital是传给BackTestingEngine而不是StrategyEngine的。
所以:
我使用了vnpy的github仓库里, example文件夹中的示例文件 backtesting_demo.ipynb来进行多品种策略的回测。
但是我很快就在数据导入中遇到了一个问题:
可以看到,我的焦煤历史数据的数据量是0。然而,在dataManager页面中,已经显示我成功的上传了jm的数据:
我猜测,也许加载数据的函数并没有按我所想像那样,加载了我上传的数据。所以我观察了一下代码:
发现控制加载数据的是 BacktestingEngine类里的load_data方法,其中核心函数是load_bar_data函数,load_bar_data函数的代码如下
其中database是由database = get_database() 这一行所指定的。
但是get_database函数是没有输入的, database完全由SETTINGS这个常量控制,而SETTINGS由一个json文件控制。因此,我要如何修改代码,才能让database指向我上传的那个数据库呢?
为什么不直接:
self.bar.high_price = max(self.bar_high_price, tick.high_price)
为什么一开始要把tick.last_price放进来计算呢?last_price不能代表这500ms内的最大值呀。
以及,如果我有一份15min间隔的数据,为了对这份数据进行导入和回测,我人为的在INTERVAL枚举类型中,增加了另一个类别 min_15, 那么接下来我还需要修改哪些部分的代码才能够让这份15min数据的回测跑通呢?
我的数据的时间格式有点不一样,每天有三个数据点,分别是早上的收盘,下午的收盘和夜盘的收盘,因此时间与时间之间的间隔不均匀。
在导入数据的时候,我的interval该写什么呢, HOUR吗?还是说,我应该在class INTERVAL 这个枚举类型里面增加一个分类?
本想去上期技术官网查询CTP的文档获得信息的,但是上期技术的网站 www.sfit.com.cn 也无法连接的上。
是必须使用IE浏览器吗?
由于simnow官网无法连接,也无法注册账号,因此按照论坛中的FAQ找中信期货申请了模拟账号
但是,使用模拟账号时,连接CTP的信息该如何填写呢?
特别是产品名称和授权编码,应该不是写“simnow_client_test”吧,那应该填什么呢?