FAQ > 金融建模 > 第三方交互 > Python

Q:Python调pyTSL接口取数范例03:财务数据的提取    

简述

1.在进行交互取数前,需要做相关配置,操作请查看文档:FAQ:天软pyTSL接口
2.天软财务数据提取说明:FAQ:2017-01-05-应用专题-数据提取专题01:天软财务数据提取专题.(更新版)


  • A:根据pyTSL提供的两个取数接口(exec,call)从以下五个维度提供实现范例,用户可根据需求参考相关范例:
    1.取个股指定日财务指标
    2.取个股一段时间的财务指标
    3.取股票列表指定日财务指标
    4.取组合一段时间财务指标
    5.取个股指定财务报表数据
    实现一:取个股指定日财务指标
    范例01:exec接口取数
    比如:获取SZ000002在20211210日最近报告期的归母净利润数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
    stock:='SZ000002';
    endt:=20211210t;
    setsysparam(pn_stock(),stock);
    setsysparam(pn_date(),endt);
    rdate:=NewReportDateOfEndT2(endt); //获取指定日最新可以取得到的报告期
    infoid:=46078; //归属于母公司所有者净利润ID
    return array(("最近报告期":rdate,
           "指标":"归属于母公司所有者净利润",
           "季度数据(亿)":LastQuarterData(rdate,infoid)/100000000,
           "报告期数据(亿)":reportofall(infoid,rdate)/100000000,
           "TTM数据(亿)":Last12MData(rdate,infoid)/100000000));
    '''
    #调用接口执行交互代码
    r = c.exec(tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    范例02:call接口取数
    比如:获取SZ000002在20211210日最近报告期的扣非净利润
    from datetime import datetime
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
    function get_data(stock,endt);
    begin
    setsysparam(pn_stock(),stock);
    setsysparam(pn_date(),endt);
    rdate:=NewReportDateOfEndT2(endt); //获取指定日最新可以取得到的报告期
    infoid:=42017; //扣除非经常性损益后的净利润
    return array(("最近报告期":rdate,
           "指标":"扣除非经常性损益后的净利润",
           "季度数据(亿)":LastQuarterData(rdate,infoid)/100000000,
           "报告期数据(亿)":reportofall(infoid,rdate)/100000000,
           "TTM数据(亿)":Last12MData(rdate,infoid)/100000000));
    end
    '''
    #调用接口执行交互代码
    r = c.call('get_data','SZ000002',datetime(2021,12,10),code=tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    实现二:取个股一段时间的财务指标
    范例03:exec接口取数
    比如:获取SZ000002在2021年-2023年每个报告期的财务指标数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
      stock:='SZ000002';
      setsysparam(pn_stock(),stock);
      begt:=20210101t;
      endt:=20231231t;
      rdates:= RDateListQK(begt,endt); //区间报告期列表
      rt:=array();
      for i,rdate in rdates do
      begin
        rt[i,"报告期"]:=rdate;
        rt[i,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益
        rt[i,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润
        rt[i,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计
        rt[i,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润
        rt[i,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
      end
      return rt;
    '''
    #调用接口执行交互代码
    r = c.exec(tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    范例04:call接口取数
    比如:获取SZ000002在2021年-2023年每个报告期的财务指标数据
    from datetime import datetime
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
    function get_data(stock,begt,endt);
    begin
      setsysparam(pn_stock(),stock);
      rdates:= RDateListQK(begt,endt); //区间报告期列表
      rt:=array();
      for i,rdate in rdates do
      begin
        rt[i,"报告期"]:=rdate;
        rt[i,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益
        rt[i,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润
        rt[i,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计
        rt[i,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润
        rt[i,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
      end
      return rt;
    end
    '''
    #调用接口执行交互代码
    r = c.call('get_data','SZ000002',datetime(2021,1,1),datetime(2023,12,31),code=tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    实现三:取股票列表指定日财务指标
    范例05:exec接口取数
    比如:获取上证50成分股在20211210最近报告期的财务指标数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
      endt:=20211210t;
      stocks:=getbkbydate("SH000016",endt);//上证50指定日成分股
      setsysparam(pn_stock(),stocks[0]);
      setsysparam(pn_date(),endt);
      rdate:=NewReportDateOfEndT2(endt); //获取指定日最新可以取得到的报告期
      rt:=array();
      for i,stock in stocks do
      begin
        setsysparam(pn_stock(),stock);
        rt[i,"代码"]:=stock;
        rt[i,"名称"]:=stockname(stock);
        rt[i,"最近报告期"]:=rdate;
        rt[i,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益;
        rt[i,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润;
        rt[i,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计;
        rt[i,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润;
        rt[i,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
      end
      return rt;
    '''
    #调用接口执行交互代码
    r = c.exec(tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    范例06:call接口取数
    比如:获取上证50成分股在20211210最近报告期的财务指标数据
    from datetime import datetime
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    endt=datetime(2021,12,10)
    #获取指定日上证50成分股
    stocks=c.exec('''return getbkbydate("SH000016",strtodatetime('{}'));'''.format(endt)).value()
    tsl = '''
    function get_data(stocks,endt);
    begin
      setsysparam(pn_stock(),stocks[0]);
      setsysparam(pn_date(),endt);
      rdate:=NewReportDateOfEndT2(endt); //获取指定日最新可以取得到的报告期
      rt:=array();
      for i,stock in stocks do
      begin
        setsysparam(pn_stock(),stock);
        rt[i,"代码"]:=stock;
        rt[i,"名称"]:=stockname(stock);
        rt[i,"最近报告期"]:=rdate;
        rt[i,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益;
        rt[i,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润;
        rt[i,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计;
        rt[i,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润;
        rt[i,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
      end
      return rt;
    end
    '''
    #调用接口执行交互代码
    r = c.call("get_data",stocks,endt,code=tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    实现四:取组合一段时间财务指标
    范例07:exec接口取数
    比如:获取上证50成分股在2021-2023年每个报告期的财务指标数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
      begt:=20210101t;
      endt:=20231231t;
      rdates:= RDateListQK(begt,endt); //区间报告期列表
      stocks:=GetBKByBegTEndT("SH000016",begt,endt)[:,"代码"];//上证50区间成分股
      rt:=array();
      x:=0;
      for i,stock in stocks do
      begin
        setsysparam(pn_stock(),stock);
        name:=stockname(stock);
        for j,rdate in rdates do
        begin
          rt[x,"代码"]:=stock;
          rt[x,"名称"]:=name;
          rt[x,"报告期"]:=rdate;
          rt[x,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益;
          rt[x,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润;
          rt[x,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计;
          rt[x,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润;
          rt[x,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
          x++;
        end
      end
      return rt;
    '''
    #调用接口执行交互代码
    r = c.exec(tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    范例08:call接口取数
    比如:获取上证50成分股在2021-2023年每个报告期的财务指标数据
    from datetime import datetime
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    begt=datetime(2021,1,1)
    endt=datetime(2023,12,31)
    #获取上证50指定日期区间成分股
    stocks = c.exec('''return GetBKByBegTEndT("SH000016",strtodatetime("{}"),strtodatetime("{}"))[:,"代码"];'''.format(begt,endt)).value()
    tsl = '''
    function get_data(stocks,begt,endt);
    begin
      rdates:= RDateListQK(begt,endt); //区间报告期列表
      rt:=array();
      x:=0;
      for i,stock in stocks do
      begin
        setsysparam(pn_stock(),stock);
        name:=stockname(stock);
        for j,rdate in rdates do
        begin
          rt[x,"代码"]:=stock;
          rt[x,"名称"]:=name;
          rt[x,"报告期"]:=rdate;
          rt[x,"每股收益"]:=ReportOfAll(9900000,rdate); //每股收益;
          rt[x,"扣非净利润"]:=ReportOfAll(42017,rdate); //扣除非经常性损益后的净利润;
          rt[x,"归母股东权益"]:=ReportOfAll(44140,rdate); //归属母公司股东权益合计;
          rt[x,"归母净利润"]:=ReportOfAll(46078,rdate); // 归属于母公司所有者净利润;
          rt[x,"期末现金及现金等价物余额"]:=ReportOfAll(48166,rdate); //期末现金及现金等价物余额
          x++;
        end
      end
      return rt;
    end
    '''
    #调用接口执行交互代码
    r = c.call('get_data',stocks,begt,endt,code=tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    实现五:取个股指定财务报表数据
    范例09:exec接口取数
    比如:获取SZ000002的资产负债表数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
    stock:='SZ000002';
    return select * from infotable 44 of stock end;
    '''
    #调用接口执行交互代码
    r = c.exec(tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果:

    范例10:call接口取数
    比如:获取SZ000002在2021-2023年的利润分配表数据
    import sys
    import pyTSL as ts
    c = ts.Client("user", "password", "tsl.tinysoft.com.cn", 443)#user 为天软账号, password 为账号密码
    lg=c.login()
    if lg != 1:
      print("登陆天软服务器失败:",c.last_error())
      sys.exit()
    else:
      print("登陆天软服务器成功")
    tsl = '''
    function get_data(stock,dbegt,dendt);
    begin
      return select * from infotable 46 of stock
        where ["截止日"]>=dbegt and ["截止日"]<=dendt end;
    end
    '''
    #调用接口执行交互代码
    r = c.call('get_data','SZ000002',20210101,20231231,code=tsl)
    if r.error() !=0:
      print(r.message())
    else:
      print(r.dataframe())

    执行结果: