天软金融分析平台及TSL语言培训大纲.docx
- 文档编号:10305333
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:28
- 大小:30.29KB
天软金融分析平台及TSL语言培训大纲.docx
《天软金融分析平台及TSL语言培训大纲.docx》由会员分享,可在线阅读,更多相关《天软金融分析平台及TSL语言培训大纲.docx(28页珍藏版)》请在冰点文库上搜索。
天软金融分析平台及TSL语言培训大纲
天软金融分析平台及TSL语言培训大纲
建立模型从创建函数开始
什么是TSL语言执行的开始?
Pascal有Program,C语言有Main函数,TSL语言没有这些限制,TSL语言可以从任何一个函数开始执行,所以任何函数都可以成为一个应用或者模型。
怎么开始编写函数
在管理器中建立函数分类以及函数,无论函数目录是什么,建立的这些函数都是全局函数,可以被任何其他函数所直接调用,而不需要引入,因此在这里边建立的函数均不能同名。
在全局函数体里还可以自己添加新的函数,这些函数的包括头部信息,参数信息均由用户自己写。
这些函数允许重名,但是只可在当前的函数体内调用,属于局部函数。
函数添加参数
建立的函数无法直接增加参数,需要使用函数编辑器中的右端功能来添加参数。
函数的参数类型
简单类型,如整数,实数,字符串,布尔型,各种数组等。
其他有些特殊类型大多实际是一种简单类型,只是和业务相关,例如市场板块,证券,用户数据等均为字符串类型。
市场板块的参数类型,并不代表市场板块里的股票,而只是表示版块名这个字符串。
其他的类似的数据类型也是如此。
报告期数据类型,是一个整数类型,例如整数20081231是2008年年报。
用户自定义类型,是一种最特殊的数据类型。
由显示的字符串和实际的值两个字段组成,是一个下拉组合框,显示的部分就是下拉框的显示内容,值可以是任何的简单类型,也可以是一个计算,也可以是一个函数调用。
理解天软的全局函数需要定义参数类型
为什么天软的全局函数需要定义参数类型,不能自己写?
参数的类型是为了不需要定义运行界面,可以直接根据参数的类型显示交互界面,局部函数以及类函数等不需要使用界面定义类型。
仅仅有且只有全局函数需用界面来定义参数类型。
函数的返回结果的显示
在平台上编写模型和指标,不需要开发输出界面,直接返回即可。
客户端会根据返回的数据类型显示,这些类型包括简单类型,也包括数组,同时也包括TSL支持的图形类型数据。
此外,利用结果显示的图形功能,可以利用数组类型结果做出折线,柱状,散点图等等图形,支持双轴图,也支持混合图形等。
理解我们的客户端结果类型里的研究功能,所有的结果数据处理的功能均由TSL扩展而成,用户均可以扩展。
如何更快速地进行函数编辑以及查阅函数
在黑体的函数名上点鼠标右键,可以查看源代码。
可以敲入要引用的函数名的前几个字母,然后连续按下两次CTRL,可以自动查找出所有以此开头的所有的函数。
在系统函数的黑体上或者其他关键字上,点击F1键可以获得语言帮助。
语言
语言的简述
语言是类Objectpascal的语言,也就是说,在语法上与pascal有最大的相似度,面向对象的方面与Objectpascal很类似。
语言具备return,?
表达式,++,--等类C语言语法。
语言具备表达式类型等脚本语言特性,可以利用eval等函数对表达式进行求值运算。
语言内置了类SQL的语法支持,可支持对数组结构、天软数据仓库、以及外部数据库进行查询以及其他处理,熟悉SQL语法的用户也可以很容易使用,而且TSL类SQL语法和TSL语法是融为一体的,可以调用TSL的所有函数,还支持时间序列等金融分析所必需具备的功能。
语言内置支持COM,可以很容易和其他支持COM的软件打交道。
语言支持WEB开发。
语言支持WORD模板开发。
语言具备对EXCELVBA的支持,同时支持MATLAB等其他软件。
语言支持WEBSERVICE,对.NET以及J2EE等应用开发提供支持。
数据类型为弱类型,每个变量的数据类型运行时相关。
语言一些特点
变量不需要事先声明
变量的名称大小写无关
赋值语句为:
=,在TSL语言中=仅仅只是作为条件判断,类似于C语言中的==。
语句要以;结尾
语句段以beginend封装
函数的返回
返回使用return,函数返回结果只可返回一个结果,不像MATLAB®可以同时返回多个,但可以使用变参的方式返回多个内容,也可以利用数组来打包多个结果的返回。
注释
采用{}(**)或者单行注释//
由于支持(**),所以TSL语言支持的类SQL语法中的类似于SQL的count(*)的countof(*)不能直接这么写,而要在(和*之间用空格隔开,例如countof(*)。
运算符
算术运算符
运算符
运算
运算对象
结果类型
+
加,正号,可为一元或者二元运算符
整型、实型、字符串
只要有一个运算对象是实型,结果就是实型,如果全部的运算对象都是整型并且运算不是除法,则结果为整型,若运算是除法,则结果是实型
-
减,负号,可为一元或者二元运算符
整型、实型
*
乘
整型、实型
/
除
整型、实型
%,Mod
取余
整型
整型
Div
除取整
整型、实型
整型
++
加1,一元运算符
实型
实型
--
减1,一元运算符
实型
实型
逻辑运算符
运算符
运算
运算对象
结果类型
Not
逻辑非,一元运算符
布尔型
布尔型
And
逻辑与
布尔型
布尔型
Or
逻辑或
布尔型
布尔型
关系运算符
运算符
运算
运算对象
结果类型
=
等于
简单类型
布尔型
<>
不等于
简单类型
布尔型
<
小于
简单类型
布尔型
>
大于
简单类型
布尔型
<=
小于等于
简单类型
布尔型
>=
大于等于
简单类型
布尔型
IN
存在于判断
左边简单类型,右边是数组类型
布尔型
LIKE
模式匹配判断,使用的是正则表达式
字符串
布尔型
?
判断求值
Boolean类型
任意类型
理解IN操作符
例如:
InArray:
=array(3,5,6,9);
Return5inInArray;
判断5是否在InArray中。
使用方法为:
IN操作符是判断一个数据是否存在在数组中。
注:
在TSL中,没有集合的数据类型,所以使用数组类型承担类似于集合的功能。
理解LIKE操作符
我们的LIKE语法和SQL的LIKE语法不同,LIKE的对象是正则表达式。
例如:
S:
=”a12345dd”;
S1:
=”12345dd1”;
Returnarray(slike“1234”,slike“45dd$”,s1like“45dd$”,slike“^1234”,s1like“^1234”);
关于正则表达式,我们可以参阅语言帮助中的正则表达式。
数据类型
虽然TSL是弱类型语言,每个变量的类型都是运行时相关。
但是语言的运算并不支持不同类型的混合运算。
例如有的语言字符串类型和数字可以相加。
TSL主要是为了严谨,要求用户必须把字符串转换为数字后再和数字相加。
时间类型
日期型,TSL语言中并没有单独的日期类型,日期型只是一种特定的表示方法,其本质是实数。
整数部分表示自从1899年12月30日以来经历的天数,小数部分表示一天中均匀的分割24小时的时间所形成的时间。
例如:
0表示1899年12月30日0:
00
2.75表示1900年1月1日下午6:
00
-1.25表示1899年12月29日6:
00
注:
Excel、SQLSERVER中的日期也采用与TSL语言相同的日期类型,而MATLAB中的日期和TSL中的日期相差一个常量693960,因为MATLAB的日期是从公元开始以来的天数。
常用转换日期
StrToDate
DateToStr
DateTimeToStr
IntToDate
DateToInt
数组类型
TSL的数组类型不同于MATLAB,MATLAB没有一维数组的概念,向量本身也是矩阵。
但是TSL得数组不同,可以理解二维数组(矩阵)仅仅只是一个每个下标的值都是一维数组的数组。
所以一维数组和一个二维一列的数组是完全不一样的,TSL中的很多函数支持的是一维数组,例如平均值Mean,求和Sum等,如果采用二维一列的数组就会出错。
TSL语言的数组与大多数其他语言也不相同,TSL语言的数组的维度不需要预先定义,也不需要预先分配大小,并且TSL得数组可以使用字符串作为下标。
使用字符串下标的数组可以很容易描述可以理解的内容数据,例如描述一张字段含义很明确的数据表。
并且很方便作为需要显示的结果的返回。
数组在使用前必须初始化,或者是空数组,或者可以直接赋初值,数据初始值的设定的时候是以array(Index:
Value,..IndexN:
ValueN)的方式,但是当下标为0递增的数组的时候,下标可以省略。
多维数组的时候,下标内容的本身为数组,这个数组的array前缀可以省略,但是由此会带来一定的二义性问题。
Arr:
=array();//空数组
一维数组:
Arr:
=array(1,2,3,4);//为一个一维数组,内容为1,2,3,4
Arr:
=array(0:
1,1:
2,2:
3,3:
4);//是一样等同的
Arr:
=array(“LLL”:
1,”KKK”:
2);//为一维字符串下标数组
二维数组:
默认的数字下标模式:
Arr:
=array((1,2,3),(4,5,6),(7,8,9));
等同于:
Arr:
=array(array(1,2,3),array(4,5,6),array(7,8,9));
数组初始化支持函数调用以及计算。
例如:
Arr:
=array(1+2,3,4,Random());
数组的二义性问题
Arr:
=array((1+2)*3,3,4);
由于我们可以省略二维的array,那么array((中的第二个括号会被认为是二维数组的开始,所以结果语法检查不通过,这种问题的解决办法:
采用array(+(1+2)*3,3,4)就可以了。
类SQL语法
Select
和SQL中的Select语法不同,由于要兼容TSL语法,所以SELECT是以End作为结尾,Select中可以使用任何TSL的函数,Select的默认返回模式为一个二维数组。
Select支持orderby,groupbyhaving,join等语法。
字段名必须用[],而且由于TSL支持数字字段和字符串字段,所以[]内可以是任何返回为数字或者是字符串的表达式。
但是在使用JOIN有多表的时候要使用[1].[]的模式来访问指定的表,而不是使用“表名.字段”的模式。
DRANGE,SELECT中返回的范围
TSL类SQL语法不存在TOPN这种语法,但是支持更复杂的写法:
Drange(BeginIndextoEndindex)
例如:
A:
=array();
Fori:
=0to999do
A[i][“ABCD”]:
=i;
ReturnSelectDrange(10to99)*fromAend;
返回序号为10到99的数据。
如果要返回的数据在后边的10条,那么
ReturnSelectDrange(-10to-1)*fromAend;
也就是说DRANGE里的范围为负数表示如下:
-1为最后一条数据,-10是倒数第十条数据。
Drange(RankofN)
TSL的DRANGE还支持更复杂的支持OF语法:
ReturnSelectDrange(1of10)*fromAend;
这就是返回10等分中的第一等分部分。
TSL中的字段
例如a:
=”abcd”;
[a]表示字段abcd,也可以采用[“abcd”],是一样的含义。
Select[a]fromTableend;//表示返回列abcd而不是列a
同样[0]表示数字字段0;
A:
=array();
Fori:
=0to999do
A[i][“ABCD”]:
=Random();
B:
=Select*fromAwhere[“ABCD”]>0.5orderby[“ABCD”]end;
ReturnB;
JOIN
A:
=Array();
B:
=array();
Fori:
=0to99do
begin
A[i][“ABCD”]:
=Random();
A[i][“INDEX”]:
=i;
B[i][“ABCD”]:
=random();
B[i][“INDEX”]:
=i;
End;
ReturnSelect*fromAjoinBOn[1].[“INDEX”]=[2].[“INDEX”]end;
WITHON
一个On运算符在JOIN的时候的计算复杂度为两个运算的表的元素个数相差,是一个N*M的复杂度。
事实上,绝大多数JOIN是可以优化的。
我们TSL里支持WITHON语法,使得计算复杂度降低到N+M的关系。
ReturnReturnSelect*fromAJoinBwith([1].[“INDEX”]On[2].[“INDEX”])end;
倘若有多个字段需要相等,那么把ON左边以及右边的多个表达式用逗号分隔开来。
例如:
ReturnReturnSelect*fromAJoinBwith([1].[“INDEX”],[1].[“ABCD”]On[2].[“INDEX”],[2].[“ABCD”])end;
SSelect
SSelect返回一个一维数组,例如只返回其中一列而且要一个一维向量。
这在很多使用的时候非常有用,例如sselect[“ABCD”]fromAend;
VSelect
VSelect返回单个值,主要用于如SumOf,CountOf这类统计中。
例如cnt:
=Vselectcountof(*)fromaend;
聚集函数
为了防止和TSL其他函数产生冲突,聚集函数一般都以OF结尾,例如平均值是AVGOF,求和是SumOf。
聚集函数支持条件聚集,并且支持序列化,例如移动平均。
例如:
A:
=array();
Fori:
=0to999do
begin
A[i][“KKK”]:
=Random();
End;
ReturnSelectAVGOf([“KKK”],True,60)fromAEnd;
以上是得到的是60个的移动平均值。
ReturnSelectAVGOF([“KKK”],[“KKK”]>0.5),AVGOF([“KKK”],[“KKK”]<=0.5)FromAend;
同时得到>0.5的平均数以及<=0.5的平均数。
ReturnSelectAVGOF([“KKK”],[“KKK”]>0.5,10),AVGOF([“KKK”],[“KKK”]<=0.5,10)FromAend;
同时得到>0.5的10个移动平均数以及<=0.5的10个移动平均数。
内置的聚集函数有包括统计标准偏差等统计功能,可以在帮助中的聚集函数部分来查阅。
扩展聚集函数
我们没有累乘的聚集函数,但是假如我们需要使用,一个办法当然就是直接用循环来乘,另外还有一种方法,就是例如AGGOF来扩展聚集函数。
AGGOf(name_str,[DISTINCT]expression[,BoolConditionExp[,N]] )的定义方式,和AVGOF聚集函数相比,就是多了一个字符串参数,就是扩展的聚集函数名。
A:
=array();
Fori:
=0to9do
A[i][“KKK”]:
=I;
ReturnSelectAGGOF(“AggSumSample”,[“KKK”])fromAend;
FunctionAggSumSample(Flag,Value);
begin
ifFLag=0then
begin
SysParams["SumSample"]:
=1;
returntrue;
end
elseifFlag=1then
begin
SysParams["SumSample"]:
=SysParams["SumSample"]*Value;
returntrue;
end
else
returnSysParams["SumSample"];
end;
Update
一维数组采用Set[ThisRow]=Value,其他的Set[“ABCD”]=Value
UpdateArrset[ThisRow]=0whereifnil(ThisRow)end;
Delete
Insert
Insert可以单条插入,也可以选择批量插入。
InsertFields
ThisRow,ThisIndex
对一维数组需要使用ThisRow来访问其内容,ThisIndex返回的是其原始序号,例如排序前的原始序号。
假如使用Join语法利用ThisRow
(2)访问第二张表的内容,而ThisIndex
(2)表示第二张表的当前索引号。
类SQL语法的特殊用途案例
利用insert进行数组加法运算(该功能可实现对数据库批量插入)
利用update实现类似于.+和.*运算。
利用selectjoin实现两个一维向量组成一个二维矩阵。
异常处理以及调错
Try
A:
=array();
B:
=A+1;
Except
B:
=1;//异常后执行的代码
End;
Try
Try
A:
=array();
B:
=A+1;
Finally
A:
=999;
End;
Except
End;
Raise
DebugReturn
在任何地方,可以用DebugReturn可以直接返回任何内容。
数据提取
数据提取可以采用函数,也可以采用类SQL语法,一般简单提取建议采用函数,效率会相对高一些。
而且,如果要讲求效率,如果有大规模数据提取,最佳的方式是不要把数据取出来进行运算,而是直接利用语言里提供的计算功能,例如求平均数,求和,求最大值,求最小值,以及方差等等。
系统参数的含义
传统的函数的方法一般是如此的:
例如,收盘价函数,假定函数名为close,那么传统的收盘价的调用模式是close(StockId,DataDate);这样的模式。
由于有可能需要复权的收盘价,并且复权的基准日还可能需要被指定,那么,函数就变为下列模式:
Close(StockId,Date,Rate,BaseDay);
由于收盘价还可能和周期有关,例如要取的是某一分钟的收盘,那么函数就是:
Close(Stockid,Date,Rate,RateDay,Cycle)的模式。
而且,往往由于我们不仅仅只需要取收盘价,而且往往我们还需要取最高价,成交量等其他数据,例如我们要计算收盘价乘以成交量,那么我们在调用的时候可能就成了:
Close(StockId,Date,Rate,BaseDay,Cycle)*Vol(StockId,Date,Rate,BaseDay,Cycle)的模式。
假定我们修改其中一个参数,例如我们还要取不同时间的这个值,我们不得不再将所有的参数都送进去。
这个方式就是传统的参数方法。
TSL语言中提取数据抛弃了这种传统方法,可能在刚开始使用的时候会有些不习惯,但是如果习惯了,提取数据会显得非常方便。
TSL语言中提供了很多默认的“系统参数”,这些系统参数你可以理解为全局变量。
有很多系统内置的数据提取函数利用这些全局变量来决定函数的行为。
这些全局变量有其初始的默认值,例如,周期默认为日,复权方法默认为不复权,复权基准日默认为最后一个交易日。
这些全局变量性质的系统参数我们用字符串来取名。
提供了两个函数来设置或者取这些全局变量的值。
我们不仅仅有很多默认的全局变量,用户自己也可以在程序中利用这个功能起到全局变量的效果(这样不用不断地给函数增加用户参数,使得不仅仅要修改函数的定义,还要修改调用的代码)。
设置系统参数和获取系统参数的函数名是SetSysParam和GetSysParam。
定义为:
SetSysParam(ParamName:
String;Value:
Any);
GetSysParam(ParamName:
String):
Any;
没有设置过的非系统默认的参数,取出的结果是nil。
我们为了容易记忆这些默认的系统参数的名称,所以内建了一些函数来返回系统参数的名称。
系统参数的参数名称函数:
pn_stock()
Pn_date()
Pn_cycle()
Pn_rate()
Pn_RateDay
使用方法:
例如,设置当前证券代码为深万科,则:
SetSysParam(pn_stock(),”SZ000002”);
SetSysParam(pn_date(),inttodate(20081231));
C:
=Close();
这样就是取深万科的2008年12月三十一日的收盘价。
理解当前时间系统参数
例如:
SetSysParam(pn_stock(),”SZ000002”);
SetSysParam(pn_date(),inttodate(20090101));
C:
=Close();
H:
=High();
V:
=Vol();
T:
=DateToStr(GetSysParam(pn_date()));
T1:
=DateToStr(SP_Time
(1));
Returnarray(C,H,V,T,T1);
由于2009年1月1日布什交易日,那么收盘价取的是谁呢?
收盘价就是其上一个交易日的收盘价,最高价最低价,开盘价都与这个收盘价相同,成交量和成交金额则为0.这些是系统自动处理的。
在GetSysParam(pn_date())的时候获得当前的系统参数时间,得到的是上一个交易日。
这是因为系统变量时间是会根据交易日进行推移的,不一定是你原来去设置的时间。
那么原来设置的时间用什么取呢?
SP_Time
(1)就返回了原始你的设置时间,SP_TIME()不带参数的行为等同于GetSysParam(pn_Date());
理解复权的系统参数
复权会影响价格和量,不影响金额,这是假定货币是无法复权的。
所以当价格变化的时候,成交量也就相应变化了,最终他们的变化权重是一个倒数关系。
SetSysParam(Pn_Rate(),1);//设置采用比例复权,也就是分红再投资复权模式。
这个第二个参数允许为0,1,2,3
分别为0:
不复权,也就是原始价格和量。
1:
是比例复权,表示分红再投资的复权模式,这种模式下分配的现金假定按照前日收盘价转换成为股票,这种模式无论复权基准日为什么,其收益率是不变的。
2:
是分红不投资带现金的复权,这种模式是假定现金就是现金,不转换为股票,这样的复权可能产生复权价为负数的结果。
3:
特殊复权模式,股改对价不复权模式,其余与1相同,只是股改不对价。
对于投资人而已,自己的收益回报事实上应该选择复权模式1,但是在特殊情况下选择3,因为在历史条件下某些政策将特殊投资人对投资的股票的年度涨幅有限制,涨幅不考虑股改对价。
SetSysParam(pn_RateDay(),IntToDate(20081231));//设置复权基准日为2008年12月31日。
第二个参数为复权基准日,但是有几个特殊取值,一个是0,表示用最后一个交易日的为基准日,一个是-1,表示用上市日首日价格为基准日。
周期的系统参数的支持
SetSysParam(pn_Cycle(),c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 金融 分析 平台 TSL 语言 培训 大纲