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

Q:如何通过第三方接口下载当天的行情及基本面数据(以python为例)    

  • A:在使用第三方交互接口访问天软数据库时,不建议频繁进行登录退出的操作
     因为登录与退出,需要远程与服务器进行连接会话,会非常依赖网络的稳定性及服务器的响应性能,过多的连接会存在一定的时间消耗,影响交互效率。
     当连接网络不好或服务器响应不佳时,短时间内多次断开重连容易触发占用多个登录数的情况(断开连接没有及时处理),操作过于频繁还会导致账号短时间被锁定的无法登录的现象。
     合理使用第三方接口应当尽量遵循一次登录,多次交互的原则

    下面介绍几种常见的交互方式:TSLPy接口、pyTSL接口、odbc接口对于一次登陆,多次交互的一个示例展示,以供用户参考。

    TSLPy使用范例
    参考:FAQ:2019-05-08-应用专题-第三方交互07:天软平台和PYTHON的交互
    范例一:使用TSLPy盘中获取实盘行情数据
    import time
    from datetime import datetime
    import pandas as pd
    import json
    import sys
    import TSLPy3 as ts

    path="C:/Users/86152/Desktop/download/"
    sys.path.append("C:\Program Files\Tinysoft\Analyse.NET")
    ts.DefaultConnectAndLogin("wh_server")#远程登录,用自己配置的别名

    tsstr='''
      stocks:=getbk('A股');
      setsysparam(PN_Precision(),2);
      ret:=array();
      for i:=0 to length(stocks)-1 do
      begin
        setsysparam(pn_stock(),stocks[i]);
        ret[i,'StockID']:=stocks[i];
        ret[i,'time']:=datetimetostr(rd(-1));
        ret[i,'name']:=rd(1);
        ret[i,'open']:=rd(2);
        ret[i,'yclose']:=rd(3);
        ret[i,'high']:=rd(4);
        ret[i,'low']:=rd(5);
        ret[i,'price']:=rd(6);
        ret[i,'amount']:=rd(9);
      end
      t:=exportjsonstring(ret);
      return t;
    '''
    t=datetime.now()
    while t.time()<=datetime(2000,1,1,15,00,00).time():
      data=ts.RemoteExecute(tsstr,{})[1]
      df=pd.DataFrame(json.loads(data))
      df.to_excel(path + t.strftime("%Y%m%d%H%M%S") + ".xlsx")
      print(path + t.strftime("%Y%m%d%H%M%S") + ".xlsx"," 导出成功")
      time.sleep(3)
      t=datetime.now()
    ts.Disconnect()
    执行结果:本地导出基本面与行情数据文件

    范例二:使用TSLPy盘后下载期权基本面及行情数据
    from datetime import datetime
    import pandas as pd
    import json
    import sys
    import TSLPy3 as ts

    path="C:/Users/86152/Desktop/download/"
    sys.path.append("C:\Program Files\Tinysoft\Analyse.NET")
    ts.DefaultConnectAndLogin("wh_server")#远程登录,用自己配置的别名

    tsstr='''
      stocks:=getbk("上市期权");
      data:=select * from infotable 720 of stocks where ["截止日"]=datetoint(today()) end;
      t:=exportjsonstring(data);
      return t;
    '''
    data=ts.RemoteExecute(tsstr,{})[1]
    df=pd.DataFrame(json.loads(data))
    t=datetime.now()
    df.to_excel(path + "期权基本信息" + t.strftime("%Y%m%d") + ".xlsx")

    tsstr='''
      stocks:=getbk("上市期权");
      data:=select * from infotable 720 of stocks where ["截止日"]=datetoint(today()) end;
      t:=exportjsonstring(data);
      return t;
    '''
    data=ts.RemoteExecute(tsstr,{})[1]
    df=pd.DataFrame(json.loads(data))
    df.to_excel(path + "期权行情" + t.strftime("%Y%m%d") + ".xlsx")
    ts.Disconnect()

    执行结果:本地导出实时行情数据文件

    pyTSL使用范例
    参考:FAQ:天软pyTSL接口
    范例三:使用pyTSL盘中获取实盘行情数据
    import time
    from datetime import datetime
    import pandas as pd
    import pyTSL

    path="C:/Users/86152/Desktop/download/"
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    c.login()
    tsstr='''
      stocks:=getbk('A股');
      setsysparam(PN_Precision(),2);
      ret:=array();
      for i:=0 to length(stocks)-1 do
      begin
        setsysparam(pn_stock(),stocks[i]);
        ret[i,'StockID']:=stocks[i];
        ret[i,'time']:=datetimetostr(rd(-1));
        ret[i,'name']:=rd(1);
        ret[i,'open']:=rd(2);
        ret[i,'yclose']:=rd(3);
        ret[i,'high']:=rd(4);
        ret[i,'low']:=rd(5);
        ret[i,'price']:=rd(6);
        ret[i,'amount']:=rd(9);
      end
      return ret;
    '''
    t=datetime.now()
    while t.time()<=datetime(2000,1,1,15,00,00).time():
      r=c.exec(tsstr)
      df=r.dataframe()
      df.to_excel(path + t.strftime("%Y%m%d%H%M%S") + ".xlsx")
      print(path + t.strftime("%Y%m%d%H%M%S") + ".xlsx"," 导出成功")
      time.sleep(3)
      t=datetime.now()
    c.logout()

    执行结果:本地导出实时行情数据文件

    范例四:使用pyTSL盘后下载期权基本面及行情数据
    from datetime import datetime
    import pandas as pd
    import pyTSL

    path="C:/Users/86152/Desktop/download/"
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    c.login()

    tsstr='''
      stocks:=getbk("上市期权");
      data:=select * from infotable 720 of stocks where ["截止日"]=datetoint(today()) end;
      return data;
    '''
    r=c.exec(tsstr)
    df = r.dataframe()
    t=datetime.now()
    df.to_excel(path + "期权基本信息" + t.strftime("%Y%m%d") + ".xlsx")

    tsstr='''
      stocks:=getbk("上市期权");
      return select *,datetostr(["date"]) as "date"
          from markettable datekey today() to today() of stocks end;
    '''
    r=c.exec(tsstr)
    df = r.dataframe()
    t=datetime.now()
    df.to_excel(path + "期权行情" + t.strftime("%Y%m%d") + ".xlsx")

    c.logout()

    执行结果:本地导出基本面与行情数据文件


    ODBC使用范例(以python为例)
    参考:FAQ:2016-07-28-应用专题-第三方交互:对ODBC接口的使用方法和范例
    范例五:使用odbc盘中获取实盘行情数据
    import pandas as pd
    from datetime import datetime
    import time
    import pyodbc

    conn = pyodbc.connect("dsn=tsodbc")
    curs=conn.cursor()
    tsstr='''
      stocks:=getbk('A股');
      setsysparam(PN_Precision(),2);
      ret:=array();
      for i:=0 to length(stocks)-1 do
      begin
        setsysparam(pn_stock(),stocks[i]);
        ret[i,'StockID']:=stocks[i];
        ret[i,'time']:=datetimetostr(rd(-1));
        ret[i,'name']:=rd(1);
        ret[i,'open']:=rd(2);
        ret[i,'yclose']:=rd(3);
        ret[i,'high']:=rd(4);
        ret[i,'low']:=rd(5);
        ret[i,'price']:=rd(6);
        ret[i,'amount']:=rd(9);
      end
      return ret;
    '''
    path="C:/Users/86152/Desktop/download/"
    t=datetime.now()
    while t.time()<=datetime(2000,1,1,15,00,00).time():
      curs.execute(tsstr)
      rows=curs.fetchall()
      df = pd.DataFrame(rows)
      df.to_excel(path + t.strftime("%Y%m%d%H%M%S") + ".xlsx")
      time.sleep(3) #暂停3秒
      t=datetime.now()
    curs.close()
    conn.close()

    执行结果:本地导出多个行情文件


    范例六:使用odbc盘后下载期权基本面及行情数据
    from datetime import datetime
    import pandas as pd
    import pyodbc

    conn = pyodbc.connect("dsn=tsodbc")
    curs=conn.cursor()
    path="C:/Users/86152/Desktop/download/"
    t=datetime.now()

    tsstr='''
      stocks:=getbk("上市期权");
      data:=select * from infotable 720 of stocks where ["截止日"]=datetoint(today()) end;
      return data;
    '''
    curs.execute(tsstr)
    rows=curs.fetchall()
    df = pd.DataFrame(rows)

    df.to_excel(path + "期权基本信息" + t.strftime("%Y%m%d") + ".xlsx")

    tsstr='''
      stocks:=getbk("上市期权");
      return select *,datetostr(["date"]) as "date"
          from markettable datekey today() to today() of stocks end;
    '''
    curs.execute(tsstr)
    rows=curs.fetchall()
    df = pd.DataFrame(rows)
    df.to_excel(path + "期权行情" + t.strftime("%Y%m%d") + ".xlsx")
    curs.close()
    conn.close()

    执行结果:本地导出基本面与行情数据文件