历史文档

可视化研究环境

由xiaoshao创建,最终由xiaoshao 被浏览 674 用户

BigStudio 简介

新功能的认识是循序渐进的,该部分简单介绍BigStudio,让大家对其有初步印象。

BigQuant新上线的 BigStudio 可视化策略开发功能,能够帮助大家更快速更简单地开发机器学习、深度学习试验,快速实现试验迭代。

BigStudio 提供了所见即所得的策略开发环境,集合了众多模块,包括数据输入、输出、数据变换、模型训练、预测和量化交易等。你只需要拖动数据和模块,连连线,配置参数,就可以开发AI策略,从而将更多的创造力放在自己擅长的地方。因为提供的是可视化研究界面,因此通过BigStudio开发的AI策略被称为可视化AI策略。

{w:100}{w:100}今天,我们先简单介绍BigStudio,让大家对其有一个初步印象,后面将对其进行深入细致讲解。

1. 新建一个可视化AI策略

新建 > 可视化AI策略

{w:100}{w:100}

2. 认识BigStudio主要功能区

{w:100}

从左至右主要分为四个区域,依次为:策略列表区,BigStudio模块区,BigStudio画布区,模块参数和帮助区。

图中我们用绿色矩形框标记了四处位置,点击这四处位置都可以折叠其对应的区域,折叠以后再次点击可进行恢复。下图展示了折叠四处区域后的界面:

{w:100}{w:100}

3. 可视化界面存在于代码单元(cell)中

可视化界面的图形只是内嵌到一个代码单元(cell)中,你可以正常使用右上角的功能。

{w:100}{w:100}

在右上角,分别有六个按钮,其功能分别是可视化/代码界面切换、在上方添加一个代码单元、在下方添加一个代码单元、上移代码单元、下移代码单元、运行代码单元。

4.从可视化界面切换到Python代码界面

 可视化  > 代码/Python3 

{w:100}{w:100}

切换后,界面如下:

{w:100}{w:100}

点击右上角的 代码/Python3 可回到之前的可视化界面。

5. 使用搜索功能

在可视化界面中,一共有两个放大镜,如下图所示:

{w:100}{w:100}

左侧的放大镜用来搜索 数据和模块,右侧的放大镜可在画布中搜索 模块

画布与模块

有了对BigStudio的初步直观印象后,今天我们再来认识画布、模块及简单运用。

1.新建一个空白可视化策略

新建 > 可视化策略-空白策略

{w:100}{w:100}

建立完成的时候,界面如下:

{w:100}{w:100}

2. 认识画布

{w:100}{w:100}

上图为一个完整的机器学习AI可视化策略,右边部分为画布,画布中的模块和数据都是来自左侧。 左侧部分为模块和数据列表,可直接拖放至画布。

画布的左下方为画布的一些功能键,截图如下:

{w:100}{w:100}

从左至右分别为:展示/隐藏导航图、画布缩小、画布放大、缩放到实际尺寸、自适应窗口、启用拖动模式,每个功能都有对应的快捷键,建议大家亲自体验一下,印象更加深刻。

3. 认识模块

画布中的主要构成就是模块,模块其实并不难理解,你可以将其理解为函数,就是为了实现某些功能。模块的示意图如下:

{w:100}{w:100} 整个流程是$x$作为输入,进入函数$f$,然后得到输出结果$f(x)$,这就是我们日常理解的函数。在BigStudio中,模块的概念和函数一样,拥有输入(可以多个输入)和输出。因此在画布中,每一个拥有输入连接线和输出连接线的矩形框都可以看成模块,仅有输出连接线的矩形框可以看成数据。

画布是实验的工作场所。实验由数据集组成,数据集将数据提供给分析模块,将这些模块连接起来即可构成预测分析模型。 具体而言,有效的实验有以下特征:

  • 试验至少包含一个数据集和一个模块
  • 数据集只能连接到模块
  • 模块可以连接到数据集或其他模块
  • 模块的所有输入端口必须与数据流建立某种连接
  • 必须设置每个模块的所有必需参数

点击画布左下方的最右边的菱形按钮,可以进入拖动模式,这样我们就能自由拖动模块,按自己喜欢的风格布局画布,再次点击该按钮退出拖动模式。

4. 模块的基本操作

  • 模块信息

模块信息包含模块中文名称和模块英文名称,比如:

{w:100}{w:100}

图中一共四个模块,每个模块前面的中文为模块中文名称,后面的以 $m$开头的英文为模块英文名称。这里之所以介绍模块英文名称,因为在代码界面,可以根据模块的英文名称快速找到该模块对应的Python代码。

  • 查看介绍

将鼠标移动至模块之上,就可以查看该模块的介绍,例如,我们将鼠标移动至 证券代码列表 m15 这个模块之上,你将会看到该模块的介绍:

{w:100}{w:100}

  • 选择模块

直接选择模块即可有(鼠标左击),选中后,该模块四周的边框会变为红色。例如,我们选中 m1 证券代码列表模块。(如果鼠标在画布中是四个箭头的标识,那么无法选择模块,因为此时处于画布拖动模式,需要退出该模式)。

{w:100}{w:100}

  • 模块方法

模块作为画布的基本单元,拥有多种操作方法。 当我们鼠标右击某模块,如下:

{w:100}{w:100}

可以看出,在画布中,我们可以对该模块进行删除、复制、剪切、粘贴、直接运行、查看结果、查看帮助等,这些方法很好理解。

  • 注释模块

模块以一个个矩形框的形式存在于画布中,我们可以对其进行注释。将鼠标移动到一个模块上双击就会出现文本输入框,如下:

{w:100}{w:100}

假设我们输入文字“这是一句注释”,并确定。结果如下:

{w:100}{w:100}

可以看出,我们对模块 m1 证券代码列表进行了注释。

5. 新建模块

  • 拖动 证券代码列表进画布

{w:100}{w:100}

  • 拖动 自动数据标注 进画布

{w:100}{w:100}

  • 连线和输入参数

这样,在我们的画布中,一共有两个模块。但是,此时两个模块是相互孤立没有联系的。

细心的朋友可能会发现,m2模块的旁边有一个小红点,将鼠标移动到上面可以看到“未连接”警告。这是在提醒我们,m2模块缺少输入,不能正常运行。

因为m1 证券代码列表v2m2 自动标注(任意数据源)v1的输入,因此我们需要将第一个模块手动连线到第二个模块。此时小红点会消失。

每一个模块是一个矩形框,矩形框上边界和下边界有一个空心小圆圈,这个小圆圈称为节点,模块的连接是通过连线到这样的节点完成的,其中上边界的小圆圈连接的是输入,下边界的小圆圈连接的是输出。(注:矩形框上边界也可能是实心小圆圈,实心小圆圈表明该输入是可选输入,空心小圆圈表明该输入是必选输入)。

{w:100}{w:100}

在属性界面,在弹出的代码编辑器窗口手动编辑标注表达式。

  • 查看Python代码

点击右上方,可视化,切换到代码/Python3界面。

{w:100}{w:100}

代码如下:

{w:100}{w:100}

代码界面,我们可以浏览画布中的模块的背后的代码,但是这里这里浏览(可读模式),并不能修改。

6. 可视化界面和代码研究界面相结合

  • 运行可视化界面模块代码

    拖选两个模块 > 右键 > 运行选中模块
    

{w:100}{w:100}

拖选以后,选中的模块会变为蓝色。你也可以点击画布右上方的运行按钮来运行模块。

  • 在可视化界面下添加代码单元(cell)

{w:100}{w:100}

  • 查看m2模块的输出数据

m2模块的输入是m1,那输出是什么呢?我们可以直接在代码单元运行代码进行查看,模块运行的日志也会输出,让我们对模块运行清楚把控。

{w:100}{w:100}

工作流

相信已经对BigStudio有一定的了解,现在我们聊聊BigStudio上默认可视化AI实验的工作流。

什么是工作流?

简而言之就是实验在BigStudio上的工作流程。BigStudio是一个开发AI量化交易策略的平台,因此了解实验在BigStudio上的的工作流,能够帮助大家从整体宏观上理解AI量化策略。

什么是AI量化交易策略?

人工智能(AI)技术得到了飞速发展,其在各个领域的运用也不断取得成果。机器学习被评为人工智能中最能体现人类智慧的技术,因此AI量化交易策略可以简单理解为将机器学习应用在量化投资领域。

机器学习流程

机器学习(Machine Learning, ML)可以认为是:通过数据、算法使得机器从大量历史数据中学习规律,从而对新样本做分类或者预测。它是人工智能(Artificial Intelligence, AI)的核心,,其应用遍及人工智能的各个领域,主要使用归纳、综合的方法获取或总结知识。更多内容请参看:什么是机器学习?

{w:100}{w:100}

AI量化策略流程

AI量化策略本质上符合机器学习流程示意图,最为重要的两个模块即为训练和预测。训练是使用训练集数据拟合出一个模型,预测是使用该模型在评估集数据,获取预测结果。想要更多地了解AI量化策略,可以点击AI量化策略的初步理解BigQuant AI策略详解

{w:100}{w:100}

BigStudio实验工作流

认识了机器学习流程和AI量化策略流程,能够对BigStudio实验工作流能更好地理解,BigStudio实验是AI量化策略在BigStudio上的可视化展示。如下:

{w:100}{w:100}

在画布上,AI量化策略是由数据+模块共同组建形成的。乍一看去,实验工作流比较复杂,这里将其进行拆解和说明。

{w:100}{w:100}

从上图可以看出,BigStudio实验主要包括数据标注、特征抽取、模型训练、模型预测、回测交易这几块,我们再结合前边介绍的AI量化策略流程,就可以很清楚地了解BigStudio上可视化实验的工作流,这有助于帮助大家更好更快地开发AI量化策略,实现实验的快速迭代。

知道了BigStudio实验的工作流,我们在下一篇文章会详细介绍每个小模块的具体使用。

模块的功能和使用

本部分详细介绍BigStudio可视化实验中各个模块,希望大家对每个模块的功能和使用更加了解。

BigStudio可视化实验工作流如下:

{w:100}{w:100}

从这幅图可以看出,BigStudio上的可视化AI量化策略主要包括数据标注、特征抽取、模型训练、模型预测、回测交易5个部分,但却包含了多个小模块。本文从微观层面单独介绍各个小模块。

(由于本文篇幅较长,为增强阅读体验,部分内容需手动点击才能展开,带黑色实心三角符号的内容可直接点击展开查阅。例如 属性窗格。)

[details=属性窗格] 我们从微观层面具体了解每一个模块。在单独介绍每个模块之前,先来介绍属性窗格的常用按钮。以 模块证券代码列表 举例:

{w:100}{w:100}

其中图上一共有5个绿色标记。按从上到下的顺序,第一个点击可以折叠整个属性窗格,第二个可以折叠该模块的属性;第三个是下拉选项,点击可以展开下来列表进行选择;第四个是复选框,表明是否启用缓存加速, 如果开启,每次运行的时候会先检查之前是否有运行结果,如果有,就直接输出上次运行结果。最下面一个点击可以折叠帮助界面。点击帮助可以获得相关模块的文档介绍。

画布中的各个模块:

由于特征抽取部分包括训练数据的特征抽取和评估数据的特征抽取,本文只介绍训练数据的特征抽取。评估数据的特征抽取同理,只是数据不一样(数据由start_date和end_date决定)。

帮助文档: 证券代码列表 {w:100}{w:100}

  • 开始日期:start_date (str) 。示例 2017-02-12。
  • 结束日期:end_date (str) 。示例 2017-02-12。
  • 交易市场:market(str)。获取哪个市场的证券列表,下拉列表有多个选择
  • 最大数量:max_count(float)。获取证券数量,如果设置为0就表明没有限制。 帮助文档: 自动数据标注 {w:100}{w:100}
  • 开始日期:start_date (str) 。示例 2017-02-12。
  • 结束日期:start_date (str) 。示例 2017-02-12。
  • 标注表达式:这里是一个代码编辑器,点击可放大,也可以点击弹出代码编辑器窗口,可手动输入标注表达式。 帮助文档: 输入特征列表 {w:100}{w:100}
  • 特征数据 :为一个代码编辑器窗口,可手动输入特征数据

帮助文档: 基础特征抽取 {w:100}{w:100}

  • 开始日期:start_date (str)。示例 2017-02-12。
  • 结束日期:end_date (str) 。示例 2017-02-12。 帮助文档:衍生特征列表 {w:100}{w:100}
  • 日期列名:date_col (str) 。如果在表达式中用到切面相关函数时,比如 rank,会用到此列名;默认值是date。
  • 证券代码列名:instrument_col (str) 。如果在表达式中用到时间序列相关函数时,比如 shift,会用到此列名;默认值是instrument。 帮助文档: 连接数据 {w:100}{w:100}
  • 关联列:on (str) 。多个列用英文逗号分隔;默认值是date,instrument。
  • 连接方式:how (choice) 。可选值有: left, right, outer, inner;默认值是inner。
  • 对结果排序:sort (bool) 。默认值是False。

{w:100}{w:100} 除了是否启用缓存加速,缺失数据处理模块没有其他参数。

帮助文档:StockRanker训练 {w:100}{w:100}

  • 学习算法:learning_algorithm (choice) 。机器学习优化算法;可选值有: 排序, 回归, 二分类, logloss;默认值是排序。
  • 叶节点数量:number_of_leaves (int) 。每棵树最大叶节点数量。一般情况下,叶子节点越多,则模型越复杂,表达能力越强,过拟合的可能性也越高;默认值是30。
  • 每叶节点最小样本数:minimum_docs_per_leaf (int) 。每个叶节点最少需要的样本数量,一般值越大,泛化性性越好;默认值是1000。
  • 树的数量:number_of_trees (int) 。一般情况下,树越多,则模型越复杂,表达能力越强,过拟合的可能性也越高;默认值是20。
  • 学习率:learning_rate (float) – 学习率:学习率如果太大,可能会使结果越过最优值,如果太小学习会很慢;默认值是0.1。
  • 特征值离散化数量:max_bins (int) 。一般情况下,max_bins越大,则学的越细,过拟合的可能性也越高;默认值是1023。
  • 特征使用率:feature_fraction (int)。在构建每一颗树时,每个特征被使用的概率,如果为1,则每棵树都会使用所有特征;默认值是1。

帮助文档:StockRanker预测 {w:100}{w:100} 帮助文档:Trade(回测/模拟) {w:100}{w:100}

  • 开始日期:start_date (str)。设定值只在回测模式有效,在模拟实盘模式下为当前日期
  • 结束日期:end_date (str)。设定值只在回测模式有效,在模拟实盘模式下为当前日期
  • 主函数:handle_data (函数)。必须实现的函数,该函数每个单位时间会调用一次, 如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次,由于我们现在数据只有日K,所以是按天回调。在回测中,可以通过对象data获取单只股票或多只股票的时间窗口价格数据。如果算法中没有schedule_function函数,那么该函数为必选函数。一般策略的交易逻辑和订单生成体现在该函数中;默认值是None。
  • 数据准备函数:prepare (函数) 。准备数据函数,运行过程中只调用一次,在 initialize 前调用,准备交易中需要用到数据。目前支持设置交易中用到的股票列表,设置到 context.instruments。

{w:100}{w:100}

  • 初始化函数:initialize (函数) 。整个回测中只在最开始时调用一次,用于初始化一些账户状态信息和策略基本参数,context也可以理解为一个全局变量,在回测中存放当前账户信息和策略基本参数便于会话;默认值是None。
  • 盘前处理函数:before_trading_start (函数) 。每个单位时间开始前调用一次,即每日开盘前调用一次,该函数是可选函数。你的算法可以在该函数中进行一些数据处理计算,比如确定当天有交易信号的股票池;
  • 成交率限制:volume_limit (float)。执行下单时控制成交量参数,默认值2.5%,若设置为0时,不进行成交量检查;默认值是0.025。

{w:100}{w:100}

  • 买入点:order_price_field_buy (choice) 。open=开盘买入,close=收盘买入;可选值有: open, close;默认值是open。

  • 卖出点:order_price_field_sell (choice) 。open=开盘卖出,close=收盘卖出;可选值有: open, close;默认值是close。

  • 初始资金:capital_base (float) 。默认值是1000000.0。

  • 基准指数:benchmark (str)。不影响回测结果;默认值是000300.SHA。

  • 自动取消无法成交的订单:auto_cancel_non_tradable_orders (bool) 。是否自动取消因为停牌等原因不能成交的订单;默认值是True。

  • 回测数据频率:data_frequency (choice)。目前只支持日线 (daily),未来将支持分钟线 (minute);可选值有: daily;默认值是daily。

  • 显示回测结果图表:plot_charts (bool) – 显示回测结果图表;默认值是True。

  • 只在回测模式下运行:backtest_only (bool) 。默认情况下,Trade会在回测和实盘模拟模式下都运行。如果策略中有多个M.trade,在实盘模拟模式下,只能有一个设置为运行,其他的需要设置为 backtest_only=True,否则将会有未定义的行为错误;默认值是False。

    现在,BigStudio上的AI量化策略的模块已经介绍完毕。当我们新建一个可视化AI量化策略的时候,我们不用做太多的改动,直接使用模板,然后调一下参数,将精力更多地放在特征抽取和数据标注上。接下来,我们会介绍如何自定义模块和使用更灵活地特征抽取和数据标注。

自定义模块

现在我们介绍最重要的一个模块:自定义模块,之所以说最重要,是因为策略实验开发需求多样,掌握了如何自定义模块才能在策略实验开发中更加自由灵活。

什么是模块?

模块可以将其理解为函数,目的是实现某些功能。模块的示意图如下:

{w:100}{w:100}

整个流程是$x$作为输入,进入函数$f$,然后得到输出结果$f(x)$,这就是我们日常理解的函数。在BigStudio中,模块的概念和函数一样,拥有输入(可以多个输入)和输出(也可以多个输出)。因此在画布中,每一个拥有输入连接线和输出连接线的矩形框都可以看成模块,仅有输出连接线的矩形框可以看成数据。

在示意图上,只有一个输入,一个输出,但BigStudio上的模块可以最多支持三个输入,三个输出。示意图如下:

{w:100}{w:100}

如何自定义模块?

我们以这样的例子举例:假设我们希望对一段时间的股票数据进行过滤,去除st股票和上市天数小于120天的股票。我们一共构建了三个模块,第一个模块有三个输出,分别是时间、股票列表、数据字段,然后第二个模块根据三个输入通过D.history_data()接口加载数据,最后,第三个模块对数据进行过滤,去除st股和上市天数小于120天的股票。详细流程见下文。
  • 直接拖取 自定义Python模块到画布,连拖三次

{w:100}{w:100}

  • 选中第一个模块,点击右侧代码编辑器窗口,输入以下代码:

{w:100}{w:100}

  • 同理,选中第二个模块,点击右侧代码编辑器窗口,输入以下代码:

{w:100}{w:100}

  • 最后,选中第三个模块,点击右侧代码编辑器窗口,输入以下代码:

{w:100}{w:100}

  • 模块如下连线,并为每个模块添加注释

{w:100}{w:100}

  • 运行,并打印m3模块输出数据

{w:100}{w:100}

代码编辑器窗口

  • 什么是代码编辑器窗口?

代码编辑器窗口是BigStudio为特定模块需要输入代码进行编辑的一个窗口。

{w:100}{w:100}

这是模块m1的右侧的代码编辑器窗口,其中点击红色箭头所指的类似于两个矩形框堆叠的按钮可以 弹出该代码编辑器窗口

  • 支持代码补齐功能

代码编辑器窗口和策略研究界面的单元格一样,同样具备 代码补齐功能。比如输入 “fs_” 这样就能弹出财务相关的因子,而且能够知道各个因子的具体含义。

{w:100}{w:100}

今天就介绍到这里,希望大家能够自由灵活地使用自定义模块。

开发属于你的策略

本文简单介绍如何通过可视化的方式开发出一个价值选股策略。

标题也许看着有点蒙,什么意思呢?其实就是通过5条线连接的几个模块就能开发出一个简单的价值选股策略。我们先来看看策略截图。

{w:100}{w:100}


该策略一共包括:证券代码列表输入特征列表、基础特征抽取、数据过滤、Trade(回测/模拟)共5个模块。首先我们先介绍下策略的思想。

  • 开始日期:2013-01-01
  • 结束日期:2017-11-07
  • 选股依据:根据市净率指标全市场选股,选出该指标最小的10%的股票;
  • 调仓规则:买入持有22天(接近自然日30天),进行调仓,卖出全部股票,然后重新买入股票;
  • 资金分配:等权重买入

接下来,详细介绍策略开发的各个流程。

  • 新建一个可视化空白策略模板
  • 拖入证券代码列表模块,并在右侧参数窗口输入开始日期和结束日期

{w:100}{w:100}

  • 拖入输入特征列表模块,并在右侧代码编辑器窗口输入市净率排序因子

{w:100}{w:100}

  • 拖入基础特征抽取模块,并将证券代码列表和输入特征列表两个模块的连线到该模块

    补充:在连线时,应该注意对应的节点,不同的节点对应不同的模块输入。此外,基础特征抽取模块的右侧参数窗口可以不填,不填就会继承输入模块的相关参数。这里,就会继承证券代码列表模块的开始日期和结束日期。

{w:100}{w:100}

  • 拖入数据过滤模块,并设置过滤条件。因为我们是通过市净率选股,我们选择市净率最小的10%的股票 。

    补充:rank_pb_lf_0因子是横截面排序因子,其详细释义可以在文档-因子库查询,根据当日全市场股票市净率大小升序排序所得。通过数据过滤,我们将市盈率最小的10%的股票的过滤出来。

{w:100}{w:100}

  • 拖入交易模块——Trade(回测/模拟)

{w:100}{w:100}

  • 将策略思想添加在 主函数 {w:100}{w:100}
  • 点击运行或运行全部,得到回测结果 {w:100}{w:100}

可能有小伙伴比较纳闷,如果我关注中间某些模块的数据,怎样才能查看呢?BigQuant的策略研究平台为“可见即可得”的研究环境,中间模块的数据我们可以这样查询,以数据过滤模块为例:

  • 首先,选中该模块,右键运行该模块

    补充:运行该模块的话,就不会运行全部模块,这样方便调试策略。运行某模块的时候,系统会自动运行该模块的继承模块,即那些连线到该模块的模块也会运行。

\

  • 然后,该模块是m4,直接在画布上方或者下方新建一个单元格(cell),就可查看m4模块的输出数据

是不是觉得开发策略没有想象中的那么困难啊?欢迎大家克隆进行深入研究,本文只是一个简单的demo,还有许多尝试的方向。

自定义函数构建因子

我们先来回顾一下,当我们构建因子时,目前有几种方式。

这里以过去5日成交总额因子举例说明:

  1. 根据因子库默认因子构建

    $(avg\_amount\_5)*5$

  2. 运算符构建因子 $amount\_0+amount\_1+amount\_2+amount\_3+amount\_4$

  3. 表达式引擎构建因子 表达式引擎构建因子比较灵活,下列三种方式效果相同。 $sum(amount\_0,5)$ $amount\_0+shift(amount\_0,1)+shift(amount\_0,2)+shift(amount\_0,3)+shift(amount\_0,4)$ $amount\_0+delay(amount\_0,1)+delay(amount\_0,2)+delay(amount\_0,3)+delay(amount\_0,4)$

但是在策略开发过程中,有些因子比较难以构建,比如个股相对于上证50、或者中证800的超额收益率,这样的因子用刚刚提到的方式很难实现,因此今天又必要介绍如何通过自定义函数构建因子。本文以个股相对于中证800的超额收益率为例。

流程

  1. 拖入证券代码列表模块

{w:100}{w:100}

  1. 这里我们时间跨度为1年左右,为了减少运行时间,只输入了10只股票。

  2. 拖入 输入特征列表模块,并输入特征

    \

{w:100}{w:100}

  1. 拖入 基础特征抽取模块,并连线。

{w:100}{w:100}

基础特征抽取结果如下:

{w:100}{w:100}

  1. 拖入 输入特征列表模块,并输入个股相对中证800的超额收益率的特征名称

{w:100}{w:100}

  1. 拖入衍生特征抽取模块,计算出个股相对中证800的超额收益率的特征名称

{w:100}{w:100}

这里是全文最主要的地方,理解清楚就能非常自由灵活地构建因子。 这里详细讲解下:

bigquant_run = {
    'relative_ret':  relative_ret
}

代码解释: 在这里自定义表达式函数,为字典格式,例:{‘user_rank’:user_rank},字典的key是方法名称,字符串类型,字典的value是方法的引用,更多文档参考:衍生特征抽取

def relative_ret(df, close_0):
    return df.groupby('instrument', group_keys=False).apply(calcu_relative_ret)

代码解释: 计算特征需要先按股票代码进行groupby然后单独计算每只股票的特征数据。

def calcu_relative_ret(df):
    # 先获取中证800指数数据
    start_date = min(m7.data.read_df().date).strftime('%Y-%m-%d')
    end_date = max(m7.data.read_df().date).strftime('%Y-%m-%d')
    hs800_df = D.history_data(
    '000906.SHA',
    start_date=(pd.to_datetime(start_date) - datetime.timedelta(days=10)).strftime('%Y-%m-%d'),  # 多取几天的数据
    end_date=end_date)[['date', 'close']].rename(columns={'close': 'hs800_close'})
    
    # 与个股数据合并
    df = df[['date', 'close_0']].reset_index().merge(hs800_df, on='date', how='left').set_index('index')
    
    # 返回超额收益率
    return df['close_0'].pct_change() - df['hs800_close'].pct_change()

代码解释: 先根据开始日期和结束日期,通过平台的数据接口获取中证800的指数数据,然后将按股票代码groupby后的数据(个股数据)与中证800数据合并,最后在一个数据框中计算出超额收益率。

查看个股超额收益率特征:

{w:100}{w:100}

  1. 拖入衍生特征抽取模块,继续抽取其他特征

{w:100}{w:100}

查看最终的特征数据,该特征数据可直接和标注数据合并,训练模型。 {w:100}{w:100}

自定义模块

本文将详细的展示如何开发自定义模块。我们希望开发一个模块,用来修改数据的列名:

  • 输入:有一个输入数据源,为输入数据
  • 参数:列名映射,格式为:原列名1:新列名1|原列名2:新列名2|原列名3:新列名3|..
  • 输出:有一个输出数据源,为结果数据

1. 准备输入数据,用于开发测试

为了有测试数据方便开发调试,我们直接新建 “可视化策略-空白”,拖入 数据源 模块,并配置如下,用作测试数据:

  • 数据源ID:bar1d_CN_STOCK_A
  • 开始日期:2018-01-01
  • 结束日期:2018-02-01

{w:100}{w:100}

其数据如下:

{w:100}{w:100}

2. 添加自定义模块

从左侧自定义模块拖拽 自定义Python模块 到画布中,并如下图连接

{w:100}{w:100}

3. 代码开发1:现在代码代码单元里一边开发一边测试

为了便于开发,我们新建一个代码单元,先在代码单元里,一边开发,一边测试。

从自定模块主函数里拷贝代码到代码单元: {w:100}{w:100}

4. 代码开发2:定义好接口

代码如下:

  • input_ds:输入数据源
  • columns:列名映射
  • Outputs.data:输出数据源
# 修改数据列名
def bigquant_run(input_ds, columns):
    # 示例代码如下。在这里编写您的代码
    # df =  pd.DataFrame({'data': [1, 2, 3]})
    # data_1 = DataSource.write_df(df)
    # data_2 = DataSource.write_pickle(df)
    return Outputs(data=None)

# 在m18上测试
bigquant_run(m18.data, 'avg_amount_0:new_avg_amount_0|rank_return_0/rank_return_5:return_change_5')

5. 代码开发2:代码实现

# 修改数据列名
def bigquant_run(input_ds, columns):
    # 解析列映射为dict, TODO: 验证输入是否有效
    columns = dict(c.split(':') for c in columns.split('|'))
    print('列名映射:', columns)
    # 输出数据源
    dataset_ds = DataSource()
    output_store = dataset_ds.open_df_store()

    for key, df in input_ds.iter_df():
        df.columns = [columns.get(c, c) for c in df.columns]
        df.to_hdf(output_store, key)
        row_count = len(df)
        print('%s: %s' % (key, len(df)))

    dataset_ds.close_df_store()
    return Outputs(data=dataset_ds)

# 6. 在m4上测试
mx = bigquant_run(m4.data, 'avg_amount_0:new_avg_amount_0|rank_return_0/rank_return_5:return_change_5')

6. 测试运行,并查看修改后的数据

{w:100}{w:100}

7. 自定义模块:拷贝代码到主函数

{w:100}{w:100}

8. 自定义模块:设置模块接口

注意 模块参数 那里输入是 json 的dict语法(不能有多余的逗号,着和python dict不同)

{w:100}{w:100}

9. 运行一下自定义模块

image|578x499{w:100}{w:100}

10. 查看自定义模块结果

{w:100}{w:100}

11. 保存模块

  1. 在自定义模块上右键 {w:100}{w:100}
  2. 选中新建模块 {w:100}{w:100}
  3. 设置模块id,必须为英文的:rename_columns {w:100}{w:100}
  4. 设置模块信息
    • 显示名称改为更友好的中文名
    • 开放代码:如果勾选,别人可以看到此模块的源代码,这个教程里,我们勾选上 {w:100}{w:100}
  5. 注意:刷新页面,就可以看到刚才新建的模块了 {w:100}{w:100}

12. 使用新建的模块

在刚才的实验里,拖入自定义模块,并连接数据源、配置参数如下,运行得到结果。

{w:100}{w:100}

恭喜,您已经可以创建自己的模块,扩展平台功能了

标签

机器学习深度学习
{link}