程序员数学:用Python学透线性代数和微积分
上QQ阅读APP看书,第一时间看更新

1.1 使用数学和软件解决商业问题

经常有人诟病高中数学课:“我什么时候才能在现实生活中用到这些知识?”老师告诉我们,数学会帮助我们在事业上取得成功并赚钱。我觉得他们说得没错,尽管举的例子并不准确。例如,我不会手动计算银行复利(银行也不会)。也许,如果我像三角学老师建议的那样成为建筑工地的测量员,就会每天用正弦公式和余弦公式来赚取工资。

看起来高中课本里所谓的“实际”应用并没那么有用,但是对数学的真实应用还是有的,而且有些应用带来的商业利润令人瞠目结舌。许多问题是通过将正确的数学思想转化为可用的软件来解决的。这里将分享一些我最喜欢的例子。

1.1.1 预测金融市场走势

我们都听说过股票交易员通过在正确的时间买入和卖出正确的股票而赚取数百万美元的传奇故事。受所看电影的影响,我总是把他们想象成穿着西装的中年男子,一边开着跑车,一边用手机对着经纪人大喊大叫。也许这种刻板印象在某一时期是正确的,但今天的情况已经不同了。

在曼哈顿的摩天大楼里,隐藏着成千上万被称为量化金融分析师(quant)的人。量化金融分析师又称定量分析师,负责设计数学算法来自动交易股票并赚取利润。他们不穿西装,也不花时间对着手机大喊大叫,但我相信他们中的很多人拥有非常漂亮的跑车。

那么,量化金融分析师是如何写出自动赚钱的程序的呢?这个问题的最佳答案是被严密保护的商业秘密,但肯定涉及大量数学知识。我们可以看一个简单的例子来了解自动交易策略的工作原理。

股票是代表公司所有权的金融资产类型。当市场认为一家公司经营良好时,其股票价格就会上涨:买入股票的成本增加,卖出股票的回报也会增加。股票价格的变化是不稳定的、实时的。图1-1显示了在一天交易中的股票价格图。

图1-1 股价随时间变化的典型图形

对于这只股票,如果你在第100分钟左右以24美元买入1000股,并在第430分钟左右以38美元全部卖出,当天就可以赚14 000美元。这很棒!挑战在于,你必须提前知道这只股票会上涨,而且清楚第100分钟和第430分钟分别是买入和卖出的最佳时机。虽然你可能无法准确预测最低或最高价格,但也许能找到一天中相对较好的买卖时机。让我们来看看如何用数学方法来实现这个目标。

我们可以通过找到一条“最佳拟合”线来衡量股票价格会涨还是会跌,这条线大致遵循价格的变动方向。这个过程称为线性回归,本书的第三部分会介绍。因为数据是不断变化的,所以可以在“最佳拟合”线上下再计算出两条线,以显示价格上下浮动的区域。把它们叠加在价格图表上,可以看出这些线和趋势相符,如图1-2所示。

图1-2 利用线性回归确定股票价格的变化趋势

有了对股票价格走势的数学理解,我们就可以编写代码,在股票价格相对于其趋势开始低位波动时自动买入,并在价格回升时自动卖出。具体来说,我们的程序可以通过网络连接到证券交易所,在价格低于底线时买入100股,并在价格越过顶线时卖出100股。图1-3展示了一次这样的盈利交易:以27.80美元左右的价格买入,以32.60美元左右的价格卖出,在一小时内可以赚到约480美元。

图1-3 使用我们基于规则的交易软件进行买卖,赚取利润

我不敢说这是一个完备的可执行策略,但重点是,只要有正确的数学模型,你就可以自动获利。此刻,不知有多少程序正在构建和更新对股票等金融工具进行趋势预测的模型。如果你编写出这样的程序,就能在享受闲暇时光的同时赚钱了!

1.1.2 寻找优质交易

或许你的本钱不够多,无法参与高风险的股票交易。尽管如此,数学仍然可以帮助你在其他交易中赚钱和省钱,比如在买二手车时。新车交易比较简单透明:如果两个经销商在卖同一款车,你显然想从成本最低的经销商那里买。但二手车有更多需要考虑的参数:除了价格,还有里程数和出厂日期。你甚至可以利用某辆二手车在市场上的停留时间来评估它的质量:停留时间越长,其质量可能就越值得怀疑。

在数学里,用有序的数字列表来描述的对象被称为向量(vector),有一个领域专门研究它,称为线性代数。例如,一辆二手车可能对应的是一个四维向量,也就是一个包含四个数的元组。例如:

这些数分别代表出厂日期、里程数、停留天数和价格。我的一个朋友经营着一个叫作CarGraph的网站,上面汇总了二手车销售的数据。在写作本书时,这个网站提供了101辆丰田普锐斯的销售数据,包含每辆车的这四项数据(部分或全部)。该网站名副其实,将数据以图表的形式直观地呈现出来(见图1-4)。四维对象很难可视化,但如果选择其中的两个维度,比如价格和里程数,就可以把描述它们关系的散点图绘制出来。

图1-4 来自CarGraph的二手普锐斯价格与里程数关系图1

11英里 ≈ 1.6千米。——编者注

我们也想在这里画一条趋势线。图中的每个点都代表了某个人心中的合理价格,趋势线会把这些心理预期价格汇总到一起,形成在任何里程数下都比较可靠的价格。在图1-5中,我决定拟合一条指数下降曲线,而不是一条直线,并且忽略了一些以低于零售价销售的次新车。

图1-5 根据二手普锐斯的价格与里程数拟合出的指数下降曲线

为了更容易管理数据,我在计算时将里程数单位换成了万英里,所以里程数为5代表5万英里。令为价格,为里程数,最佳拟合曲线的公式如下:

根据式(1.1),最合适的价格是26 500美元乘以0.905的次幂。将这些数值代入方程,我们发现,如果预算是10 000美元,那么应该购买一辆行驶里程约为97 000英里的普锐斯(见图1-6)。如果曲线表示的是合理的价格,那么低于该线的汽车通常应该是划算的。

图1-6 以10 000美元的预算为例,找出一辆二手普锐斯的预期里程数

除了可以寻找性价比最高的交易,我们还能从式(1.1)中学到更多东西。它讲述了一个关于汽车如何贬值的故事。式中的第一个数是$26 500,是指数函数对里程为零时价格的理解。这与一辆新普锐斯的零售价非常接近。如果我们使用最佳拟合线,它意味着普锐斯每行驶一英里就会损失固定的价值。这个指数函数则表示,每行驶一英里,普锐斯的价值就会损失一个固定的百分比。在行驶10 000英里后,根据这个公式,一辆普锐斯的价格会跌到原价的0.905(90.5%)。在行驶50 000英里后,我们将其价格乘以系数(0.905)5 ≈ 0.607。这告诉我们,它的价格约为新车的61%。

我用Python实现了一个price(mileage)函数,用来制作像图1-6那样的图。它将里程数作为输入(单位为万英里),并输出最适合的价格。通过计算price(0) - price(5)price(5) - price(10),我知道了第一个和第二个50 000英里的行驶成本分别为10 000美元和6300美元。

如果使用最佳拟合直线而不是指数曲线,这意味着汽车的固定折旧率为每英里0.10美元。换言之,每行驶50 000英里,就一定会损失5000美元。传统观念认为,新车行驶的头几英里掉价最快,因此指数函数(式(1.1))与此相符,而线性模型则不够准确。

请记住,这只是一个二维分析。我们只建立了一个数学模型,将描述每辆车的四个数值维度中的两个维度联系起来。在本书第一部分中,你将详细学习各种维度的向量以及如何使用高维数据。第二部分将介绍不同类型的函数,如线性函数和指数函数,并通过分析其变化率来进行比较。最后,第三部分将探讨如何建立数学模型,将数据集的所有维度纳入其中,从而获得更准确的图形。

1.1.3 构建三维图形和动画

许多在商业上大获成功的著名软件项目与多维数据打交道,特别是三维数据。这里我想到的是三维动画电影和三维视频游戏,它们的总收入高达数十亿美元。例如,皮克斯的三维动画软件帮助其获得了超过130亿美元的票房收入,Activision的《使命召唤》系列三维动作游戏赚了160多亿美元,而Rockstar仅凭《侠盗猎车手5》就赚了60多亿美元。

所有这些成功的项目都基于三维向量(形式为)运算。通过三个数就可以在三维空间中相对于参考点定位一个点,这个参考点就是所谓的原点。由图1-7可知,这三个数表示在各个方向上到原点的垂直距离。

图1-7 用三个数组成的向量在三维空间中定位一个点

从《海底总动员》中的小丑鱼到《使命召唤》中的航空母舰,任何三维对象都可以在计算机中用三维向量的集合来定义。在代码中,每个对象看起来都像由float值组成的三元数对(triple)列表。有三个三元浮点数对,我们就有了空间中的三个点,这样就可以定义一个三角形(见图1-8)。例如:

triangle = [(2.3,1.1,0.9), (4.5,3.3,2.0), (1.0,3.5,3.9)]

图1-8 使用由三元数对定义的三个顶点构建一个三维三角形

组合多个三角形,就可以生成一个三维对象的表面。使用更多、更小的三角形,还可以让结果看起来很平滑。图1-9显示了使用越来越多的更小三角形对一个三维球体进行的六次渲染。

图1-9 由指定数量的三角形构建的三维球体

在第3章和第4章里,你将学习使用三维向量数学将三维模型转换成类似于图1-9中的带阴影的二维图像。你还需要使三维模型更为平滑,让它们在游戏或电影中显得更加逼真,并且让它们逼真地移动和变化。这意味着你设计的对象应该遵守物理定律,而这些定律也可以用三维向量来表示。

假设你是《侠盗猎车手5》的程序员,想实现一个基础用例,比如向直升机发射火箭炮。从主角的位置开始发射炮弹后,炮弹的位置会随着时间的推移而改变。可以使用数值下标来标注炮弹在飞行过程中的各个位置,从开始。随着时间的推移,炮弹到达新的位置,用向量等来标记。值的变化率是由火箭炮的方向和炮弹速度决定的。此外,由于重力作用,随着炮弹值的增加,变化率会随着时间的推移而减小(见图1-10)。

图1-10 炮弹的位置向量因其初始速度和重力的影响而随时间变化

有经验的动作游戏玩家都知道,想击中直升机,需要瞄准稍微高于直升机的位置!要模拟物理学,必须知道力是如何影响物体并随着时间的推移引起物体连续变化的。研究连续变化的数学被称为微积分,物理定律通常用微积分中的微分方程来表示。在第4章和第5章中,你会学到如何制作三维物体的动画,然后在第二部分中学习如何利用微积分的思想模拟物理世界。

1.1.4 对物理世界建模

之前“数学软件能产生真正的商业价值”的说法并非虚言,我在自己的职业生涯中已经看到了这种价值。2013年,我成立了一家名为Tachyus的公司,编写软件以优化石油和天然气的生产。我们的软件利用数学模型来了解地下油气的流动情况,帮助生产商更高效地开采同时获利更多。在软件的帮助下,我们的客户每年节约了数百万美元的成本并提高了产量。

为了解释软件的工作原理,这里介绍一些石油术语。将称为的钻孔钻到地下,直到到达含有石油的多孔(海绵状)岩石。这层富含石油的岩石称为储油层。石油被抽到地面并卖给炼油厂,然后炼油厂将石油转化为我们日常使用的产品。图1-11为油田示意图(未按比例显示)。

图1-11 油田示意图

过去几年中,石油价格变化很大,但我们假设它的价值是每桶50美元,其中桶是一个容积单位,相当于42加仑或约159升。如果通过钻井和有效地抽油,一家公司每天能够开采1000桶石油(相当于几个后院游泳池的容积),那么它的年收入将达到数千万美元。即使效率只提高几个百分点,也是一笔可观的收入。

根本的问题是地下的情况:石油现在在哪里,如何流动?这是一个复杂的问题,但是可以通过解微分方程来回答。这里的变量不是炮弹的位置,而是地下流体的位置、压力和流速。流体流速用一种特殊的函数来表示,这种函数返回一个向量,称为向量场。这意味着流体可以在任意三维方向上以任意速度流动,而且这个方向和速度在储油层内的不同位置各不相同。

有了对一些参数的最佳预测,我们可以用一个叫作达西定律(Darcy's law)的微分方程来预测流体通过多孔岩石介质(如砂岩)的流速。图1-12说明了达西定律,即使有些符号不熟悉也不要担心!代表流速的函数名为,用粗体表示它返回的是一个向量值。

图1-12 达西定律对应的物理方程,决定流体在多孔岩石中的流动方式

这个方程中最重要的部分是一个看起来像倒三角形的符号,它代表了向量微积分中的梯度算子(gradient operator)。压力函数在给定空间点的梯度是三维向量,表示该点压力增加的方向和速度。这里的负号表明,流速的三维向量指向相反的方向。这个方程用数学术语说明了,流体从高压区流向低压区。

负梯度在物理定律中很常见。可以这样理解,自然界倾向于向低势能状态变化。一个球在山丘上的势能取决于山丘在任何横向点的高度。如果山丘的高度由函数给出,则梯度指向上坡的方向,而球的滚动方向正好相反(见图 1-13)。

图1-13 正梯度指向上坡,而负梯度指向下坡

在第11章里,你将学习如何计算梯度。我会介绍如何应用梯度来模拟物理世界,以及解决其他数学问题。梯度恰好也是机器学习中最重要的数学概念之一。

希望这些例子比你在高中数学课上听到的实际应用更有说服力和现实意义。也许此刻你已经愿意去学习这些数学概念了,但是又担心太难。学习数学的确很难,尤其是自学。为了让你尽可能顺利地学习,我们来谈谈作为数学学生可能面临的一些陷阱,以及本书如何帮助你避免踏入这些陷阱。