9. 启动QTEASY

启动qteasy的配置信息:

qteasy.run(operator, **kwargs)[source]

`qteasy`模块的主要入口函数

接受`operator`执行器对象作为主要的运行组件,根据输入的运行模式确定运行的方式和结果 根据QT_CONFIG配置变量中的设置和运行模式(mode)进行不同的操作:

mode == 0, live trade mode, 实盘交易模式:

一旦启动此模式,就会在terminal中启动一个单独的线程在后台运行,运行的时机也是跟真实的股票市场一致的,股票市场收市的时 候不运行,交易日早上9点15分唤醒系统开始拉取实时股价,9点半开始运行交易策略,交易策略的运行时机和运行频率在策略的属性中 设置。如果策略运行的结果产生交易信号,则根据交易信号模拟挂单,挂单成交后修改响应账户资金和股票持仓,交易费用按照设置中 的费率扣除。如果资金不足或持仓不足会导致交易失败,当天买入的股票同真实市场一样T+1交割,第二个交易日开始前交割完毕。

`Qteasy`的实盘运行有一个“账户”的概念,就跟您在股票交易市场开户一样,一个账户可以有自己的持有资金,股票持仓,单独 计算盈亏。运行过程中您可以随时终止程序,这时所有的交易记录都会保存下来,下次重新启动时,只要引用上一次运行使用的 账户ID(account ID)就可以从上次中断的地方继续运行了,因此启动时需要指定账户,如果不想继续上次的账户,可以新开一个账户运行。

mode == 1, backtest mode, 回测模式,根据历史数据生成交易信号,执行交易:

根据Config规定的回测区间,使用History模块联机读取或从本地读取覆盖整个回测区间的历史数据 生成投资资金模型,模拟在回测区间内使用投资资金模型进行模拟交易的结果 输出对结果的评价(使用多维度的评价方法) 输出回测日志· 投资资金模型不能为空,策略参数不能为空

根据执行器历史数据hist_op,应用operator执行器对象中定义的投资策略生成一张投资产品头寸及仓位建议表。 这张表的每一行内的数据代表在这个历史时点上,投资策略建议对每一个投资产品应该持有的仓位。每一个历史时点的数据都是根据这个历史时点的 相对历史数据计算出来的。这张投资仓位建议表的历史区间受Config上下文对象的 »loop_period_start, loop_period_end, loop_period_freq » 等参数确定。 同时,这张投资仓位建议表是由operator执行器对象在hist_op策略生成历史数据上生成的。hist_op历史数据包含所有用于生成策略运行结果的信息 包括足够的数据密度、足够的前置历史区间以及足够的历史数据类型(如不同价格种类、不同财报指标种类等) operator执行器对象接受输入的hist_op数据后,在数据集合上反复循环运行,从历史数据中逐一提取出一个个历史片段,根据这个片段生成一个投资组合 建议,然后把所有生成的投资组合建议组合起来形成完整的投资组合建议表。

投资组合建议表生成后,系统在整个投资组合建议区间上比较前后两个历史时点上的建议持仓份额,当发生建议持仓份额变动时,根据投资产品的类型 生成投资交易信号,包括交易方向、交易产品和交易量。形成历史交易信号表。

历史交易信号表生成后,系统在相应的历史区间中创建hist_loop回测历史数据表,回测历史数据表包含对回测操作来说必要的历史数据如股价等,然后 在hist_loop的历史数据区间上对每一个投资交易信号进行模拟交易,并且逐个生成每个交易品种的实际成交量、成交价格、交易费用(通过Rate类估算) 以及交易前后的持有资产数量和持有现金数量的变化,以及总资产的变化。形成一张交易结果清单。交易模拟过程中的现金投入过程通过CashPlan对象来 模拟。

因为交易结果清单是根据有交易信号的历史交易日上计算的,因此并不完整。根据完整的历史数据,系统可以将数据补充完整并得到整个历史区间的 每日甚至更高频率的投资持仓及总资产变化表。完成这张表后,系统将在这张总资产变化表上执行完整的回测结果分析,分析的内容包括:

1,total_investment 总投资 2,total_final_value 投资期末总资产 3,loop_length 投资模拟区间长度 4,total_earning 总盈亏 5,total_transaction_cost 总交易成本 6,total_open 总开仓次数 7,total_close 总平仓次数 8,total_return_rate 总收益率 9,annual_return_rate 总年化收益率 10,reference_return 基准产品总收益 11,reference_return_rate 基准产品总收益率 12,reference_annual_return_rate 基准产品年化收益率 13,max_retreat 投资期最大回测率 14,Karma_rate 卡玛比率 15,Sharp_rate 夏普率 16,win_rate 胜率

上述所有评价结果和历史区间数据能够以可视化的方式输出到图表中。同时回测的结果数据和回测区间的每一次模拟交易记录也可以被记录到log对象中 保存在磁盘上供未来调用

mode == 2, optimization mode, 优化模式,使用一段历史数据区间内的数据来寻找最优的策略参数组合,然后在另一段历史数据区间内进行回测,评价:

策略优化模式: 根据Config规定的优化区间和回测区间,使用History模块联机读取或本地读取覆盖整个区间的历史数据 生成待优化策略的参数空间,并生成投资资金模型 使用指定的优化方法在优化区间内查找投资资金模型的全局最优或局部最优参数组合集合 使用在优化区间内搜索到的全局最优策略参数在回测区间上进行多次回测并再次记录结果 输出最优参数集合在优化区间和回测区间上的评价结果 输出优化及回测日志 投资资金模型不能为空,策略参数可以为空

优化模式的目的是寻找能让策略的运行效果最佳的参数或参数组合。 寻找能使策略的运行效果最佳的参数组合并不是一件容易的事,因为我们通常认为运行效果最佳的策略是能在 »未来 »实现最大收益的策略。但是,鉴于 实际上要去预测未来是不可能的,因此我们能采取的优化方法几乎都是以历史数据——也就是过去的经验——为基础的,并且期望通过过去的历史经验 达到某种程度上 »预测未来 »的效果。

策略优化模式或策略优化器的工作方法就基于这个思想,如果某个或某组参数使得某个策略的在过去足够长或者足够有代表性的历史区间内表现良好, 那么很有可能它也能在有限的未来不大会表现太差。因此策略优化模式的着眼点完全在于历史数据——所有的操作都是通过解读历史数据,或者策略在历史数据 上的表现来评判一个策略的优劣的,至于如何找到对策略的未来表现有更大联系的历史数据或表现形式,则是策略设计者的责任。策略优化器仅仅 确保找出的参数组合在过去有很好的表现,而对于未来无能为力。

优化器的工作基础在于历史数据。它的工作方法从根本上来讲,是通过检验不同的参数在同一组历史区间上的表现来评判参数的优劣的。优化器的 工作方法可以大体上分为以下两类:

1,无监督方法类:这一类方法不需要事先知道 »最优 »或先验信息,从未知开始搜寻最佳参数。这类方法需要大量生成不同的参数组合,并且 在同一个历史区间上反复回测,通过比较回测的结果而找到最优或较优的参数。这一类优化方法的假设是,如果这一组参数在过去取得了良好的 投资结果,那么很可能在未来也不会太差。 这一类方法包括:

1,Grid_searching 网格搜索法:

网格法是最简单和直接的参数优化方法,在已经定义好的参数空间中,按照一定的间隔均匀地从向量空间中取出一系列的点, 逐个在优化空间中生成交易信号并进行回测,把所有的参数组合都测试完毕后,根据目标函数的值选择排名靠前的参数组合即可。

网格法能确保找到参数空间中的全剧最优参数,不过必须逐一测试所有可能的参数点,因此计算量相当大。同时,网格法只 适用于非连续的参数空间,对于连续空间,仍然可以使用网格法,但无法真正 »穷尽 »所有的参数组合

关于网格法的具体参数和输出,参见self._search_grid()函数的docstring

2,Montecarlo_searching 蒙特卡洛法

蒙特卡洛法与网格法类似,也需要检查并测试参数空间中的大量参数组合。不过在蒙特卡洛法中,参数组合是从参数空间中随机 选出的,而且在参数空间中均匀分布。与网格法相比,蒙特卡洛方法不仅更适合于连续参数空间、通常情况下也有更好的性能。

关于蒙特卡洛方法的参数和输出,参见self._search_montecarlo()函数的docstring

3,Incremental_step_searching 递进搜索法

递进步长法的基本思想是对参数空间进行多轮递进式的搜索,每一轮搜索方法与蒙特卡洛法相同但是每一轮搜索后都将搜索 范围缩小到更希望产生全局最优的子空间中,并在这个较小的子空间中继续使用蒙特卡洛法进行搜索,直到该子空间太小、 或搜索轮数大于设定值为止。

使用这种技术,在一个250*250*250的空间中,能够把搜索量从15,000,000降低到10,000左右,缩减到原来的1/1500, 却不太会影响最终搜索的效果。

关于递进步长法的参数和输出,参见self._search_incremental()函数的docstring

4,Genetic_Algorithm 遗传算法 (尚未实现)

遗传算法适用于 »超大 »参数空间的参数寻优。对于有二到三个参数的策略来说,使用蒙特卡洛或网格法是可以承受的选择, 如果参数数量增加到4到5个,递进步长法可以帮助降低计算量,然而如果参数有数百个,而且每一个都有无限取值范围的时 候,任何一种基于网格的方法都没有应用的意义了。如果目标函数在参数空间中是连续且可微的,可以使用基于梯度的方法, 但如果目标函数不可微分,GA方法提供了一个在可以承受的时间内找到全局最优或局部最优的方法。

GA方法受生物进化论的启发,通过模拟生物在自然选择下的基因进化过程,在复杂的超大参数空间中搜索全局最优或局部最 优参数。GA的基本做法是模拟一个足够大的 »生物 »种群在自然环境中的演化,这些生物的 »基因 »是参数空间中的一个点, 在演化过程中,种群中的每一个个体会发生变异、也会通过杂交来改变或保留自己的 »基因 »,并把变异或杂交后的基因传递到 下一代。在每一代的种群中,优化器会计算每一个个体的目标函数并根据目标函数的大小确定每一个个体的生存几率和生殖几 率。由于表现较差的基因生存和生殖几率较低,因此经过数万乃至数十万带的迭代后,种群中的优秀基因会保留并演化出更 加优秀的基因,最终可能演化出全局最优或至少局部最优的基因。

关于遗传算法的详细参数和输出,参见self._search_ga()函数的docstring

5, Gradient Descendent Algorithm 梯度下降算法 (尚未实现)

梯度下降算法

2,有监督方法类:这一类方法依赖于历史数据上的(有用的)先验信息:比如过去一个区间上的已知交易信号、或者价格变化信息。然后通过 优化方法寻找历史数据和有用的先验信息之间的联系(目标联系)。这一类优化方法的假设是,如果这些通过历史数据直接获取先验信息的 联系在未来仍然有效,那么我们就可能在未来同样根据这些联系,利用已知的数据推断出对我们有用的信息。 这一类方法包括:

1,ANN_based_methods 基于人工神经网络的有监督方法(尚未实现) 2,SVM 支持向量机类方法(尚未实现) 3,KNN 基于KNN的方法(尚未实现)

为了实现上面的方法,优化器需要两组历史数据,分别对应两个不同的历史区间,一个是优化区间,另一个是回测区间。在优化的第一阶段,优化器 在优化区间上生成交易信号,或建立目标联系,并且在优化区间上找到一个或若干个表现最优的参数组合或目标联系,接下来,在优化的第二阶段, 优化器在回测区间上对寻找到的最优参数组合或目标联系进行测试,在回测区间生成对所有中选参数的“独立”表现评价。通常,可以选择优化区间较 长且较早,而回测区间较晚而较短,这样可以模拟根据过去的信息建立的策略在未来的表现。

优化器的优化过程首先开始于一个明确定义的参数 »空间 »。参数空间在系统中定义为一个Space对象。如果把策略的参数用向量表示,空间就是所有可能 的参数组合形成的向量空间。对于无监督类方法来说,参数空间容纳的向量就是交易信号本身或参数本身。而对于有监督算法,参数空间是将历史数据 映射到先验数据的一个特定映射函数的参数空间,例如,在ANN方法中,参数空间就是神经网络所有神经元连接权值的可能取值空间。优化器的工作本质 就是在这个参数空间中寻找全局最优解或局部最优解。因此理论上所有的数值优化方法都可以用于优化器。

优化器的另一个重要方面是目标函数。根据目标函数,我们可以对优化参数空间中的每一个点计算出一个目标函数值,并根据这个函数值的大小来评判 参数的优劣。因此,目标函数的输出应该是一个实数。对于无监督方法,目标函数与参数策略的回测结果息息相关,最直接的目标函数就是投资终值, 当初始投资额相同的时候,我们可以简单地认为终值越高,则参数的表现越好。但目标函数可不仅仅是终值一项,年化收益率或收益率、夏普率等等 常见的评价指标都可以用来做目标函数,甚至目标函数可以用复合指标,如综合考虑收益率、交易成本、最大回撤等指标的一个复合指标,只要目标函数 的输出是一个实数,就能被用作目标函数。而对于有监督方法,目标函数表征的是从历史数据到先验信息的映射能力,通常用实际输出与先验信息之间 的差值的函数来表示。在机器学习和数值优化领域,有多种函数可选,例如MSE函数,CrossEntropy等等。

Config.mode == 3 or mode == 3:

进入评价模式(技术冻结后暂停开发此功能) 评价模式的思想是使用随机生成的模拟历史数据对策略进行评价。由于可以使用大量随机历史数据序列进行评价,因此可以得到策略的统计学 表现

Paramètres:
  • operator (Operator) – 策略执行器对象

  • **kwargs – 可用的kwargs包括所有合法的qteasy配置参数,参见qteasy文档

Renvoie:

  • 1, 在live_trade模式或模式0下,进入实盘交易Shell

  • 2, 在back_test模式或模式1下, 返回 (loop_result)

  • 3, 在optimization模式或模式2下 (返回一个list,包含所有优化后的策略参数)

qteasy.info(**kwargs)[source]

qteasy 模块的帮助信息入口函数

Paramètres:

kwargs