{"description":"实验创建于2023/2/10","graph":{"edges":[{"to_node_id":"-52:instruments","from_node_id":"-6:data"},{"to_node_id":"-81:input_data","from_node_id":"-31:data"},{"to_node_id":"-48:features","from_node_id":"-40:data"},{"to_node_id":"-52:features","from_node_id":"-40:data"},{"to_node_id":"-43:input_ds","from_node_id":"-81:data"},{"to_node_id":"-31:input_data","from_node_id":"-48:data"},{"to_node_id":"-48:input_data","from_node_id":"-52:data"}],"nodes":[{"node_id":"-6","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"20231120","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"20231124","type":"Literal","bound_global_parameter":null},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":0,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"-6"}],"output_ports":[{"name":"data","node_id":"-6"}],"cacheable":true,"seq_num":1,"comment":"","comment_collapsed":true,"x":-409,"y":-24},{"node_id":"-31","module_id":"BigQuantSpace.chinaa_stock_filter.chinaa_stock_filter-v1","parameters":[{"name":"index_constituent_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%8150%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%8150%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%B2%AA%E6%B7%B1300%22%2C%22displayValue%22%3A%22%E6%B2%AA%E6%B7%B1300%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81500%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81500%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81800%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81800%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%81180%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%81180%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81100%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81100%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%B7%B1%E8%AF%81100%22%2C%22displayValue%22%3A%22%E6%B7%B1%E8%AF%81100%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%811000%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%811000%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"board_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E6%B7%B1%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22displayValue%22%3A%22%E6%B7%B1%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E5%88%9B%E4%B8%9A%E6%9D%BF%22%2C%22displayValue%22%3A%22%E5%88%9B%E4%B8%9A%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E7%A7%91%E5%88%9B%E6%9D%BF%22%2C%22displayValue%22%3A%22%E7%A7%91%E5%88%9B%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E5%8C%97%E4%BA%A4%E6%89%80%22%2C%22displayValue%22%3A%22%E5%8C%97%E4%BA%A4%E6%89%80%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"industry_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E4%BA%A4%E9%80%9A%E8%BF%90%E8%BE%93%22%2C%22displayValue%22%3A%22%E4%BA%A4%E9%80%9A%E8%BF%90%E8%BE%93%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%BC%91%E9%97%B2%E6%9C%8D%E5%8A%A1%22%2C%22displayValue%22%3A%22%E4%BC%91%E9%97%B2%E6%9C%8D%E5%8A%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%BC%A0%E5%AA%92%2F%E4%BF%A1%E6%81%AF%E6%9C%8D%E5%8A%A1%22%2C%22displayValue%22%3A%22%E4%BC%A0%E5%AA%92%2F%E4%BF%A1%E6%81%AF%E6%9C%8D%E5%8A%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%85%AC%E7%94%A8%E4%BA%8B%E4%B8%9A%22%2C%22displayValue%22%3A%22%E5%85%AC%E7%94%A8%E4%BA%8B%E4%B8%9A%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%86%9C%E6%9E%97%E7%89%A7%E6%B8%94%22%2C%22displayValue%22%3A%22%E5%86%9C%E6%9E%97%E7%89%A7%E6%B8%94%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%8C%96%E5%B7%A5%22%2C%22displayValue%22%3A%22%E5%8C%96%E5%B7%A5%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%8C%BB%E8%8D%AF%E7%94%9F%E7%89%A9%22%2C%22displayValue%22%3A%22%E5%8C%BB%E8%8D%AF%E7%94%9F%E7%89%A9%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%95%86%E4%B8%9A%E8%B4%B8%E6%98%93%22%2C%22displayValue%22%3A%22%E5%95%86%E4%B8%9A%E8%B4%B8%E6%98%93%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%9B%BD%E9%98%B2%E5%86%9B%E5%B7%A5%22%2C%22displayValue%22%3A%22%E5%9B%BD%E9%98%B2%E5%86%9B%E5%B7%A5%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%AE%B6%E7%94%A8%E7%94%B5%E5%99%A8%22%2C%22displayValue%22%3A%22%E5%AE%B6%E7%94%A8%E7%94%B5%E5%99%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%BB%BA%E7%AD%91%E6%9D%90%E6%96%99%2F%E5%BB%BA%E7%AD%91%E5%BB%BA%E6%9D%90%22%2C%22displayValue%22%3A%22%E5%BB%BA%E7%AD%91%E6%9D%90%E6%96%99%2F%E5%BB%BA%E7%AD%91%E5%BB%BA%E6%9D%90%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%BB%BA%E7%AD%91%E8%A3%85%E9%A5%B0%22%2C%22displayValue%22%3A%22%E5%BB%BA%E7%AD%91%E8%A3%85%E9%A5%B0%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%88%BF%E5%9C%B0%E4%BA%A7%22%2C%22displayValue%22%3A%22%E6%88%BF%E5%9C%B0%E4%BA%A7%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9C%89%E8%89%B2%E9%87%91%E5%B1%9E%22%2C%22displayValue%22%3A%22%E6%9C%89%E8%89%B2%E9%87%91%E5%B1%9E%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9C%BA%E6%A2%B0%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E6%9C%BA%E6%A2%B0%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%B1%BD%E8%BD%A6%2F%E4%BA%A4%E8%BF%90%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E6%B1%BD%E8%BD%A6%2F%E4%BA%A4%E8%BF%90%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%94%B5%E5%AD%90%22%2C%22displayValue%22%3A%22%E7%94%B5%E5%AD%90%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%94%B5%E6%B0%94%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E7%94%B5%E6%B0%94%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%BA%BA%E7%BB%87%E6%9C%8D%E8%A3%85%22%2C%22displayValue%22%3A%22%E7%BA%BA%E7%BB%87%E6%9C%8D%E8%A3%85%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%BB%BC%E5%90%88%22%2C%22displayValue%22%3A%22%E7%BB%BC%E5%90%88%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E8%AE%A1%E7%AE%97%E6%9C%BA%22%2C%22displayValue%22%3A%22%E8%AE%A1%E7%AE%97%E6%9C%BA%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E8%BD%BB%E5%B7%A5%E5%88%B6%E9%80%A0%22%2C%22displayValue%22%3A%22%E8%BD%BB%E5%B7%A5%E5%88%B6%E9%80%A0%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%80%9A%E4%BF%A1%22%2C%22displayValue%22%3A%22%E9%80%9A%E4%BF%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%87%87%E6%8E%98%22%2C%22displayValue%22%3A%22%E9%87%87%E6%8E%98%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%92%A2%E9%93%81%22%2C%22displayValue%22%3A%22%E9%92%A2%E9%93%81%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%93%B6%E8%A1%8C%22%2C%22displayValue%22%3A%22%E9%93%B6%E8%A1%8C%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%9D%9E%E9%93%B6%E9%87%91%E8%9E%8D%22%2C%22displayValue%22%3A%22%E9%9D%9E%E9%93%B6%E9%87%91%E8%9E%8D%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%A3%9F%E5%93%81%E9%A5%AE%E6%96%99%22%2C%22displayValue%22%3A%22%E9%A3%9F%E5%93%81%E9%A5%AE%E6%96%99%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"st_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%AD%A3%E5%B8%B8%22%2C%22displayValue%22%3A%22%E6%AD%A3%E5%B8%B8%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22ST%22%2C%22displayValue%22%3A%22ST%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22*ST%22%2C%22displayValue%22%3A%22*ST%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9A%82%E5%81%9C%E4%B8%8A%E5%B8%82%22%2C%22displayValue%22%3A%22%E6%9A%82%E5%81%9C%E4%B8%8A%E5%B8%82%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"delist_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%80%80%E5%B8%82%22%2C%22displayValue%22%3A%22%E9%80%80%E5%B8%82%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%9D%9E%E9%80%80%E5%B8%82%22%2C%22displayValue%22%3A%22%E9%9D%9E%E9%80%80%E5%B8%82%22%2C%22selected%22%3Atrue%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"output_left_data","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-31"}],"output_ports":[{"name":"data","node_id":"-31"},{"name":"left_data","node_id":"-31"}],"cacheable":true,"seq_num":4,"comment":"","comment_collapsed":true,"x":-160,"y":218},{"node_id":"-40","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\n股票名称=name\n所属板块=list_board_0\n上市天数=list_days_0\n流通市值=market_cap_float_0\n收盘价=close_0\n最高价=high_0\n最低价=low_0\n换手率=turn_0\n成交量=volume_0\n含当日5天均量=mean(volume_0,5)\n含当日30天均量=mean(volume_0,30)\n五天前的30天均量=shift(mean(volume_0,30),5)\n跳空=where(low_0>shift(high_0,1),1,0)\n量的倍数=mean(volume_0,5)/shift(mean(volume_0,30),5)","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-40"}],"output_ports":[{"name":"data","node_id":"-40"}],"cacheable":true,"seq_num":5,"comment":"","comment_collapsed":true,"x":-33,"y":-56},{"node_id":"-81","module_id":"BigQuantSpace.dropnan.dropnan-v2","parameters":[],"input_ports":[{"name":"input_data","node_id":"-81"},{"name":"features","node_id":"-81"}],"output_ports":[{"name":"data","node_id":"-81"}],"cacheable":true,"seq_num":6,"comment":"","comment_collapsed":true,"x":-129,"y":316},{"node_id":"-48","module_id":"BigQuantSpace.derived_feature_extractor.derived_feature_extractor-v3","parameters":[{"name":"date_col","value":"date","type":"Literal","bound_global_parameter":null},{"name":"instrument_col","value":"instrument","type":"Literal","bound_global_parameter":null},{"name":"drop_na","value":"False","type":"Literal","bound_global_parameter":null},{"name":"remove_extra_columns","value":"False","type":"Literal","bound_global_parameter":null},{"name":"user_functions","value":"{}","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-48"},{"name":"features","node_id":"-48"}],"output_ports":[{"name":"data","node_id":"-48"}],"cacheable":true,"seq_num":3,"comment":"","comment_collapsed":true,"x":-170,"y":141},{"node_id":"-43","module_id":"BigQuantSpace.sort.sort-v5","parameters":[{"name":"sort_by","value":"量的倍数","type":"Literal","bound_global_parameter":null},{"name":"group_by","value":"instrument","type":"Literal","bound_global_parameter":null},{"name":"keep_columns","value":"","type":"Literal","bound_global_parameter":null},{"name":"ascending","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_ds","node_id":"-43"},{"name":"sort_by_ds","node_id":"-43"}],"output_ports":[{"name":"sorted_data","node_id":"-43"}],"cacheable":true,"seq_num":7,"comment":"","comment_collapsed":true,"x":-125,"y":404},{"node_id":"-52","module_id":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","parameters":[{"name":"start_date","value":"20231120","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"20231124","type":"Literal","bound_global_parameter":null},{"name":"before_start_days","value":90,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-52"},{"name":"features","node_id":"-52"}],"output_ports":[{"name":"data","node_id":"-52"}],"cacheable":true,"seq_num":8,"comment":"","comment_collapsed":true,"x":-387,"y":62}],"node_layout":"<node_postions><node_position Node='-6' Position='-409,-24,200,200'/><node_position Node='-31' Position='-160,218,200,200'/><node_position Node='-40' Position='-33,-56,200,200'/><node_position Node='-81' Position='-129,316,200,200'/><node_position Node='-48' Position='-170,141,200,200'/><node_position Node='-43' Position='-125,404,200,200'/><node_position Node='-52' Position='-387,62,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [2]:
    # 本代码由可视化策略环境自动生成 2023年11月27日 00:08
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
     
    # 显式导入 BigQuant 相关 SDK 模块
    from bigdatasource.api import DataSource
    from bigdata.api.datareader import D
    from biglearning.api import M
    from biglearning.api import tools as T
    from biglearning.module2.common.data import Outputs
     
    import pandas as pd
    import numpy as np
    import math
    import warnings
    import datetime
     
    from zipline.finance.commission import PerOrder
    from zipline.api import get_open_orders
    from zipline.api import symbol
     
    from bigtrader.sdk import *
    from bigtrader.utils.my_collections import NumPyDeque
    from bigtrader.constant import OrderType
    from bigtrader.constant import Direction
    
    # <aistudiograph>
    
    # @module(position="-409,-24", comment='', comment_collapsed=True)
    m1 = M.instruments.v2(
        start_date='20231120',
        end_date='20231124',
        market='CN_STOCK_A',
        instrument_list='',
        max_count=0
    )
    
    # @module(position="-33,-56", comment='', comment_collapsed=True)
    m5 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    instrument
    date
    股票名称=name
    所属板块=list_board_0
    上市天数=list_days_0
    流通市值=market_cap_float_0
    收盘价=close_0
    最高价=high_0
    最低价=low_0
    换手率=turn_0
    成交量=volume_0
    含当日5天均量=mean(volume_0,5)
    含当日30天均量=mean(volume_0,30)
    五天前的30天均量=shift(mean(volume_0,30),5)
    跳空=where(low_0>shift(high_0,1),1,0)
    量的倍数=mean(volume_0,5)/shift(mean(volume_0,30),5)"""
    )
    
    # @module(position="-387,62", comment='', comment_collapsed=True)
    m8 = M.general_feature_extractor.v7(
        instruments=m1.data,
        features=m5.data,
        start_date='20231120',
        end_date='20231124',
        before_start_days=90
    )
    
    # @module(position="-170,141", comment='', comment_collapsed=True)
    m3 = M.derived_feature_extractor.v3(
        input_data=m8.data,
        features=m5.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=False,
        remove_extra_columns=False,
        user_functions={}
    )
    
    # @module(position="-160,218", comment='', comment_collapsed=True)
    m4 = M.chinaa_stock_filter.v1(
        input_data=m3.data,
        index_constituent_cond=['全部'],
        board_cond=['上证主板', '深证主板', '创业板', '科创板'],
        industry_cond=['全部'],
        st_cond=['正常'],
        delist_cond=['非退市'],
        output_left_data=False
    )
    
    # @module(position="-129,316", comment='', comment_collapsed=True)
    m6 = M.dropnan.v2(
        input_data=m4.data
    )
    
    # @module(position="-125,404", comment='', comment_collapsed=True)
    m7 = M.sort.v5(
        input_ds=m6.data,
        sort_by='量的倍数',
        group_by='instrument',
        keep_columns='',
        ascending=False
    )
    # </aistudiograph>
    
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    Cell In[2], line 61
         38 m5 = M.input_features.v1(
         39     features="""
         40 # #号开始的表示注释,注释需单独一行
       (...)
         57 量的倍数=mean(volume_0,5)/shift(mean(volume_0,30),5)"""
         58 )
         60 # @module(position="-387,62", comment='', comment_collapsed=True)
    ---> 61 m8 = M.general_feature_extractor.v7(
         62     instruments=m1.data,
         63     features=m5.data,
         64     start_date='20231120',
         65     end_date='20231124',
         66     before_start_days=90
         67 )
         69 # @module(position="-170,141", comment='', comment_collapsed=True)
         70 m3 = M.derived_feature_extractor.v3(
         71     input_data=m8.data,
         72     features=m5.data,
       (...)
         77     user_functions={}
         78 )
    
    File module2/common/modulemanagerv2.py:88, in biglearning.module2.common.modulemanagerv2.BigQuantModuleVersion.__call__()
    
    File module2/common/moduleinvoker.py:370, in biglearning.module2.common.moduleinvoker.module_invoke()
    
    File module2/common/moduleinvoker.py:292, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
    
    File module2/common/moduleinvoker.py:253, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
    
    File module2/common/moduleinvoker.py:212, in biglearning.module2.common.moduleinvoker._module_run()
    
    File module2/modules/general_feature_extractor/v7/__init__.py:86, in biglearning.module2.modules.general_feature_extractor.v7.__init__.BigQuantModule.run()
    
    File /var/app/enabled/bigdatasource/api/datareader.py:237, in features(self, instruments, start_date, end_date, fields, groupped_by_instrument, market)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/frame.py:8192, in DataFrame.merge(self, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
       8173 @Substitution("")
       8174 @Appender(_merge_doc, indents=2)
       8175 def merge(
       (...)
       8188     validate=None,
       8189 ) -> DataFrame:
       8190     from pandas.core.reshape.merge import merge
    -> 8192     return merge(
       8193         self,
       8194         right,
       8195         how=how,
       8196         on=on,
       8197         left_on=left_on,
       8198         right_on=right_on,
       8199         left_index=left_index,
       8200         right_index=right_index,
       8201         sort=sort,
       8202         suffixes=suffixes,
       8203         copy=copy,
       8204         indicator=indicator,
       8205         validate=validate,
       8206     )
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/reshape/merge.py:74, in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
         57 @Substitution("\nleft : DataFrame")
         58 @Appender(_merge_doc, indents=0)
         59 def merge(
       (...)
         72     validate=None,
         73 ) -> "DataFrame":
    ---> 74     op = _MergeOperation(
         75         left,
         76         right,
         77         how=how,
         78         on=on,
         79         left_on=left_on,
         80         right_on=right_on,
         81         left_index=left_index,
         82         right_index=right_index,
         83         sort=sort,
         84         suffixes=suffixes,
         85         copy=copy,
         86         indicator=indicator,
         87         validate=validate,
         88     )
         89     return op.get_result()
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/reshape/merge.py:668, in _MergeOperation.__init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)
        661 self._cross = cross_col
        663 # note this function has side effects
        664 (
        665     self.left_join_keys,
        666     self.right_join_keys,
        667     self.join_names,
    --> 668 ) = self._get_merge_keys()
        670 # validate the merge keys dtypes. We may need to coerce
        671 # to avoid incompatible dtypes
        672 self._maybe_coerce_merge_keys()
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/reshape/merge.py:1033, in _MergeOperation._get_merge_keys(self)
       1031 if not is_rkey(rk):
       1032     if rk is not None:
    -> 1033         right_keys.append(right._get_label_or_level_values(rk))
       1034     else:
       1035         # work-around for merge_asof(right_index=True)
       1036         right_keys.append(right.index)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/generic.py:1683, in NDFrame._get_label_or_level_values(self, key, axis)
       1681     values = self.axes[axis].get_level_values(key)._values
       1682 else:
    -> 1683     raise KeyError(key)
       1685 # Check for duplicates
       1686 if values.ndim > 1:
    
    KeyError: 'date'