python与金融建模_【用Python金融建模】从二叉树谈起:衍生品Option期权定价模型的构建...
內容首發
樂學偶得(http://lexueoude.com) 公眾號: 樂學Fintech
用代碼理解分析解決金融問題
在金融里面很多地方都出現過一個理念就是“貨幣的時間價值”,例如我們之前聊過的利用Python對項目進行估值判斷 就是利用這一重要的思想:我們做出的決定,都是把未來的一系列現金流的【流入】和【流出】進行折現,通過我們理性人在做決定的時候,是選擇對我們有利的事情——也就是折現到現在NPV為正的項目去做。
那么這個世界如果真的這么簡單就好了,我們只需要把未來的現金流折現到現在,然后就可以愉快的進行判斷了。
可是問題來了:未來并不確定。
而且萬事萬物都是相互聯系的,也就是說A可能導致B,B導致C,這樣蝴蝶效應傳遞下去,一個很小的偏差或者錯誤的估計會導致巨大的差錯。
二叉樹是我們對未來進行預判的一種思考方式,也是金融里面常用的模型,二叉樹的思想如下:
1.事情的發展分成一個階段一個階段
2.每一個階段只有兩個結果:變好和變壞
如果這是一個項目,我們可以把項目通過二叉樹進行估計,最好的情況,好成什么樣,最差的情況,差成什么樣,一目了然:項目估值
還有一個非常重要的運用就是在擬合或者模擬未來股價的趨勢上,股價本質上就是一系列的時間序列,所以說與項目的估值也是一類東西:隨著時間的變化,價格隨之改變股價預測
我們下面就來介紹這樣一個思考問題的方法與原理,并且通過Python進行建模計算:
二叉樹的思想就是把未來時間軸分為一期一期,在每一期內,只有價格只有兩種變化方向,向上,或者向下。我們從一期二叉樹開始思考:
一期二叉樹
假設初始價格為S0,在第一期的時間內,有P的概率價格會上升,成為S0*u 的價格,因為在這段時間內只有兩種可能,所以剩下
的1-P的概率價格會下跌,成為S0*d的價格。
u與d分別為up factor(上漲因子)與down factor(下跌因子),(我明白,涉及到公式經常會加什么什么因子,導致這個名字很山寨,但是因為多期二叉樹中會用到,兩個因子造成的影響也可能不一樣,所以我們暫且盡量用一般公式與常見叫法去表示)
另外,我們為了多期二叉樹能夠重合,也就是上漲下跌與下跌上漲的結果一樣,我們將u與d兩個因子設立一個約束條件u*d=1
這樣,我們從一期推廣到多期,就可以得到如下流程圖:多期二叉樹
也就是說,我們只要能知道p(上漲概率)與u(上漲因子),就能求出1-p(下跌概率),與d(因為約束關系),這樣整個未來的價格的路徑就能夠知道了。
好了,這樣我們就知道最簡單的標的資產,通過二叉樹的方法進行預測未來變動,是什么樣的路徑了。
我們接下來再把問題弄復雜一點,假設我們研究的不是簡單的標的資產,比如說并不是一個單一的項目(可以看做一系列的未來現金流)或者是一個簡單的股票,而是衍生品,也就是說定價是衍生在原標的資產上的產品,那我們如何進行定價呢?
這就涉及到了二叉樹運用非常多的一個方面——衍生品定價。
我們接下來還是以例子,只不過我們研究的不僅僅是標的資產(比如說股票stock),而是衍生在標的資產上的金融產品(比如說期權option),我們該如何定價呢?標的資產二叉樹標的資產上衍生的call option
對于Call Option(看漲期權),其實價格非常好計算,X為執行價格,就是max(X-S0u^1,0)或者是max(X-S0d^1,0),也就是說要么為執行價格與股價的差價,要么為0.
這樣,我們在0時刻的期權價格也非常好計算了,
期權價格= [ p ×上漲時期權價格 + (1?p) ×下跌時期權價格] × 折現因子
當然折現因子在這里可以用連續復利也可以用離散復利的方法折現,比較推薦連續復利,因為更加準確。利用連續復利的方法進行折現
那么我們到這里已經完全具備了建模的理論基礎了,我們接下來用Python建立二叉樹模型進行定價計算,這樣不僅能鞏固我們的概念,也能鍛煉我們的建模能力:
我們首先可以先調整numpy的顯示,因為如果期數較多的情況下jupyter notebook中會截斷大量數據,我們想讓數據全部顯示出來:
import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
然后我們只需要numpy幫我們儲存一下數據并且計算即可,當然也可以用pandas,但是因為數據結構并不復雜,有點大材小用,我們用array就能搞定了。
import numpy as np
我們現在可以自定義一個函數,把可以在市場上觀測到的信息作為參數:
def binomial_tree_call_option_pricing_model(N,T,S0,sigma,r,K,show_array=False):
dt=T/N
u=np.exp(sigma*np.sqrt(dt))
d=1/u
p=(np.exp(r*dt)-d)/(u-d)
其中N為期數,T為總時間,S0為初始價格,sigma為波動率,r為無風險利率,K為執行價格,show_array為一個開關,我們可以用show_array 來控制,是否顯示array。
dt為將總時間通過除以期數切分為每一個小段,每一個小段為一期二叉樹。
u為上漲多少,這個是根據上述講到的公式來確定的,同樣,為了二叉樹能重合,d=1/u,通過約束關系也能表示出來。
p為上漲概率,同樣根據上述講到的公式來確定的上述講到的公式
接著我們需要創建一個容器去儲存我們的數據,我可以用numpy的zero生成全部是zero的矩陣用作存放數據的容器:
但是因為這個容器是需要隨著數據的多少而隨之變化,也就是不能是固定的大小,于是我們可以通過變量進行解決:
price_tree=np.zeros([N+1,N+1])
然后我們就可以將這個容器里面的數據填滿了,我們首先填入的是價格,也就是比如標的資產是股票的話,股票在未來T時間段里的每一個dt期間變動的可能價格,我們全部放入:
for i in range(N+1):
for j in range(i+1):
price_tree[j,i]=S0*(d**j)*(u**(i-j))
這里有一個nested for loop的技巧,我們在很多list of lists, array等里面都會用到。另外,價格上升也下降我們通過N+1和i+1確定range,i和j的約束關系控制上漲個下跌的次數
接著我們依葫蘆畫瓢的方法先建立起option價格的tree:
我們首先計算每一個期權價格:
option_tree=np.zeros([N+1,N+1])
option_tree[:,N]=np.maximum(np.zeros(N+1),price_tree[:,N]-K)
然后我們把期權價格通過反向進行折現,求出t=0時刻的價格:
for i in np.arange(N-1,-1,-1):
for j in np.arange(0,i+1):
option_tree[j,i]=np.exp(-r*dt)*(p*option_tree[j,i+1]+(1-p)*option_tree[j+1,i+1])
然后我們就可以直接返回array的值就可以了,因為我們在參數中直接將show_array設置成了False,所以是默認不顯示出整個樹狀結構的:
if show_array:
return [option_tree[0,0],np.round(price_tree),np.round(option_tree)]
else:
return option_tree[0,0]
這樣我們能直接返回這個期權定價的初始價值,如果我們將show_array調成True,則執行第一段,將整個樹狀結構也就是每一個標的資產價值顯示出,當然,我們為了美觀,將array中的結果進行了round,沒有保留小數。
當然,我們還沒有討論一個問題,就是上漲概率和下跌概率與風險中性定價原則,我們在接下來為大家介紹......未完待續......
以上為《Python零基礎入門編程的新世界》部分內容筆記。用Python做爬蟲,數據分析,全棧建設,Fintech金融量化,機器學習,辦公自動化,樹莓派,美好生活DIY,......2000+連載,不僅有編程,還有更多原理講解。零基礎Python入門編程全棧量化AI - 網易云課堂?study.163.com
另外,也歡迎關注一個非常干的干貨公眾號: 樂學Fintech用代碼理解分析解決金融問題
總結
以上是生活随笔為你收集整理的python与金融建模_【用Python金融建模】从二叉树谈起:衍生品Option期权定价模型的构建...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京大数据挖掘培训,能从事那些领域?
- 下一篇: 导出excel:下载模板时填充数据方法实