说明:
在获取行情大数据时有时会发现电脑卡顿甚至死机的情况,需要合理分批导出数据到本地。下载说明请参考:FAQ:
Q:如何合理下载大量高频行情数据?
有时在与python交互时也需要实现这样的需求,请参考以下使用范例。注:导入数据与导出同理,可参考代码仿写。
FAQ:
天软pyTSL接口
FAQ:
2019-05-08-应用专题-第三方交互07:天软平台和PYTHON的交互
FAQ:
Q:python中如何将数组类型的参数传入天软函数中执行?
pytsl交互分批导出数据:可通过register_proc与Batch模型实现
范例1:call模型获取天软数据(register_proc)
#把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
import pandas as pd
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
if c.login() == 0:
print(c.last_error())
else:
def rdo(df,name):
#本地路径+文件名(这里用代码)
path="C:/Users/86152/Desktop/"+name+".xlsx"
df= pd.DataFrame(df)
df.to_excel(path)
return 1
pyTSL.register_proc("a",rdo)
test = '''
function get_value(stocks,begt,endt);
begin
for i in stocks do
begin
stock:=stocks[i];
t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
from Markettable datekey inttodate(begt) to inttodate(endt) of stock end;
rdo2 a(t,stock);
end
return array("执行完成");
end;
'''
stocks = ['SH600000','SH600004','SH600006','SH600007']
#获取开始日至截止日分钟线行情
r = c.call('get_value', stocks, 20210701,20210705 , code=test,cycle="1分钟线")
if r.error():
print(r.message())
else:
print(r.value())
c.logout()#退出登录
#执行完成 在本地路径下分别有序导出四个代码的行情数据表
范例2:call模型获取天软数据(Batch(消耗多个并发资源并发运行,效率更高))
#把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
import pandas as pd
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
if c.login() == 0:
print(c.last_error())
else:
test = '''
function get_value(stock,begt,endt);
begin
t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
from Markettable datekey inttodate(begt) to inttodate(endt) of stock end;
return t;
end;
'''
batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
stocks = ['SH600000','SH600004','SH600006','SH600007']
#获取开始日至截止日分钟线行情
for s in stocks:
r = batch.call(c, "get_value", s, 20210701, 20210705, code=test, cycle="1分钟线", key=s)
it = iter(batch)
for r in it:
path = "C:/Users/86152/Desktop/" + r.key() + ".xlsx"
df = pd.DataFrame(r.value())
df.to_excel(path)
print("执行完成!")
#执行完成 在本地路径下分别有序导出四个代码的行情数据表
范例3:exec模型获取天软数据
#把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
import pandas as pd
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
if c.login() == 0:
print(c.last_error())
else:
def rdo(df,name):
#本地路径+文件名(这里用代码)
path="C:/Users/86152/Desktop/"+name+".xlsx"
df= pd.DataFrame(df)
df.to_excel(path)
return 1
pyTSL.register_proc("a",rdo)
test = '''
stocks:=array("SH600000","SH600004","SH600006","SH600007");
for i in stocks do
begin
stock:=stocks[i];
t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
rdo2 a(t,stock);
end
return array("执行完成");
'''
#通过天软代码获取分钟线行情
r=c.exec(test,cycle="1分钟线")
if r.error():
print(r.message())
else:
print(r.dataframe())
c.logout()#退出登录
#执行完成 在本地路径下分别有序导出四个代码的行情数据表
范例4:query逐个代码导出A股一年的分钟线行情数据
import pyTSL
import datetime
import pandas as pd
from tqdm import tqdm
import os
# 连接登录天软服务器
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
if c.login() != 1:
print(c.last_error())
else:
# 获取A股所有股票列表
r = c.call("GetAbkbyDate", "A股", datetime.date(2024, 12, 1))
if r.error():
print(r.message())
else:
stocks = r.value()
print(f"共获取到 {len(stocks)} 只A股股票")
# 创建保存目录
save_dir = "D:/数据集合/A股分钟线行情/"
if not os.path.exists(save_dir):
os.makedirs(save_dir)
print(f"已创建目录: {save_dir}")
# 设置查询日期范围(获取2024年12月1日至12月10日的1分钟线数据)
begt = datetime.datetime(2024, 12, 1)
endt = datetime.datetime(2024, 12, 31)
# 设置并发数-不重连方式
batch = pyTSL.Batch(3) # 账号一般并发数是5个,用户可根据情况调整
# 提交并发查询任务
for s in stocks:
task = batch.query(c,
stock=s,
cycle="1分钟线",
begin_time=begt,
end_time=endt,
# fields='StockID,StockName,date,open,high,low,close,vol,amount',
key=f"{s}_{begt.strftime('%Y%m%d')}_{endt.strftime('%Y%m%d')}")
if task[0] == 0:
print(f"任务提交失败: {task[1]}")
# 处理并发结果并保存到本地
for result in tqdm(iter(batch), total=len(stocks), desc="下载进度"):
if not result.error():
# 构建保存路径
filename = f"{save_dir}{result.key()}.csv"
# 转换为DataFrame并保存为CSV文件
df = pd.DataFrame(result.value())
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"已保存: {filename}")
else:
print(f"{result.key()} 下载失败: {result.message()}")
print("全部数据下载完成!")
# 断开连接
c.logout()
范例5:pyTSL交互分批导出数据:按股票代码导出财报数据(资产负债表)
import pandas as pd
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
c.login()
if c.login() == 0:
print(c.last_error())
else:
test = '''
function get_data(stocks);
begin
path:="C:/Users/chent/Desktop/资产负债表/";//导出路径
SetSysParam(pn_reportmode(),-1);//返回调整前后的所有数据
rt:=array();
for i,stock in stocks do
begin
if i % 500 = 0 then echo i$"_"$stock;
t:= select * from infotable 44 of stock end;
ret:=rdo2 ExportFile(ftXLS(),"",path+stock+".xlsx",t);
if ret then
v:="导出成功";
else
v:="导出失败";
rt[i,"stock"]:=stock;
rt[i,"取数结果"]:=v;
end
return rt;
end;
'''
stocks = c.exec("return getbk('上证50');").value()
#获取资产负责表数据
r = c.call('get_data', stocks , code=test)
if r.error():
print(r.message())
else:
print(r.dataframe())
c.logout()#退出登录
#执行完成 在本地路径下分别有序导出指定代码列表所有的代码的资产负债表数据
TSLpy交互分批导出数据:直接调用天软代码即可
范例6:RemoteExecute执行天软语句
# 把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软python交互文档
import TSLPy3 as ts
import sys
sys.path.append("C:/Program Files/Tinysoft/Analyse.NET")
#导出路径
path="C:/Users/86152/Desktop/"
test = '''
stocks:=array("SH600000","SH600004","SH600006","SH600007");
for i in stocks do
begin
stock:=stocks[i];
t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
rdo2 exportfile(ftxls(),"","%s"+stock+".xlsx",t);
end
return "执行完成";
'''%(path)
#通过天软代码获取行情
data=ts.RemoteExecute(test, {"Cycle" : "5秒线"})
if not data[0]:
print(data[1])
else:
print(data[0],data[2].decode("gbk"))
范例7:RemoteCallFunc调用天软函数
封装天软函数:
Function download_testdata(stocks,path);
Begin
{
stocks: 一维字符串数组 证券列表
path: string 导出路径
}
for i in stocks do
begin
stock:=stocks[i];
t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
pathname:=path+stock+".xlsx";
rdo2 exportfile(ftxls(),"",pathname,t);
end
return "执行完成";
End;
python代码:
import TSLPy3 as ts
import sys
sys.path.append("C:/Program Files/Tinysoft/Analyse.NET")
#导出路径
path="C:/Users/86152/Desktop/"
stocks=["SH600000","SH600004","SH600006","SH600007"]
#通过天软函数获取行情
data=ts.RemoteCallFunc("download_testdata",[stocks,path], {"Cycle" : "5秒线"})
if not data[0]:
print(data[1])
else:
print(data[0],data[2].decode("gbk"))
#执行完成 在本地路径下分别导出四个代码的行情数据表
范例8:TSLPy交互分批导出数据:按股票代码导出财报数据(资产负债表)
import TSLPy3 as ts
import sys
sys.path.append("C:/Program Files/Tinysoft/Analyse.NET")
#导出路径
path="C:/Users/86152/Desktop/"
test = '''
stocks:=array("SH600000","SH600004","SH600006","SH600007");
for i in stocks do
begin
stock:=stocks[i];
t:= select * from infotable 44 of stock end;
rdo2 exportfile(ftxls(),"","%s"+stock+".xlsx",t);
end
return "执行完成";
'''%(path)
#通过天软代码获取行情
data=ts.RemoteExecute(test, {})
if not data[0]:
print(data[1])
else:
print(data[0],data[2].decode("gbk"))
#执行完成 在本地路径下分别导出四个代码的资产负债表数据