- 程序員數學:用Python學透線性代數和微積分
- (美)保羅·奧蘭德
- 4966字
- 2022-01-10 14:44:06
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章里,你將學習如何計算梯度。我會介紹如何應用梯度來模擬物理世界,以及解決其他數學問題。梯度恰好也是機器學習中最重要的數學概念之一。
希望這些例子比你在高中數學課上聽到的實際應用更有說服力和現實意義。也許此刻你已經愿意去學習這些數學概念了,但是又擔心太難。學習數學的確很難,尤其是自學。為了讓你盡可能順利地學習,我們來談談作為數學學生可能面臨的一些陷阱,以及本書如何幫助你避免踏入這些陷阱。
- 工程軟件開發技術基礎
- Pandas Cookbook
- Boost C++ Application Development Cookbook(Second Edition)
- Arduino開發實戰指南:LabVIEW卷
- C語言從入門到精通(第4版)
- PostgreSQL 11從入門到精通(視頻教學版)
- Amazon S3 Cookbook
- Python忍者秘籍
- C語言程序設計簡明教程:Qt實戰
- Spring MVC+MyBatis開發從入門到項目實踐(超值版)
- C語言程序設計實踐
- Functional Python Programming
- 深入淺出 HTTPS:從原理到實戰
- Joomla!Search Engine Optimization
- C Primer Plus(第6版)中文版【最新修訂版】