论文部分内容阅读
大家在小学就会四舍五入,四及以下被舍去,五以及更大的数字则进1。
这个规则在做题的时候没有什么问题,毕竟做错做对也不会来钱。那么问题来了,银行交易的最小单位是分,分以下被约掉的钱虽然不多,但是如果按照我们小学的四舍五入,你和银行到底谁亏谁赚呢?
举个例子,比如给5位储户的利息分别是0.000元、0.001元、0.002元、0.003元、0.004元,这些厘被四舍五入掉了,因此银行赚了。
但是另外五位储户的利息是0.005元、0.006元、0.007元、0.008元、0.009元,那么他们每人拿到的利息就是0.01元,银行亏了。
而根据本福德定律的发现者弗兰克·本福德的测算(本福特定律,也称为本福德法则,从实际生活得出的数据中,以1为首位数字的数的出现几率约为总数的三成,接近期望值1/9的3倍。推广来说,越大的数,以它为首位的数出现的几率就越低。它可用于检查各种数据是否有造假),非第一位的数基本上符合随机分布,也就是0-9这10个数字出现的概率相同。那么每付出10笔利息,银行的总收益就是:
0.000+0.001+0.002+0.003+0.004-0.005-0.004-0.003-0.002-0.001=-0.005
看到了吧,妥妥的亏钱。这还只是付10笔利息的情况,银行有上百万上千万的储户,那么亏损就更大了,每千万笔利息,银行要亏五千元。
也就是说,四舍五入其实不利于银行,而有利于储户。
话说回来,传统的四舍五入让银行亏钱的原因是因为把5都往大了算。为了减小误差,有人设计出了一种叫做银行家舍入(Banker’s Rounding)的算法。它的规则是这样的:
* 4及以下直接舍去;大于等于6时,进位后舍去;这两点和四舍五入一样;
* 5的情况比较复杂,如果5后面还有数字,则进位后舍去;如果5后面没有数字了,那么5前面是奇数,则进1,若5前面是偶数直接舍去5。
举几个例子:
3.016 ≈ 3.02
3.013 ≈ 3.01
3.015 ≈ 3.02
3.045 ≈ 3.04
3.04501 ≈ 3.05
如果数字随机分布,则银行家舍入引起的误差比传统的四舍五入小,因为银行家舍入法在计算时,平均一半的情况数会变大,而另一半会变小。当然,银行家舍入也不是完全没有误差,其误差和操作次数的平方根成正比。
不过需要指出的是,虽然这种舍入法叫“银行家舍入”,但实际上和银行关系不大。
我国金融系统的大部分算法就是用四舍五入。比如分以下的利息、中国国际收支平衡表、商业银行向中国人民银行缴存的准备金、《中华人民共和国外资金融机构管理条例》中的储备金等都是用的四舍五入。
国际上,欧盟委员会对换汇时的舍入规定也是四舍五入。
真正广泛采用银行家舍入法的,是需要更小误差的科学和计算机系统,因此银行家舍入也常常叫做统计学家舍入(statistician’s rounding)、无偏舍入(unbiased rounding)。
1940年开始,美国材料和试验协会(ASTM)用的就是银行家舍入法。现在大部分编程软件的默认设置都是银行家舍入法,比如C/C++、JavaScript、PHP、Go,英特尔处理器用的也是银行家舍入。
不过,不管是四舍五入还是各种花式舍入法,都无法避免误差累积的问题。我们来看看几个舍入引起的超级乌龙事件。
1982年,加拿大推出了温哥华证券交易所指数VSEI。VSEI 是1500家上市公司的指数合成所得,类似于咱们的上证指数,用来衡量股市的整体走势。
VSEI的初始值是1000点。但是1983年11月,VSEI跌到了524.811点,和一开始相比跌去了近一半。奇怪的是,构成VSEI的各个股票本身并没有跌这么惨,所以股指到底怎么了呢?
原来,这就是舍入误差造成的乌龙。VSEI的计算交由计算机程序自动处理,计算精确到小数点后4位。但是,报告中只用小数点后3位,最后一位是直接被舍掉的。
因此,每次计算,VSEI的真实值和报告值之间就出现了一个很小但却逐渐累积的误差。而到1983年11月,仅仅一年多时间这个误差已经壮观到肉眼可见了。
后来,温哥华证券交易所的人花了3周的时间才想明白了重新计算股指的方法。一夜之间,VSEI就从524.811点跳到了1098.892点,想想看这让买入指数基金的人有多爽。
舍入误差不光造成金融界的乌龙,还曾造成美军重大伤亡。海湾战争期间,在沙特的爱国者导弹的计算机精度为24位,有0.0001%的计时误差。运行100小时后,导弹的计算机系统累积了0.3422秒的误差,最终没能拦截伊拉克发射的一枚飞毛腿导弹,造成28名美国陆军士兵死亡。 还有一些人利用舍入的误差攻击金融系统赚钱。
因为日常的金融操作的最小单位是分,也就是小数点后2位,在汇率换算的时候也是如此,有人就想到,可以人为使这个误差朝使自己有利的方向偏移。
举个例子。0.01日元换成美元是0.000093美元,银行不可能把你的钱换没了,所以只能给你0.01美元,这样一来,你就白赚了99.07%。
1分钱虽然是小钱,但苍蝇也是肉,如果循环多次交易,就能利用舍入误差套利。用100日元换1万次,就能赚99美金。
2013年,罗马尼亚计算机安全学家阿德里安·富图纳(Adrian Furtuna) 发现,欧元在换算成罗马尼亚货币列伊的过程中可以通过这种方法套利。他就利用外汇舍入的漏洞设计了一款自动赚钱机器。如果能全速运转,这台机器每天就能通过数千次小额交易赚取70欧元。
因为这种交易是在银行设置的合法语境下进行的,所以银行只能吃哑巴亏。银行把这种套利行为取名为“逻辑攻击”(logical attack)。当然,银行也有应对措施,比如收取交易费、设定最小换汇数额,或者限制每日换汇次数等等。
这种对金融系统的攻击,就属于著名的“腊肠术”——神不知鬼不觉地把一片片萨拉米切下来,合起来就是一根完整的腊肠啦。
历史上的确发生过很多次腊肠攻击的案件,不少影视作品也有相应描述,比如1983年的《超人》、1999年的《上班一条虫》。
在《上班一条虫》中,男主利用黑客技术窜改了银行的利息算法,把普通储户被四舍五入掉的利息全部转到了他的賬户里。
腊肠攻击不仅适用于银行,也适用于税务系统。
想想看,如果一家公司有很多员工,把员工交的税分开来计算和合起来计算的数额会因为舍入的问题而略有差异,公司就可以利用多次舍入而少交税。
为了避免有人利用这个漏洞,美国国家税务局就设定了相应的规定(fractions of cents adjustment),使得公司在报税时没有舍入的漏洞可钻。
总之,只有小学生会瞧不起四舍五入,大人都是用它赚钱养小学生。
一个悲伤的悖论:四舍五入有利于储户,而我的1分钱账户却永远没有利息。
(本文经授权转载自“把科学带回家”微信公众号,有删节)
这个规则在做题的时候没有什么问题,毕竟做错做对也不会来钱。那么问题来了,银行交易的最小单位是分,分以下被约掉的钱虽然不多,但是如果按照我们小学的四舍五入,你和银行到底谁亏谁赚呢?
举个例子,比如给5位储户的利息分别是0.000元、0.001元、0.002元、0.003元、0.004元,这些厘被四舍五入掉了,因此银行赚了。
但是另外五位储户的利息是0.005元、0.006元、0.007元、0.008元、0.009元,那么他们每人拿到的利息就是0.01元,银行亏了。
而根据本福德定律的发现者弗兰克·本福德的测算(本福特定律,也称为本福德法则,从实际生活得出的数据中,以1为首位数字的数的出现几率约为总数的三成,接近期望值1/9的3倍。推广来说,越大的数,以它为首位的数出现的几率就越低。它可用于检查各种数据是否有造假),非第一位的数基本上符合随机分布,也就是0-9这10个数字出现的概率相同。那么每付出10笔利息,银行的总收益就是:
0.000+0.001+0.002+0.003+0.004-0.005-0.004-0.003-0.002-0.001=-0.005
看到了吧,妥妥的亏钱。这还只是付10笔利息的情况,银行有上百万上千万的储户,那么亏损就更大了,每千万笔利息,银行要亏五千元。
也就是说,四舍五入其实不利于银行,而有利于储户。
话说回来,传统的四舍五入让银行亏钱的原因是因为把5都往大了算。为了减小误差,有人设计出了一种叫做银行家舍入(Banker’s Rounding)的算法。它的规则是这样的:
* 4及以下直接舍去;大于等于6时,进位后舍去;这两点和四舍五入一样;
* 5的情况比较复杂,如果5后面还有数字,则进位后舍去;如果5后面没有数字了,那么5前面是奇数,则进1,若5前面是偶数直接舍去5。
举几个例子:
3.016 ≈ 3.02
3.013 ≈ 3.01
3.015 ≈ 3.02
3.045 ≈ 3.04
3.04501 ≈ 3.05
如果数字随机分布,则银行家舍入引起的误差比传统的四舍五入小,因为银行家舍入法在计算时,平均一半的情况数会变大,而另一半会变小。当然,银行家舍入也不是完全没有误差,其误差和操作次数的平方根成正比。
不过需要指出的是,虽然这种舍入法叫“银行家舍入”,但实际上和银行关系不大。
我国金融系统的大部分算法就是用四舍五入。比如分以下的利息、中国国际收支平衡表、商业银行向中国人民银行缴存的准备金、《中华人民共和国外资金融机构管理条例》中的储备金等都是用的四舍五入。
国际上,欧盟委员会对换汇时的舍入规定也是四舍五入。
真正广泛采用银行家舍入法的,是需要更小误差的科学和计算机系统,因此银行家舍入也常常叫做统计学家舍入(statistician’s rounding)、无偏舍入(unbiased rounding)。
1940年开始,美国材料和试验协会(ASTM)用的就是银行家舍入法。现在大部分编程软件的默认设置都是银行家舍入法,比如C/C++、JavaScript、PHP、Go,英特尔处理器用的也是银行家舍入。
不过,不管是四舍五入还是各种花式舍入法,都无法避免误差累积的问题。我们来看看几个舍入引起的超级乌龙事件。
1982年,加拿大推出了温哥华证券交易所指数VSEI。VSEI 是1500家上市公司的指数合成所得,类似于咱们的上证指数,用来衡量股市的整体走势。
VSEI的初始值是1000点。但是1983年11月,VSEI跌到了524.811点,和一开始相比跌去了近一半。奇怪的是,构成VSEI的各个股票本身并没有跌这么惨,所以股指到底怎么了呢?
原来,这就是舍入误差造成的乌龙。VSEI的计算交由计算机程序自动处理,计算精确到小数点后4位。但是,报告中只用小数点后3位,最后一位是直接被舍掉的。
因此,每次计算,VSEI的真实值和报告值之间就出现了一个很小但却逐渐累积的误差。而到1983年11月,仅仅一年多时间这个误差已经壮观到肉眼可见了。
后来,温哥华证券交易所的人花了3周的时间才想明白了重新计算股指的方法。一夜之间,VSEI就从524.811点跳到了1098.892点,想想看这让买入指数基金的人有多爽。
舍入误差不光造成金融界的乌龙,还曾造成美军重大伤亡。海湾战争期间,在沙特的爱国者导弹的计算机精度为24位,有0.0001%的计时误差。运行100小时后,导弹的计算机系统累积了0.3422秒的误差,最终没能拦截伊拉克发射的一枚飞毛腿导弹,造成28名美国陆军士兵死亡。 还有一些人利用舍入的误差攻击金融系统赚钱。
因为日常的金融操作的最小单位是分,也就是小数点后2位,在汇率换算的时候也是如此,有人就想到,可以人为使这个误差朝使自己有利的方向偏移。
举个例子。0.01日元换成美元是0.000093美元,银行不可能把你的钱换没了,所以只能给你0.01美元,这样一来,你就白赚了99.07%。
1分钱虽然是小钱,但苍蝇也是肉,如果循环多次交易,就能利用舍入误差套利。用100日元换1万次,就能赚99美金。
2013年,罗马尼亚计算机安全学家阿德里安·富图纳(Adrian Furtuna) 发现,欧元在换算成罗马尼亚货币列伊的过程中可以通过这种方法套利。他就利用外汇舍入的漏洞设计了一款自动赚钱机器。如果能全速运转,这台机器每天就能通过数千次小额交易赚取70欧元。
因为这种交易是在银行设置的合法语境下进行的,所以银行只能吃哑巴亏。银行把这种套利行为取名为“逻辑攻击”(logical attack)。当然,银行也有应对措施,比如收取交易费、设定最小换汇数额,或者限制每日换汇次数等等。
这种对金融系统的攻击,就属于著名的“腊肠术”——神不知鬼不觉地把一片片萨拉米切下来,合起来就是一根完整的腊肠啦。
历史上的确发生过很多次腊肠攻击的案件,不少影视作品也有相应描述,比如1983年的《超人》、1999年的《上班一条虫》。
在《上班一条虫》中,男主利用黑客技术窜改了银行的利息算法,把普通储户被四舍五入掉的利息全部转到了他的賬户里。
腊肠攻击不仅适用于银行,也适用于税务系统。
想想看,如果一家公司有很多员工,把员工交的税分开来计算和合起来计算的数额会因为舍入的问题而略有差异,公司就可以利用多次舍入而少交税。
为了避免有人利用这个漏洞,美国国家税务局就设定了相应的规定(fractions of cents adjustment),使得公司在报税时没有舍入的漏洞可钻。
总之,只有小学生会瞧不起四舍五入,大人都是用它赚钱养小学生。
一个悲伤的悖论:四舍五入有利于储户,而我的1分钱账户却永远没有利息。
(本文经授权转载自“把科学带回家”微信公众号,有删节)