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