下书网

风险-收益分析:理性投资的理论与实践(第2卷)全文阅读

外国小说文学理论侦探推理惊悚悬疑传记回忆杂文随笔诗歌戏曲小故事
下书网 > 哲学心理 > 风险-收益分析:理性投资的理论与实践(第2卷)

当前的实践

书籍名:《风险-收益分析:理性投资的理论与实践(第2卷)》    作者:哈里·马科维茨
推荐阅读:风险-收益分析:理性投资的理论与实践(第2卷)txt下载 风险-收益分析:理性投资的理论与实践(第2卷)笔趣阁 风险-收益分析:理性投资的理论与实践(第2卷)顶点 风险-收益分析:理性投资的理论与实践(第2卷)快眼 风险-收益分析:理性投资的理论与实践(第2卷)sodu
上一章目录下一章
    《风险-收益分析:理性投资的理论与实践(第2卷)》当前的实践,页面无弹窗的全文阅读!



事实上,目前已经有复杂的高度并行的DSS。例子包括大型零售商如沃尔玛的电算化系统,它具有在销售终端记录销售交易、自动订购存货不足的商品,以及生成管理报告等特性。SIMSCRIPT M和基于SIMSCRIPT M的程序生成器的一个主要目标,是使这类企业级系统的生产变得更为容易。

目前,使用最广泛的企业级DSS生成器是SAP。根据冯·阿斯彭(von Aspen,2014)的著作,SAP企业级DSS生成器(我们这样称呼它)很难学习和使用。当然,人们可以基于JSSPG的实质,开发一个使用起来要容易一两个数量级的企业级DSS生成器。

至于DSS的编码,相对于生成DSS,目前尚不熟悉这通常是如何实现的读者,在使用关系数据库时,应通过互联网浏览器查询有关企业Java组件(Enterprise Java Beans,EJB)的介绍,以及这些组件是怎样协调Java程序和数据库的,然后将之与这里和之前引用的文献中介绍的IBM EAS-E程序及过程进行比较。相比前者,后者更简明易懂,这是显而易见的。



议程


接下来的几节继续第7章对SIMSCRIPTⅡ特性的讨论,包括对计划的第6层和第7层的讨论。这些也是SIMSCRIPT M的特性。然后,我将讨论在第6层的IBM EAS-E实现中解决的某些细节,包括使大型排序集的处理更为容易,以及修改正在运行的数据库同时又不中断操作的特性。

引言中的第(2)点提到了“有效执行”。在很大程度上,一个大型DSS(或市场模拟程序)的效率,取决于它利用现有和预计的计算系统并行处理机会的能力。除了一个简短的parting note外,最后几节一般性地讨论了并行处理,特别是面向事件的程序对其的运用。

第6层

SIMSCRIPT(Ⅰ)的本意是作为一种“模拟语言”。特别地,它的手册名为“SIMSCRIPT:一种模拟编程语言”。随着该语言的细节成形,它使创立者马科维茨、豪斯纳和卡尔感到,它的EAS和其他性能,对于各种类型的复杂编程都具有重要价值。因此,他们允许程序员在SIMSCRIPT(Ⅰ)程序的头部插入“非模拟”指令。这阻止了定时程序的插入,并且抑制了对一个或多个事件程序的需求。

直到SIMSCRIPTⅡ的规划处于设计阶段,当时大约是在1962年,伯尼·豪斯纳正用FORTRAN编写完成SIMSCRIPT(Ⅰ)预处理程序,赫布·卡尔正编写完成SIMSCRIPT(Ⅰ)编程手册,我才感到,不仅待模拟的世界能够用它的实体、属性、集合和事件来描述,而且数据库中所表现的世界也能够这样描述。特别地,除了少数例外情形(如果有的话),相同的特性对于DSS是必不可少的,就像对于模拟程序的开发一样,并且,除了给予执行程序向或不向数据库提交状态变化的选项外,几乎没有其他的编程特性(如果有的话)需要添加到该语言中。

当比如两个用户希望同时更新(或一个希望读取而另一个希望更新)相同的数据时,必须处理一些重要的执行方面而非构建模拟程序时所遇到的注意事项。但这些执行方面的问题,只要有可能,就不应增加应用程序设计员的负担,并且不管使用哪种规约语言,它们都是存在的。

SIMSCRIPTⅡ的第6层是1962年前后顿悟的结果。这一顿悟的升级版按照如下方式发展:SIMSCRIPTⅡ和它的超集SIMSCRIPTⅡ.5和Ⅲ,已经证明能够评估对工厂和作战计划等各种系统的系统设计。为实现一个这样设计的工厂,人们需要建造建筑物、购买设备、雇用劳动力,等等。为实现一个DSS,人们需要编写程序。为什么不运用相同的编程语言来(例如)追踪工厂的实时状态,以模拟其运营呢?当人们这样做的时候,为什么不将工厂模拟程序作为一个决策支持工具而包括在工厂DSS中,以预测从当前工厂状态(反映在其数据库中)开始的可能情形?因此,我们更有理由在模拟程序和DSS中运用相同的世界观。

SIMSICRIPT工具

所有版本的SIMSCRIPT(包括IBM的EAS-E)都有两个部分:

◆第一部分描述模拟程序、DSS或其他有待编译的程序的EAS结构。

◆第二部分描述程序的例程,包括主例程、事件例程(如果是模拟程序或DSS的话)及子例程和函数要采取的行动。

SIMSCRIPT(Ⅰ)使用了一个定义表作为第一部分。SIMSCRIPT(Ⅰ)程序员在恰当标记的字段中填写程序的实体、属性和集合名称,并提供其他的信息,如一个实体类型是永久性的还是暂时性的。键控打孔机操作员根据定义表在卡片上打孔。在程序员在FORTRANⅡ编程表上编写FORTRANⅡ语句并将它们打孔记录的环境下,这是行得通的。

SIMSCRIPTⅡ去掉了定义表,而包含了一个PREAMBLE段。PREAMBLE段开头的单词“PREAMBLE”和结尾处的单词“END”将其与其他段区分开。PREAMBLE段各分段的标题为:

暂时性实体……

永久性实体……

数据库实体……

这些分段的内容包括如下的语句:

每个机组都有一个Nr_Free_Machines,并且拥有一个Queue

定义Queue为一个根据Due_date排序的集合

系统具有……,拥有……

现代化的SIMSCRIPT M必须允许存在一个PREAMBLE段,以与已有的SIMSCRIPTⅡ程序兼容,但也应该包含一个描述程序EAS结构的GUI工具。本质上,它将允许用户以类似于表7-1和表7-3的表格形式输入EAS结构,包括可选择的额外信息[SIMSCRIPT(Ⅰ)的定义表实质上就是当时的GUI界面]。无论程序员是使用PREAMBLE段还是使用EAS GUI,SIMSCRIPT M的例程工具都应该在EAS表中展示EAS结构。通过这种方式,系统的EAS表将会在程序发生修改时自动更新。在理想的情况下,这一文档记录和稍后将要描述的第二部分的编码应该具有版本控制,以便授权的用户能够看到谁在何时做了哪些修改。

SIMSCRIPT(Ⅰ)和Ⅱ的第二部分将模拟程序和(按计划对于SIMSCRIPTⅡ)DSS的各种开发命令交由用户支配。这些命令包括人们对实体、属性和集合所采取的基本操作,包含了指示计算机(例如)创设或删除一个实体、计算或读取属性值、将一个实体归入某个集合或从集合中移除(首个、最后一个或某个特定)实体的命令。我们试着使如下命令的句法是可读的:

CREATE A JOB

FILE JOB IN QUEUE(MG)

其中,第二个语句末尾的表达式应理解为“MG的Queue”。撇开其他不谈,SIMSCRIPT英语式的句法使检查(或许由一个包括非程序员在内的团队来执行)系统是否像预期那样得以实施更为容易。

除了指定基本操作的命令之外,SIMSCRIPT的其他命令和特性域(feature-areas)包括生成具有不同概率分布的随机数,生成所见即所得(what you see is what you get,WYSIWYG)报告,以及循环子例程和函数。3其他编程语言同样提供随机数生成器和报告生成器工具,并且具有循环子例程和函数。但据我所知,没有一种语言具有与第7章介绍的用于获取系统统计量的SIMSCRIPTⅡACCUMULATE和TALLY命令、本章介绍的COMPUTE和FIND命令,或SIMSCRIPT既能自文档化所需编码又显著少于那些不那么强大的语言的功能同样方便的工具。

例子

为说明SIMSCRIPT的本领,本节介绍一个求解例如在优化运算中遇到的非常大型的稀疏线性方程组的算法,下一节则展示可以用于这一目的的SIMSCRIPTⅡ代码的一个片段。

我们区分两种线性方程组和与它们相关的矩阵,即稠密矩阵(dense matrix)和稀疏矩阵(sparse matrix)。稀疏矩阵的绝大多数系数为0,而稠密矩阵的绝大多数系数都不为0。无论是稠密还是稀疏线性系统,都既有“正定”的,也有不是正定的。对于正定系统,会用到“Cholesky分解”。在其余的稀疏矩阵中,一些矩阵的非零元素布局是可利用的模式。这些矩阵足够重要,需要开发特殊的程序来利用这一模式。夏普(Sharp,1963)文章中的单因子模型就是一个例子。对于非零元素的一个随意布局,或者没有可用的代码来利用非零元素布局的可利用模式时,就用马科维茨(1957)文章中修正版的稀疏矩阵方法。

作为一个例子,假设某个系统的106个方程(行)中有106个变量(列),在每一行或列中,平均有10个非零系数。因此,整个系统共有107个非零系数。回忆一下高中的代数学,怎样求解例如有3个未知数的3方程组。在高中碰到的例子不复杂的情况下,你可以:

(1)求解第一个方程式,用X2和X3表示X1,X2和X3的值待定。

(2)利用“等式相加仍为等式”的事实消去第二个和第三个方程式中的X1。

现在你就有了含有两个未消去未知数的两个未消去方程。对这两个未消去的含有两个未知数的方程重复相同的过程,用X3表示X2,就得到一个含有一个未知数X3的方程。求解这个方程得到X3,利用X3和第二个消去的方程求解得到X2,然后利用X3和X2求解X1。问题得解!

相同的高斯消元法(Gaussian elimination)原则上可用于求解有106个未知数的106个方程。求解第一个方程,用其余106-1个变量来表示X1,消去其余106-1个方程中的X1,然后连续重复这一过程,直到剩下一个含有一个未知数的方程。求解这个单一方程,利用第106个变量的值求解第106-1个变量的值,然后利用这两个值求解第106-2个变量的值,依此类推。

运用这一方法求解大型的稀疏矩阵存在两个问题。首先,由于矩阵是稀疏的,有可能a11等于零,或者“太接近于”零,影响数值的稳定性。在这种情况下,不允许将a11作为主元(pivot),也即不允许用第一个方程消去X1,因为这会涉及除以零或“几乎为零的数”。即使a11不太接近于零,也许后来某个未消去方程的aii为(或几乎为)零。假定aii不为零或不是几乎为零,总是以aii为主元的第二个问题,是主元消去过程会“填充”未消去的矩阵,从而使一个稀疏矩阵很快变成稠密矩阵。例如,如果一个矩阵是中等程度稀疏的,但恰好第一行包含了每个变量,并且X1出现在每个方程中,那么以a11为主元,一步就将稀疏矩阵转变为稠密矩阵。

设mi和nj分别是未消去方程组第i行和第j列的非零元素的个数。马科维茨规则(Markowitz rule)选择具有最小

的非零aij作为下一个主元。这一选择使最大可能的填充个数最小化。特别地,如果mi=1或nj=1(一个“单元素集”),那么就不会出现填充的情况。如果有两个(或更多)单元素集,那么它们可以按任意顺序作为接下来的两个(或多个)主元。作为当前商业稀疏矩阵程序中标准步骤的修正的马科维茨规则(modified Markowitz rule,MMR),在那些绝对值不“太小”的aij中选择使式(12-1)中MR最小者作为主元。

代码示例

图12-2包含了人们可能编写的用于在稀疏矩阵求解程序中实施MMR主元选择规则的SIMSCRIPTⅡ代码。这个例子假设程序的EAS结构包含ROW、COLUMN和ENTRY等实体类型,THE SYSTEM拥有一个集合UNELIMINATED ROWS,以及每一行都拥有一个非零元素集。ROW和COLUMN的属性ROW-COUNT和COLUMN-COUNT分别表示各自的非零元素个数。

图12-2 选择一个主元的SIMSCRIPTⅡ代码

这些代码差不多是自文档化的,但在理解它们时有些需要注意的地方,包括一些已经在第7章中指出的点。SIMSCRIPTⅡ不“区分大小写”,即对大写字母和小写字母同样处理。而且,换行符被作为空格处理,多余的空格则被忽略(除了某些SIMSCRIPTⅡ所见即所得报告生成器工具中“格式行”的空格外)。SIMSCRIPTⅡ的“FOR语句”,例如:

FOR EACH I in UNELIMINATED_ROWS

指示SIMSCRIPTⅡ编译器编写遍历某个集合中实体的代码。FOR语句也能够用于指示SIMSCRIPT遍历一个整数序列,比如:

FOR I=1to N

FOR语句可能被一个或多个语句所限定。这些语句以WITH、UNLESS、WHILE、UNTIL等单词开头,其后则是一个逻辑表达式。逻辑表达式可能是:

◆一个基本表达式,比如检验一个算术关系的表达式,如DUE_DATE(JOB)
◆一个包含AND、OR和/或NOT运算符,或许还有括号的复合表达式。

在一个逻辑表达式中,逻辑或算术运算符能够出现的个数没有限制。这种一般性的目的不是为了鼓励写出令人费解的多层次算术和逻辑表达式,而是为了在需要一点额外的一般性时不用记住或碰到任意边界。

FOR、WITH、WHILE等语句在逻辑上有意义的组合,被称为控制语句。控制语句可能附属于一个单一的命令,如图12-2中的COMPUTE命令,或附属于一个DO语句。紧随DO语句的是任意数目的语句,最后是匹配的LOOP语句,用于结束DO…LOOP命令。一个程序可以有任意复杂的嵌套循环。ALSO DO命令表示,考虑中的DO…LOOP命令将在与前面的(最内层)DO…LOOP命令中相同的LOOP语句处结束。在对复杂的决策规则或算法进行编码时,这是一个相当美好的特性。

COMPUTE命令可以独立存在,如图12-2中那样,也可以(或许和其他COMPUTE命令一起)在一个或多个DO…LOOP命令中。无论哪种情形,COMPUTE命令都能够计算与循环中碰到的实体序列有关的多个统计量,包括均值、方差、标准差、某个表达式的最小或最大值,以及当后者取得最小或最大值时一个或多个表达式的值。例如,在图12-2中,声明:

iStar=Min(I)

jStar=Min(Column_Nr(entry))

指示SIMSCRIPTⅡ在以下表达式:

(Row_Count(I)-1)*(Column_Count(Column_Nr(entry))-1)

取得最小值时,将I和Column_Nr(entry)的值存储到iStar和jStar中。4

SIMSCRIPTⅡ也有FIND命令,它找出满足特定逻辑条件的情形,转移与否取决于是否找到了这样一种情形。不用说(但为了强调,我再说一次),最初设计SIMSCRIPTⅡ的目的,就是要使SIMSCRIPTⅡ的所有工具,包括COMPUTE和FIND命令,既能处理数据库实体又能处理主存储器实体。



上一章目录下一章
推荐书籍:银行审慎监管 充分就业与价格稳定 宏观经济思想七学派 经济增长黄金律 为什么我也不是保守派:古典自由主义的典型看法 经济增长理论 衰老的真相:你不可不知的37个迷思 微行动:成长就是从做好每件小事开始 未来生活简史:科技如何塑造未来 销售的常识:回归销售的本质,重构你的销售思维