【学院教程】平台可转债数据的介绍与使用

策略分享
用户成长系列
宽客学院
标签: #<Tag:0x00007f0dbad316d8> #<Tag:0x00007f0dbad31598> #<Tag:0x00007f0dbad31458>

(Alkaid) #1
克隆策略

    {"Description":"实验创建于2017/8/26","Summary":"","Graph":{"EdgesInternal":[],"ModuleNodes":[{"Id":"-194","ModuleId":"BigQuantSpace.use_datasource.use_datasource-v1","ModuleParameters":[{"Name":"datasource_id","Value":"basic_info_CN_BOND","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"start_date","Value":"2020-01-15","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"2020-02-15","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-194"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-194"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-194","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":1,"Comment":"","CommentCollapsed":true},{"Id":"-201","ModuleId":"BigQuantSpace.use_datasource.use_datasource-v1","ModuleParameters":[{"Name":"datasource_id","Value":"issue_CN_BOND","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"start_date","Value":"2020-01-15","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"2020-02-15","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-201"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-201"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-201","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":2,"Comment":"","CommentCollapsed":true},{"Id":"-208","ModuleId":"BigQuantSpace.use_datasource.use_datasource-v1","ModuleParameters":[{"Name":"datasource_id","Value":"bar1d_CN_BOND","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"start_date","Value":"2020-01-15","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"2020-02-15","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-208"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-208"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-208","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":3,"Comment":"","CommentCollapsed":true}],"SerializedClientData":"<?xml version='1.0' encoding='utf-16'?><DataV1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Meta /><NodePositions><NodePosition Node='-194' Position='749.634765625,94.45949935913086,200,200'/><NodePosition Node='-201' Position='749.634765625,200.08541870117188,200,200'/><NodePosition Node='-208' Position='751.1096801757812,305.6877136230469,200,200'/></NodePositions><NodeGroups /></DataV1>"},"IsDraft":true,"ParentExperimentId":null,"WebService":{"IsWebServiceExperiment":false,"Inputs":[],"Outputs":[],"Parameters":[{"Name":"交易日期","Value":"","ParameterDefinition":{"Name":"交易日期","FriendlyName":"交易日期","DefaultValue":"","ParameterType":"String","HasDefaultValue":true,"IsOptional":true,"ParameterRules":[],"HasRules":false,"MarkupType":0,"CredentialDescriptor":null}}],"WebServiceGroupId":null,"SerializedClientData":"<?xml version='1.0' encoding='utf-16'?><DataV1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Meta /><NodePositions></NodePositions><NodeGroups /></DataV1>"},"DisableNodesUpdate":false,"Category":"user","Tags":[],"IsPartialRun":false}
    In [92]:
    # 本代码由可视化策略环境自动生成 2021年4月6日17:11
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
    
    
    m1 = M.use_datasource.v1(
        datasource_id='basic_info_CN_BOND',
        start_date='2020-01-15',
        end_date='2020-02-15'
    )
    
    m2 = M.use_datasource.v1(
        datasource_id='issue_CN_BOND',
        start_date='2020-01-15',
        end_date='2020-02-15'
    )
    
    m3 = M.use_datasource.v1(
        datasource_id='bar1d_CN_BOND',
        start_date='2020-01-15',
        end_date='2020-02-15'
    )
    
    In [99]:
    df = m1.data.read()
    df2 = m2.data.read()
    df3 = m3.data.read()
    
    In [94]:
    df.shape
    
    Out[94]:
    (649, 33)
    In [95]:
    df
    
    Out[95]:
    instrument name symbol stk_instrument stk_symbol maturity par issue_price issue_amount bond_balance ... put_clause maturity_put_price call_clause reset_clause conv_clause guarantor guarantee_type issue_rating newest_rating rating_comp
    0 126001.SHA 马鞍山钢铁股份有限公司可转换公司债券 06马钢债 600808.SHA 马钢股份 5.0 100.0 NaN 5.500000e+09 NaN ... None nan None None None None None None None None
    1 115001.SZA 攀钢集团钢铁钒钛股份有限公司可转换公司债券 钒钛债1 000629.SZA 攀钢钒钛 6.0 100.0 NaN 3.200000e+09 NaN ... None nan None None None None None None None None
    2 126002.SHA 中化国际(控股)股份有限公司可转换公司债券 06中化债 600500.SHA 中化国际 6.0 100.0 NaN 1.200000e+09 NaN ... None nan None None None None None None None None
    3 126003.SHA 云南云天化股份有限公司可转换公司债券 07云化债 600096.SHA 云天化 6.0 100.0 NaN 1.000000e+09 NaN ... None nan None None None None None None None None
    4 126005.SHA 武汉钢铁股份有限公司可转换公司债券 07武钢债 600005.SHA 武钢股份 5.0 100.0 NaN 7.500000e+09 NaN ... None nan None None None None None None None None
    ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
    644 110812.SHA 神马实业股份有限公司定向可转换公司债券 神马定02 600810.SHA 神马股份 6.0 100.0 100.0 4.000000e+08 NaN ... 本次发行的可转换公司债券到期后5个交易日内,公司将向债券持有人赎回全部未转股的可转换公司债券... 110.0 在本次发行的可转换公司债券最后两个计息年度,当可转换公司债券持有人所持可转换公司债券满足解锁... 在本次发行的可转换公司债券转股期内,如公司股票在任意连续30个交易日中至少有20个交易日的收... 本次发行的可转换公司债券发行完成之后,若公司发生派送现金股利,派送股票股利,资本公积金转增股... None None None None None
    645 123108.SZA 乐普(北京)医疗器械股份有限公司向不特定对象发行可转换公司债券 乐普转2 300003.SZA 乐普医疗 5.0 100.0 100.0 1.638000e+09 NaN ... 转股期内,当下述两种情形的任意一种出现时,公司有权决定按照债券面值加当期应计利息的价格赎回全... 107.8 在本次发行的可转债的最后两个计息年度,如果公司股票在任何连续30个交易日的收盘价格低于当期转... 在本次发行的可转债存续期间,当公司股票在任意连续30个交易日中至少有15个交易日的收盘价低于... 在本次发行之后,当公司因送红股,转增股本,增发新股,配股或派发现金股利等情况(不包括因本次发... None None None None None
    646 123109.SZA 深圳市昌红科技股份有限公司向不特定对象发行可转换公司债券 昌红转债 300151.SZA 昌红科技 6.0 100.0 100.0 4.600000e+08 NaN ... 转股期内,当下述两种情形的任意一种出现时,公司有权决定按照债券面值加当期应计利息的价格赎回全... 115.0 在本次发行的可转换公司债券最后两个计息年度,如果公司股票在任意连续三十个交易日的收盘价格低于... 在本次发行的可转换公司债券存续期间,当公司股票在任意连续三十个交易日中至少有十五个交易日的收... 在本次发行之后,当公司发生派送股票股利,转增股本,增发新股或配股(不包括因本次发行的可转换公... None None None None None
    647 123110.SZA 湖南九典制药股份有限公司向不特定对象发行可转换公司债券 九典转债 300705.SZA 九典制药 6.0 100.0 100.0 2.700000e+08 NaN ... 本次可转债发行期间内,如下描述情况任意一种出现时,发行人有权按债券面值加当期应计利息的价格赎... 115.0 在本次发行的可转债最后两个计息年度,如果公司股票在任何连续三十个交易日的收盘价格低于当期转股... 在本可转债存续期间,当公司股票在任意连续三十个交易日中至少有十五个交易日的收盘价低于当期转股... 在本次发行之后,当公司发生派送股票股利,转增股本,增发新股(不包括因本次发行的可转债转股而增... None None None None None
    648 123111.SZA 东方财富信息股份有限公司创业板向不特定对象发行可转换公司债券 东财转3 300059.SZA 东方财富 6.0 100.0 NaN 1.580000e+10 NaN ... None 107.0 None None None None None None None None

    649 rows × 33 columns

    可见表中有异常值,共有NaN nan None 三种显示,接下来进行统计每列的数据完整性

    In [107]:
    #统计每一列有几个异常值并添加到对应的index组合成键值对输出
    indexlist=[]
    serlist=[]
    for index, ser in df.iteritems():
        indexlist.append(index)
        cnt=0
        for index, val in ser.items():
            #print(val)
            if ( val == "nan" or val == "None" or val != val ): #判断标准 其中val != val用来判断NaN (is not a number)
                cnt=cnt+1
                #print(val)
        serlist.append(cnt)
    #print(indexlist)
    #print(serlist)
    dictionary = dict(zip(indexlist, serlist))
    print (dictionary)
    
    {'instrument': 0, 'name': 0, 'symbol': 0, 'stk_instrument': 2, 'stk_symbol': 2, 'maturity': 0, 'par': 0, 'issue_price': 587, 'issue_amount': 0, 'bond_balance': 649, 'value_date': 0, 'maturity_date': 0, 'rate_type': 649, 'coupon_rate': 649, 'add_rate': 628, 'pay_per_year': 0, 'list_date': 43, 'exchange': 0, 'conv_start_date': 23, 'conv_end_date': 23, 'first_conv_price': 24, 'conv_price': 25, 'rate_clause': 587, 'put_clause': 588, 'maturity_put_price': 88, 'call_clause': 589, 'reset_clause': 587, 'conv_clause': 588, 'guarantor': 649, 'guarantee_type': 649, 'issue_rating': 649, 'newest_rating': 649, 'rating_comp': 649}
    
    In [105]:
    df2
    
    Out[105]:
    instrument date res_date plan_issue_amount issue_amount issue_price issue_type issue_cost onl_instrument onl_symbol ... shd_ration_num shd_ration_excess offl_amount offl_deposit offl_pch_vol offl_pch_num offl_pch_excess offl_winning_rate lead_underwriter lead_underwriter_vol
    0 124004.SZA 2020-01-22 20200122 NaN 0.270 100.0 定向 NaN None None ... nan NaN 270000.0 NaN NaN nan NaN NaN None NaN
    1 128096.SZA 2020-02-07 20200217 NaN 10.868 100.0 优先配售和上网定价 21698491.32 072701 奥瑞发债 ... nan 1.0 NaN NaN NaN nan NaN NaN 中信建投证券股份有限公司、华安证券股份有限公司 48550.0
    2 128095.SZA 2020-02-07 20200217 NaN 16.000 100.0 优先配售和上网定价 13877358.49 072812 恩捷发债 ... nan 1.0 NaN NaN NaN nan NaN NaN 中信证券股份有限公司 35966.0

    3 rows × 35 columns

    In [108]:
    #df2
    indexlist=[]
    serlist=[]
    for index, ser in df2.iteritems():
        indexlist.append(index)
        cnt=0
        for index, val in ser.items():
            #print(val)
            if ( val == "nan" or val == "None" or val != val): #判断标准
                cnt=cnt+1
                #print(val)
        serlist.append(cnt)
    #print(indexlist)
    #print(serlist)
    dictionary = dict(zip(indexlist, serlist))
    print (dictionary)
    
    {'instrument': 0, 'date': 0, 'res_date': 0, 'plan_issue_amount': 3, 'issue_amount': 0, 'issue_price': 0, 'issue_type': 0, 'issue_cost': 1, 'onl_instrument': 1, 'onl_symbol': 1, 'onl_date': 1, 'onl_amount': 1, 'onl_pch_vol': 1, 'onl_pch_num': 3, 'onl_pch_excess': 1, 'onl_winning_rate': 1, 'shd_ration_code': 1, 'shd_ration_name': 1, 'shd_ration_date': 1, 'shd_ration_record_date': 1, 'shd_ration_pay_date': 1, 'shd_ration_price': 1, 'shd_ration_ratio': 1, 'shd_ration_size': 1, 'shd_ration_vol': 1, 'shd_ration_num': 3, 'shd_ration_excess': 1, 'offl_amount': 2, 'offl_deposit': 3, 'offl_pch_vol': 3, 'offl_pch_num': 3, 'offl_pch_excess': 3, 'offl_winning_rate': 3, 'lead_underwriter': 1, 'lead_underwriter_vol': 1}
    
    In [109]:
    df3
    
    Out[109]:
    instrument date pre_close open high low close change pct_chg volume amount
    0 128041.SZA 2020-01-15 139.302 139.500 139.750 138.741 139.370 0.068 0.0488 436.2 607527.0
    1 128018.SZA 2020-01-15 100.660 100.599 100.795 100.000 100.385 -0.275 -0.2732 2722.7 2729057.0
    2 128014.SZA 2020-01-15 102.442 102.500 102.660 101.120 101.122 -1.320 -1.2885 1858.0 1897523.0
    3 128046.SZA 2020-01-15 113.300 112.660 115.200 111.000 112.666 -0.634 -0.5596 5069.3 5727132.0
    4 123029.SZA 2020-01-15 135.226 135.310 136.491 132.502 134.698 -0.528 -0.3905 3360.6 4506723.0
    ... ... ... ... ... ... ... ... ... ... ... ...
    3774 128061.SZA 2020-02-14 152.400 152.400 159.301 150.089 151.800 -0.600 -0.3937 34428.5 53242913.0
    3775 128052.SZA 2020-02-14 179.388 179.390 182.969 171.000 171.500 -7.888 -4.3972 23853.5 42393958.0
    3776 123028.SZA 2020-02-14 107.820 107.851 108.400 107.400 108.200 0.380 0.3524 11345.6 12249353.0
    3777 128022.SZA 2020-02-14 105.700 105.475 106.300 105.000 105.701 0.001 0.0009 2298.1 2432489.0
    3778 113528.SHA 2020-02-14 102.770 102.880 102.880 101.150 102.270 -0.500 -0.4865 3651.0 3735927.0

    3779 rows × 11 columns

    In [110]:
    #df3
    indexlist=[]
    serlist=[]
    for index, ser in df2.iteritems():
        indexlist.append(index)
        cnt=0
        for index, val in ser.items():
            #print(val)
            if ( val == "nan" or val == "None" or val != val): #判断标准
                cnt=cnt+1
                #print(val)
        serlist.append(cnt)
    #print(indexlist)
    #print(serlist)
    dictionary = dict(zip(indexlist, serlist))
    print (dictionary)
    
    {'instrument': 0, 'date': 0, 'res_date': 0, 'plan_issue_amount': 3, 'issue_amount': 0, 'issue_price': 0, 'issue_type': 0, 'issue_cost': 1, 'onl_instrument': 1, 'onl_symbol': 1, 'onl_date': 1, 'onl_amount': 1, 'onl_pch_vol': 1, 'onl_pch_num': 3, 'onl_pch_excess': 1, 'onl_winning_rate': 1, 'shd_ration_code': 1, 'shd_ration_name': 1, 'shd_ration_date': 1, 'shd_ration_record_date': 1, 'shd_ration_pay_date': 1, 'shd_ration_price': 1, 'shd_ration_ratio': 1, 'shd_ration_size': 1, 'shd_ration_vol': 1, 'shd_ration_num': 3, 'shd_ration_excess': 1, 'offl_amount': 2, 'offl_deposit': 3, 'offl_pch_vol': 3, 'offl_pch_num': 3, 'offl_pch_excess': 3, 'offl_winning_rate': 3, 'lead_underwriter': 1, 'lead_underwriter_vol': 1}
    
    In [ ]:
     
    

    BIGQUANT平台可转债数据的介绍与使用

    平台数据

    平台上的可转债数据包括以下数据源(表):

    • 可转债基本信息 (basic_info_CN_BOND)
    • 可转债发行 (issue_CN_BOND)
    • 可转债行情 (bar1d_CN_BOND
      其字段结构与描述可以参考平台数据文档 的对应部分

    基本使用

    1. 在数据文档中获取到表名
      image
    2. 新建一个数据源,并填充表名和日期
      image
      image image
    3. 可视化统计结果
      image
      image

    可转债

    基本概念

    可转换债券(可转债)是一种特殊的公司债券,持有者能在一定期限内以转股比例转换成对应的股票。可转债是一种复杂的金融衍生品,它同时由债券和期权两部分组成。在我国可转债市场,可转债的期权部分是一个同时包含了赎回、回售、下修等限制的复杂奇异期权,其价值主要由债券价值和期权价值两部分组成。

    近年来可转债市场规模持续增长,公募基金有增大可转债投资比例的趋势,可转债市场规模近年来保持稳中有增的态势。 截止2021年3月,市场上存续的可转债数量为497只,发行市值达到8000亿元左右。这一不断扩容的市场为投资者提供了新选择,公募基金有增大可转债投资比例的趋势。截至2020年底,偏股型基金和偏债型基金持仓可转债的总市值皆有明显增长。从持仓可转债占净值比例来看,灵活配置型基金的可转债持仓比例从最低点(2016年底)的1.2%升至2.4%,偏债型基金的可转债持仓比例从最低点(2017年底)的3.3%~13.2%上升至7.6%~23.4%。

    基本条款

    转股条款

    在转股期内,可转债持有人可通过执行转股条款,在 T+1 日获得相应数量的股票。通常转股期从发行日之后 6 个月开始,直至到期日结束。转股条款赋予了可转债美式期权属性。

    赎回条款

    赎回条款分为有条件赎回与到期赎回两种。有条件赎回为提前赎回,即当股票在任何连续三十个交易日中有十五个及以上交易日的收盘价格不低于当期转股价格的130%时,公司有权利赎回该转债,赎回价格为面值加上应计利息。赎回条款的目的在于,当股票价格较高时督促投资者转股,减少公司的财务成本。

    回售条款

    在回售期内,当任何连续三十个交易日的收盘价格低于当期转股价格的某比例时,投资者有权利将转债按照面值加应计利息回售给公司。回收条款的目的在于保护投资者的利益。然而回售期相对较短,一般为最后两年。同时一般情况下,每年回售条件满足时,投资者只有一次提出回售的机会,使得回售条件更为苛刻。

    下修条款

    下修条款定义为:当股票在任意三十个连续交易日中至少十五个交易日的收盘价低于当期转股价格某比例时,公司有权利向下修正转股价。下修条款的目的在于当公司股票价格较低时,目前以及将来的转股可能性较低,公司通过下修转股价格增加转股价值,使得投资者更倾向于转股,减少转债到期的财务支出。然而,下修条款的行使会影响其他期权的行使,转股权、赎回权、回售权以及下修条款只要执行了其中一项,另外三项就会随之消失或受影响。所以在对可转债进行定价的过程中需要考虑各个条款的触发条件以及各条款之间的相互联系。因此,下修条款大大提高了可转债的定价难度。

    重要指标

    平价

    平价又称为转股价值,即每100 面值的转债执行转股之后得到的股票价值:

    image

    转股溢价率

    转股溢价率是可转债市场价格相对于其转股价值的溢价水平,计算方法如下:

    image

    其中,转股价可以参考平台中可转债基本信息表,目前股价参考可转债行情表

    若转股溢价率较低,说明转债价格接近转股价值,主要受到股价影响,股性较强;若转股溢价率较高,说明转债价格远离转股价值,转债的债性较强或者期权的时间价值较大,此时转债的价格受股价的影响较小。

    reference

    【华泰金工林晓明团队】可转债市场概览及其隐含波动率策略
    bigquant.com