搜档网
当前位置:搜档网 › 天软金融分析对matlab的支持

天软金融分析对matlab的支持

Tinysoft金融分析.NET对MATLAB的支持

1 配置天软与matlab的对接

第一步:打开TS平台,在系统—系统设置—信任中心,如图1-1,把安全性调至“最低安全性”。

第二步:在系统—系统设置—信任中心—打开文件信任配置文件,在配置文件里加入如下内容:

[Matlab config]

Enabled=1

图1-1 调整系统中心以及打开信任配置文件

第三步:在Tinysoft\https://www.sodocs.net/doc/062334939.html,\中,删除matlab.dll,然后把本机安装matlab 版本的对应dll(也在Tinysoft\https://www.sodocs.net/doc/062334939.html,\中),如matlab.dll.2009b复制为matlab.dll,建议使用安装版而不是解压版。

第四步:针对Matlab2009B和以后的版本。

在控制面板—系统—高级—环境变量—系统变量中找到path后,点击编辑。在已安装的地方,可以找到如下两条路径:(具体的信息由安装路径决定)C:\Program Files\MATLAB\R2009b\bin;

C:\Program Files\MATLAB\R2009b\runtime\win32;

这时需在“分号”后加入第3条路径:C:\Program Files\MATLAB\R2009b

\bin\win32各路径之间用半角分号;分隔(如图1-2),最后一条路径后面不需要分号。

第五步:重新登录天软平台,点击天软范例-与前端交互-远程调用MATLAB,

若显示如图1-3,则为调用成功。

图1-2 增加路径

图1-3 调用matlab成功时的输出

如果还有问题,请先删除Tinysoft\https://www.sodocs.net/doc/062334939.html,\中的“data”文件夹和以用户登录名命名的文件夹再登录天软平台。

2 错误处理

1、Matlab应该以管理员权限运行,否则报错如图1-4所示,应该设置matlab默认以管理员身份运行:右键-属性-兼容性,勾选“以管理员身份运行此程序”。

图1-4 matlab报错信息

2、这里建议32位TS客户端对应安装32位MATLAB,64位TS客户端对应安装64位MATLAB。有时也会出现一些问题导致对接配置不成功:安装有2个matlab,建议只安装1个matlab,同时安装另一个matlab之前卸载该matlab。

3、matlab调用天软报错:

Error using actxserver (line 91)

Server creation failed. Invalid ProgID 'TSExpert.CoExec'

这个问题是因为安全软件阻拦的缘故导致COMSERVER注册不成功,使得在EXCEL,Matlab等软件中无法调用到天软,请单击系统-系统设置里面的注册COM 服务进行COM注册(如图1-5所示).

图1-5 注册com服务

3 MATLAB中调用金融分析.NET

天软金融分析.NET支持MATLAB主要有两种方式,一种方式是在天软金融分析.NET中调用MATLAB,另外一种方法是在MATLAB中调用金融分析.NET。由于tinysoft标识符,不区分大小写,而MATLAB是区分大小写相关的,敬请注意大小写差异。

天软金融分析.NET提供了COM的访问方法,并且对MATLAB所支持的COM

调用做了特殊的支持。

第一步,先启动金融分析.NET客户端,并登录。

第二步,在MATLAB中利用COM方法创建金融分析.NET的COM对象。创建COM对象的方法:

>>ts=actxserver('TSExpert.CoExec')

第三步,利用COM对象的方法访问金融分析.NET。天软金融分析.NET COM 服务提供了两种访问方法:

2.1 RemoteExecute直接执行TSL语句

例如,假如要返回平安银行2012年8月30成交明细的最后三条,在TSL里为:

Return mselect SelectOpt(8) Drange(-3 to -1) * from tradetable datekey inttodate(20120830) to inttodate(20120830)+0.99 of "SZ000001" end;

那么在MATLAB中用如下方法返回内容:

>>ts.RemoteExecute('Return mselect SelectOpt(8) Drange(-3 to -1) * from tradetable datekey inttodate(20120830) to inttodate(20120830)+0.99 of "SZ000001" end;')

2.2 RemoteCallFunc调用TSL编写的函数

利用RemoteExecute虽然可以完成调用金融分析.NET的功能,但是很多已经编写成指标或者模型的函数,由于具备多个参数,如果要用RemoteExecute来调用,则要生成调用的参数串,调用起来不是很方便,使用RemoteCallFunc就方便多了。调用方式:

ts.RemoteCallFunc(‘函数名’,{函数参数列表})

例如:调用StockClose来取指定日的收盘价。

>> ts.SetSysParam('StockID','SZ000001') % ts.Stock = 'SZ000001'

>>ts.RemoteCallFunc('StockClose',{now()-693960})

注:MatLab的时间和TSL的时间(与EXCEL兼容)相差的常量为693960。

调用的系统参数设置方法

在TSL语言的设计中,为了更方便地使用,在不同的系统参数设置下,同一个函数可以有不同的表现。例如Close等股票相关的函数,和系统参数股票,时

间,周期,复权,复权基准日有关。在不同的周期系统参数下,既可以返回日线的,也可以返回分钟线的数据。如果不设置参数,默认的值为日线,当前日,不复权。

系统参数设置使用方法如下:

表2-1 系统参数设置使用方法

1.设置股票参数

>> ts.SetSysParam('StockID','SZ000001') % ts.Stock = 'SZ000001'

2.设置周期参数

>> ts.SetSysParam('Cycle','日线') %ts.SetSysParam('Cycle','日线')

可设置的周期值可以为:日线、周线、月线、季线、半年线、年线、1分钟线(1、2、3、5、10、15、20、30、40、60、120分钟线)

3.设置时间参数

>> ts.SetSysParam('CurrentDate',datenum(2011,5,2)-693960)

>> ts.Time = '2011-05-02 15:22:12' %字符串类型

4.设置复权参数

>> ts.SetSysParam('bRate',1) %ts.Rate = 1

参数的值可以为:0不复权、1比例复权、2分红送配复杂复权

5.设置复权基准日

>> ts.SetSysParam('RateDay',datenum(2011,5,2)-693960)

>> ts.RateDay = '2011-05-02'

参数的值可以为:0最后交易日,-1上市日,其他为指定日为MATLAB的时间-693960

6.设置NIL值在COM中的转换行为:

问题描述:由于Excel,Matlab,S-PLUS等多种统计软件对空类型的支持不尽相同,导致出现兼容性问题,无法用统一的转换类型来解决,现在通过增加一个

COM组件属性NilTrans来解决此问题,由用户自由选择转换的方法(表2-2)。

>>ts.SetSysParam('NilTrans',0); % ts.NilTrans=0

表2-2 Nil转换方法

元胞数组到矩阵的转换方法

从金融分析.NET返回到MATLAB的数据类型为元胞数组,有些方法可能仅仅只支持矩阵,如何转换元胞数组到矩阵呢?例如:

>>a=ts.RemoteExecute('Return mselect SelectOpt(8) Drange(-3 to -1) ["close"],["vol"],["high"] from tradetable datekey inttodate(20120830) to inttodate(20120830)+0.99 of "SZ000001" end;')

这样返回了一个N行3列的元胞数组到变量a.

>> b = cell2mat(a)

这样就把元胞数组转换成了矩阵。在使用cell2mat时,其待转化的元胞数组所有元素要不全为实数,要不全为整数。当其处理的元胞数组中存在多种数据类型的元素时,则会报错,无法转化。

4 金融分析.NET中调用MATLAB函数

金融分析.NET不仅支持引擎支持的方法来支持matlab调用,而且支持通过在服务器后台配置的方法来支持MATLAB编译出来的函数提供调用。这里我们建议各位使用前一种方法。

无论哪种调用,均依赖系统提供的matlab.dll动态库来支持,该动态库和安装到的MATLAB的版本有关系,每一个安装的版本的MATLAB,我们均提供一个对应的DLL来进行支持,配置在第一节的第三步。

3.1 引擎支持调用方法

主要通过三个函数来实现,运行过程如果打开一个引擎窗口,请注意不要关闭。

MputVar:设置一个MATLAB的变量的值。

MEVal:执行MatLab的字符串。

MgetVar:获得一个MATLAB的变量的值。

例如天软范例-与前端交互-远程调用MatLab范例2中的例子:

Function DoLocalMatlabPlus(A,B);

Begin

mPutVar("A",A);

mPutVar("B",B);

mEval("C=A+B");

return mGetVar("C");

End;

return rdo2 DoLocalMatlabPlus(4,5);

即可得到结果9。

我们提供的引擎支持,还有以下函数:

MgetBuf:返回MATLAB引擎的警告或者错误信息。

Mclose:关闭MATLAB引擎窗口。

MsetVisible:设置MATLAB引擎是否可视。

MgetVisible:得到MATLAB引擎是否可视信息。

3.2 调用matlab 动态库中的函数

无论是用户自己编写的,函数现有的TOOLBOX函数,在MATLAB中都是以.m 文件存在的,这些m文件matlab提供了编译成DLL的方法:

假定当前目录为E:\10数学分析软件的学习与交互\matlab\work下:

在该目录下建立函数:

function ssum= msum(a,b,c)

ssum = a+b+c;

end

function smin = mmin(a,b,c)

smin = min(min(a,b),c);

end

在命令窗口输入

>> mcc -W lib:myfunction -T link:lib msum mmin

可以将msum、mmin函数编译成myfunction.dll,假如要编译更多的TOOLBOX 函数或者自己编写的M函数,只要在命令行内添加就可以了。编译完成后在当前目录下会得到myfunction.dll (由lib: myfunction指定的)。

在\Tinysoft\bin\plugin\Filemgr.ini文件中添加配置语句:

[MatLab Config]

permit=msum;mmin

Enabled=1

[matlab:msum]

Lib=E:\10数学分析软件的学习与交互\matlab\work\myfunction.dll

name=mlxMsum

[matlab:mmin]

Lib=E:\10数学分析软件的学习与交互\matlab\work\myfunction.dll

name=mlxMmin

配置完之后,我们就可以直接使用mdo以及mdo2调用。

如果返回的参数只有一个,则调用的方法为ret:=mdo(‘Matlab函数名’,调用参数1..调用参数N)。

如果返回的参数超过一个,则调用的方法为mdo2(‘Matlab函数名’,返回的参数个数,返回的参数1..返回的参数N,调用参数1..调用参数N)。

return rdo2 mdo('mmin',2,3,4); //或

rdo2 mdo2('msum',1,ret,2,3,4);

return ret;

5 交互效率说明

由于COM交互以及通讯所需花费的时间比较长,在MATLAB里调用金融分析.NET的速度,在1秒钟内只能调用<100次,如果在广域网内,调用次数每秒<10次。

而在金融分析.NET中调用MATLAB的函数,由于所有访问交互操作均在服务器上,每秒调用的速度可以达到成千上万次以上。

为了增加计算的速度,无论采用哪种方法,都应该在开发设计上以调用次数最少为优。例如,在MATLAB中调用金融分析.NET,不推荐一次访问一个很小的

数据,而推荐利用金融分析.NET建模,数据中间处理过程可以由金融分析.NET 来完成,一次返回一个计算值或者比较多的内容供MATLAB使用,以求减少交互次数。反之用金融分析.NET调用MATLAB也一样。

相关主题