不知道读者有没有注意到,生活中的价格可能是不连续的,而处理的算法并不全是四舍五入,某些情况下大家会倾向于向下取整。例如到菜场买蔬菜水果时,摊主经常会主动给抹零。有时候买个西瓜碰到15块6毛8毛的尾数,不那么爽气的摊主,则会说,给15块5毛吧。
在金融行业里面,也有类似需要进行尾数处理的场景,用到的则是类似以上舍入舍出的场景。
首先和开头的案例类似,需要进行尾数处理的原因是因为价格不是一个连续的数字,一般都是有固定的精度,以及变动的步距。
例如某个金融期货的合约,有如下的表述,
合约乘数:每点300元
报价单位:指数点
最小变动价位:0.2点
也就是说,当进行交易时,报价单位参考的是某个指数的点位,而报价是0.2(tick)的整数倍来进行变化的。也就是说,如果当前的指数点位是3500点,则最小的变动价格是3500.2或者是3499.8。
炒过股票的读者估计都知道涨跌停板的概念,为了能够控制交易日当天的风险而引入的一个价格控制的措施。例如上例中,如果以3500点为基准,10%作为涨跌停,那么价格范围就是3500(1+-10%)=3850 ~3150。 涨跌停板控制的还是一整天的价格风险。在交易过程中,为了能平滑价格波动幅度,控制瞬时的风险,市场上还存在着价格波动带的概念,可以理解成为实时的迷你涨跌停价格限制,也就是说当报单时,价格会被限制在一个比较小的范围内,超出这个价格范围的,会被系统拒绝的。如下图所示
image.png
说它迷你,是因为它的价格限定范围会比较窄,如规定,当价格在2000-5000点时的价格波动带1%。 也就是说,假设当前价格是3500点,则报单时可以被交易系统接受的价格的区间是 3535-3465。
那如果当前价格是3456.8的话,价格波动带的范围有是多少呢?
首先计算带价的单边宽度:
3456.8 *0.01=34.568
再计算上带价:
3456.8+34.568=3491.368
和下带价
3456.8-34.568=3422.232
考虑到价格的最小变动价位,对于计算出来的价格就需要进行处理了。
在关于波动带和涨跌停板价格计算中的舍入算法,简单来说就是,当原始计算价格落在两个tick中间的话,最终价格取离基准价格更近的那个tick。
离开3491.368最近的有效价格点位是3491.2和3491.4。按照舍入算法,基准价格是3456.8,因此,此时的价格波动带上带价就是3491.4。
按照类似的算法来计算下带价,离开3422.232最近的有效价格点位是3422.2和3422.4。基准价格是3456.8,按照舍入算法,此时的价格波动带上带价就是3422.2。
那么,如果采用舍出的算法,这个价格区间又是如何计算的呢?
本次只介绍了舍入舍出算法在价格计算中的应用。据说BigDecimal有8种舍入舍出算法,赶兴趣的读者可以自行了解一下。 关于价格波动带的更多业务规则,可以参考CME的官网
<u>https://www.cmegroup.com/confluence/display/EPICSANDBOX/GCC+Price+Banding</u>
感谢您读到这里,笔者会逐步更新更多基础的业务测试场景,毕竟只有了解了业务,才能设计出有价值的用例来。