UfqiFina有福金融更新:JavaScript的数据类型强制等

UfqiFina有福金融基金板块提供了一种查询证券投资基金的模拟K线图的方法。

在证券数据的K线图(蜡烛图)的绘制时,我们选用了第三方JavaScript类库HighCharts中的HighStock组件。在应用HighStock时,我们遇到一个值得讨论的关于JavaScript数据类型的问题,记录如下。

1. JavaScript的数据类型强制问题

问题的描述如下。我们尝试在UfqiFina有福金融的K线图中增加一个未来的预测值,以此来帮助调用者判断和分析未来的走势,按当前的变动幅度,如果是看涨会是什么情况,如果是看跌会是什么情况。

https://ufqi.com/index.jsp?mod=financefund&act=fundChart&icode=164906&dataTimeType=weekly&predictType=1&tit=理财服务所

fig1. 基金K线图:交银中证海外中国互联网指数-164906价格行情-UfqiFina-20220615UTC+08-看多涨

依靠过往近期数据计算未来时间节点预测值是一件简单的事情,相当于计算过往数据点构成的一条斜线的斜率。使用JavaScript来做计算,默认是Float数值,遇有小数点时,可能带来非常多的小数点,如同在 MDN的描述一样,
The JavaScript Number type is a double-precision 64-bit binary format IEEE 754 value, like double in Java or C#. 

比如一个普通的计算可以生成, 0.1234567890123 这样的数据。为了便于减少小数点,我们尝试使用 toFixed / toPrecision 函数来进行约束,经过实践,我们发现 toFixed / toPrecision 的返回值不是 Number ,而是String.
The toFixed returns A string representing the given number using fixed-point notation.
The toPrecision() method returns a string representing the Number object to the specified precision.

例如,在UfqiFina有福金融的某个基金某一未来时点的预测值 predictItem是 [123456, 1.0123456789] , 经过 toFixed(4) 之后,predictItem数据变成了 [ 123456, “1.0123”] , 当这个数据进一步地被前转到 HighStock 时, [123456, 1.0123456789] 可以被正确地绘制出来,符合预期,而数据 [ 123456, “1.0123”] 则被视为非法的,被 HightStock丢弃,不符合预期。

相对折中的做法是,在采取了 toFixed 截断了小数位数之后,再次地调用 parseFloat 使之将 String-type 的数据重新变回 Number-type 的数据。
The Number.parseFloat() method parses an argument and returns a floating point number. If a number cannot be parsed from the argument, it returns NaN.

predictItem[1] = parseFloat( predictItem[1].toFixed(4) );

在软件研发中,通常使用弱类型脚本编程语言,我们不考虑数据类型,比如PHP, Perl, JavaScript, VBScript, Python等,没有严格意义上的所谓字符型数值还是数据型数值。经过上面的案例分析,我们自此也许要认真考虑,在JavaScript这样的弱类型脚本编程语言中,如果启用类似 use strict 严肃模式时,也需要认真考虑数值的数据类型(data-type)。 程序脚本任务执行时,从数值类型不敏感变成了数值类型敏感(data-type sensitive)了。

在 fig1. 中,我们将预测值显示在K线图的最右侧,图中,周线图2022Jun15调用时,我们预测出了 2022Jun20的数据,预测模式为“看多涨”(高亮红色表示选中项)。 预测模式除了“看多涨”之外,我们还提供了“看空跌”,从而更方便地展示某个被观测的基金数据如果涨,能涨到多高,如果跌大概要跌成啥样。

2. 日期及节假日的计算

证券市场的行情是高度时间敏感的。这种敏感性既表现在更新频次是秒级,也表现在对过往海量数据的处理。在时间轴上,比如K线图描绘时,就面临着是用自然日、自然周、自然月,还是使用交易日、交易周、交易月的选择。

使用自然日、自然周作为计算单位是相对容易的,但却面临大量节假日及临时停止交易的时间段;如果以交易日、交易周为计算单位在绘图时容易,但却距离人们的感受和经济社会发展相对较远。例如,即便是节假日,其他经济社会主体还是会有交易发生、有发展推进的。

折中的做法就是以自然日、自然周为计算单位,同时兼顾交易日和交易周。这就面临着要计算某一自然日、自然周是否有交易,或者某个交易日归属于某个交易周。
如此以来,情况就变得稍微复杂一些,涉及到历法的各种推算。

在UfqiLong有福金融中,日期的计算既有在客户端绘图时的JavaScript算法,也有在服务器端计算分时段收益率的Java算法。根据分析,我们发现如果锚定日期中的周五Friday这个时间点,并分别计算当前交易日、交易周与前一个周五的时间差,如果时间差在七天之内,说明是在一周之内,如果时间差在七天之外,说明已经出离了一周。

这样在遇到节假日等非交易日的情况时,就可以根据前一个周五的时间戳和当前的时间戳,分析出前一周或者本周有0个,1个,2个,3个,4个,还是5个交易日,从而得出本周的涨跌幅。

原文首发: https://ufqi.com/blog/ufqifina-javascript-tofixed/-R/n2SQ


有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

此条目发表在服务器运维, 编程技术分类目录,贴了, , , 标签。将固定链接加入收藏夹。

UfqiFina有福金融更新:JavaScript的数据类型强制等》有2条回应

  1. Pingback引用通告: GWA2吉娃兔引入PNOO关于排序字段的顺序 | -wordpress-wadelau

  2. Pingback引用通告: UfqiFina有福金融更新:JavaScript的数据类型强制等 | -wordpress-wadelau

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code