読者です 読者をやめる 読者になる 読者になる

暇人の研究室

金融工学やR言語・統計学について書いてます。

<

【R言語】Rでブラック・ショールズ・モデルの計算をしてみる その2

 

www.tkstock.site

 

↑に引き続き、今度はプットオプションの価格をBSモデルを使って計算していきます。

 

 コールオプションが買う権利であるのに対して、プットオプションは売る権利なので、行使価格Kの値は大きい(原資産額が低い)ほど大きな利益をあげることのできる可能性があるため、そのプットオプションの価値は高まります。

 

もちろん、原資産が行使額Kより高くなった場合はオプションから得られる利益はマイナスであるため、コールオプションと同じように、権利行使をせずプットオプションの権利購入額分が損失となります。

 

 

そして、プットオプションの解はしたように定義することができます。

 

プットオプションの価格(P₀)=e(-r×t)×K×N(-d2) - S0×N(-d1)

 

またプットオプションとコールオプションは↓のような関係にあるためこれを利用して計算していきます。

 

P₀=C₀-S₀+e(-r×t)

 

この関係をプットコールパリティと言います。

 

これをRで書くと下のようになります。

 

###bsモデルからコールオプションとプットオプションの価格を計算する###

> blackscholes<-function(S,K,r,sigma,T)
+ {
+ d1<-(log(S/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T))
+ d2<- d1 - sigma*sqrt(T)
+ C0<-S*pnorm(d1)-exp(-r*T)*K*pnorm(d2)
+ P0<-C0-S+exp(-r*T)*K
+
+ return(c("コールオプション価格"=C0,"プットオプション価格"=P0))
+ }
>
>
> blackscholes(100,50,0.05,0.3,7)
コールオプション価格 プットオプション価格
66.736094 1.970498

 

 

 

このようにBSモデルを使えば原資産価格。行使価格・無リスク金利・ボラティリティ・期間が分かればオプション価格を計算することが可能です。

 

しかし現実ではオプション価格は既に分かっていて、このモデルを逆算することによってボラティリティ(IV:インプライドボラティリティ)を計算するというパターンの方が多いです。

 

ヒストリカルボラティリティとインプライドボラティリティ

 

 

 

【R言語】Rでブラック・ショールズ・モデルの計算をしてみる その1

 

www.tkstock.site

 

 

今回はRを使ってブラックショールズモデルの関数を作ってみます。

 

 

www.tkstock.site

 

 

今回は公式の通り、原資産額(S)・行使価格(K)・ボラティリティ(σ)・無リスク金利(r)・期間(T)を使ってコールオプションの価格(原資産額Sの金融商品をt期間後に行使価格Kを買う事のできる権利)を計算していきます。

 

###ブラックショールズモデルによってコールオプション価格を計算する関数を作る###

 

> blackscholes  <- function(S,K,r,sigma,T)
+ {
+ d1 <- (log(S/K)+(r+sigma^2/2 )*T) / (sigma*sqrt(T))
+ d2 <- d1 - sigma*sqrt(T)
+ C0<-S*pnorm(d1)-exp(-r*T)*K*pnorm(d2)
+ return(c("コールオプション価格"=C0))
+ }

 

 

これで関数が完成しました。次はこれに引数(S,K,r,sigma,T)に適当な数値を入れて関数を動かします。

 

###無リスク金利が0.05のとき、原資産額100の金融商品(ボラティリティ0.3)を7期間後に行使価格100を買う事のできる権利の価格を計算する###

 

> blackscholes(100,100,0.05,0.3,7)

 

コールオプション価格

43.41978  

 

コールオプションとは原資産価格Sの商品を、一定期間後に行使額Kで購入して売却するものなので、行使額Kが低ければ低いほど利益は大きくなるということになります。(行使額が原資産額を上回ってしまった場合は権利を行使しないことにより権利購入額分の損をすることになります。)

 

なので、行使額Kの値を低くすればするほどそのコールオプションの価値は上昇することになります。

 

> blackscholes(100,50,0.05,0.3,7) ##行使価格50のとき
コールオプション価格
66.73609

> blackscholes(100,30,0.05,0.3,7) ##行使価格30のとき
コールオプション価格
79.18537
> blackscholes(100,10,0.05,0.3,7) ##行使価格10のとき
コールオプション価格
92.95525

 

次にプットオプション(売る権利)の価格を計算していきます。

 

 

ブラック・ショールズ・モデル(BSモデル)を文系にも分かりやすく説明していく

 

 

導入

 

金融工学を勉強するにあたってまず知っておかなければいけないのが、ブラックショールズモデルというやつです。

 

このブラックショールズモデルというのは、金融工学の上では基礎中の基礎的な感じでよく話に上がりますが、その理論体系を理解するのは私みたいな文系からするとかなり厳しく感じました。(色んな参考書を読み漁って、高校の頃2Bまでしかやってなかった頭をフルに回転させて、なんとかブラウン運動とか微分方程式とか一通り理解できたつもり・・・です。)

 

参考書とかだと、まず式が先行して脳が理解することを拒否してしまうという方も多いと思うので、今回は超極力数式は使わずに解説していきたいと思います。(BSモデルの理論や式とかの詳しい話はコチラ)

 

 

 ブラック・ショールズ・モデルとは?

 

B&Sモデルは、1973年にアメリカのフィッシャー・ブラック(Fischer Black)とマイロン・ショールズ(Myron Scholes)が共同で発表し、ロバート・マートン(Robert C. Merton)によって証明されたオプション価格評価モデルで、ヨーロピアンタイプ(満期日にのみ行使可能なオプション)のオプション価格を計算するモデルです。

 

www.dmjtmj-stock.com

 


このモデルは、計算に必要なデータ(株価、行使価格、期間、変動率、金利)は市場で入手できるうえ、計算にかかる時間が非常に短いため、今でも実務界で広く利用されています。

 

とりあえず細かい説明は省いて、このモデルを何ができるのかというとオプション価格の計算ができるのです。このモデルが発表された当時は、まだ金融市場に数学を応用されておらず、BSモデルはその第一歩でした。

 

このためBSモデルの発見者であるフィッシャー・ブラックは、のちにノーベル経済学賞を受賞しています。まあそれくらい凄い数式なのだからマスターすれば、投資で大儲けできるのでは?と思う人もいるかもしれませんが、発見者の1人であるマイロン・ショールズと証明を行ったロバート・マートンが参加して設立した資金運用ファンドは大赤字を出して倒産しています。

 

なので、このモデルがそのまま使えるわけではなく、あくまで証券市場を数式で解き明かそうとした開拓者的な側面が強いです。一応フォローしておくと、決してブラック・ショールズ・モデルの理論自体が完全におかしいわけではないので、BSモデルの派生形が今もなお実務や分析でも使われていますし、研究も盛んです。

 

 

ブラック・ショールズ・モデルの意味

 

 このブラック・ショールズ・モデルが何をできるのかというと、あるオプション商品の権利行使時価格を、株価、行使価格、期間、変動率、金利から計算できるのです。

 

ですが現実はオプション価格の算出よりも、この式を応用したインプライドボラティリティの計算することの方が多いです。

 

ボラティリティとは? 

ヒストリカルボラティリティとインプライドボラティリティ

 

 

そして、ブラックショールズモデルの式はこんな感じです。

 

f:id:oruka199665:20170509181033p:plain

 

C(t,S): オプション価格の関数
t: 時間
S: 原資産価格(株価など)
K:満期時の価格
r: 無リスク資産の利子
σ: 資産価値の変動率
Φ:ガウス積分あるいは誤差関数
e:ネイピア数=2.71

 

eにrtという指数が付いているのは、時点 t で発生するキャッシュ・フローを、連続複利金利 r で現在価値に割引くためです。→【金融工学】 自然対数と複利計算

 

このモデルは前提として、数学や統計をやっていないとまず意味が分かりませんし、理論の途中で出てくる確率微分方程式に至っては大学教授レベルでちゃんと理解できる代物なので、理解できなくてもいいと思います。

 

ですが、とりあえずこのモデルの存在を知らないと金融工学モグリ同然なので、理解できなくても、こういうものがあるんだなぁというくらいは知っておいた方がいいと思います。

 

 

 

www.tkstock.site

 

 

【R言語】functionで関数を自作するための基礎知識 その1

 

Rの長所としてはfunction()という関数を使うことで特定の変数に自分の作った計算コードを保存できるという点があります。まあ自分で複雑なfunctionのスクリプトを書いてパッケージが作れるくらいが理想なのですが、現実はパッケージ頼りという人が結構多いと思います。

 

まあオブジェクト指向とif・forってプログラミングで一番躓く場所なので、そうなのも残念ながら当然という感じもしますが、とりあえずパッケージの関数の中身を見てRでは >?関数名 で関数の中身を見ることができます。

 

あーこういう処理をしてるんだなというのを少しずつ勉強していけば、いずれ自分でスクリプトを描けるようになると思います。

 

 

 

というわけで今回はfunction()の基本的な書き方について見ていきます。まず、function()を使った関数の定義式の書き方はこんな感じです。

 

 

>関数名 <- function( 引数1, ・・・ , 引数n ) {

<関数本体>

}

 

試しに簡単な関数を自作してみます。

 

##足し算する関数の作成##

> add<-function(x=10,y=20){
+ x+y
+ }

 

##引数を指定しなかった場合デフォルトの数値が使われる

 > add()
[1] 30

 

##引数を指定するとその値で計算してくれる

> add(100,200)
[1] 300

 

 

 

今度は少し実践的な書き方を見ていきます。関数で様々な演算を行った後に、計算結果を返すときは return または invisible を利用するのが一般的です。

 

return の場合は、計算結果を返すと同時に画面上に結果が表示されます。一方、invisible は計算結果を返しますが結果は画面上に表示されません。

 

 

 

###  return で返す関数 ###
> add <- function(x = 10, y =20) {
+ p <- x + y
+ return(p)
+ }



###  invisible で返す関数 ###
> add2 <- function(x =10, y = 20) {
+ p <- x + y
+ invisible(p)
+ }

 

 

関数の計算結果を受け取る変数があると、計算結果が変数に代入されるため、return と invisible どっちでも同じになります。

 

>x1 <- plus1(15, 25)
>x1
## [1] 40

>x2 <- plus2(15, 25)
>x2
## [1] 40

 


しかし、関数の計算結果を受け取る変数がないと、return だと計算結果が画面上に表示させるのに対して、invisible では計算結果を画面上に表示されず、見かけだけだと何も起こっていないように見えます。

 

> add(10, 20)
[1] 30

> add2(10, 20)
>

 

まあこの2つの違いはそこまで重要ではないのですが、パッケージのコードとか見るとreturnとかinvisibleとかが出てくるのでこの2つがどういう意味をもっているのかは知っておく必要があると思います。

 

 

【R言語】RでTwitterのデータを取得してみる

 

Rではウェブページのデータを引っ張ってくる(スクレイピング)するだけでなく、RからWEB APIを介してWEBサービスを利用することもできます。

 

 

今回は有名なAPI WEBサービスの1つであるTwitterのデータ取得します。これには「twitteR」というパッケージがとても便利です。

 

 

このパッケージは既に更新を停止していて、改良型の「retweet」というパッケージが推奨されているのですが、多分3.3じゃないと動かないっぽいし所々バグがあるので今回はとりあえずこっちを紹介します。

 

 

>install.packages("twittR")  ##パッケージのインストール 

>library(twittR)       ##パッケージの読み込み

 

 

Twitterのアカウントを取得していない方は、まずはアカウントを取得してください。
恐らく今時持ってない人はいないと思いますが一応→https://twitter.com/

 

 

そして、アカウントを取得したらTwitter Developersにアクセスし、サイトの下の部分にある「Manage my Apps」をクリックします。

https://dev.twitter.com/

 

 

Create an applicationが表示されるので、入力しろと書いてある部分に入力します。Websiteは自分のサイトのURLで構いません。もしないならこのサイトのURL(

http://www.tkstock.site/)でも問題ないです。

 

 

入力したら画面下のCreate your Twitter applicationをクリックしてアカウント確認のテストツイートをしたら設定完了です。

 

 

Rでツイッター分析をするのに必要なのは、Consumer Key (API Key)Consumer Secret (API Secret)Access TokenAccess Token Secretが解析に必要です。

 

 

ちなみに後半の、Access TokenとAccess Token Secretは、「Create my access token」をクリックすると作成してくれます。

 

 

これら4つの情報はいちいち確認するのがめんどくさいのでテキストかRのスクリプトなどにコピー保存しておくのが無難です。

 

 

 

conumerKey <- "自分のコンシューマーキー"
consumerSecret <- "自分のconsumerSecret "
accessToken <- "自分のアクセストークン"
accessSecret <- "自分のAccess Token Secret"

>setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

 

これで基本設定は終了で  serchTwitter('検索ワードを入力',n=抽出するツイート数)でツイッターの分析が可能になります。

 

 

 

【R言語】XMLパッケージでWebスクレイピングしてみる

 

 

今日はRを使ってウィキペディアからhtmlデータをスクレイピングしたいと思います。ちなみに、Rでのウェブスクレイピングはこちらの本をとても参考になりました。手元に置いておいて損はない一冊です。

 

 

 

 まずスクレイピングに必要なXMLパッケージを読み込みます。(インストールしていない方はinstall.packages(”パッケージ名”)でインストールしてください)

 

>install.packages(”XML”)

>library(XML)

 

 

 今回はエヴァのウィキペディア(新世紀エヴァンゲリオン - Wikipedia)をスクレイピングしていきます。

 

## ウェブページのデータを取得する ##

eva<-htmlParse(readLines("https://ja.wikipedia.org/wiki/新世紀エヴァンゲリオン")) 

 

 

次に必要な要素の抽出を行っていきます。要素はhtml,css,xpathごとに指定していきます。まずwikiにある文字を抽出してみます。

 

基本的にDOM(Rに読み込んだHTML)からノード(要素)を抽出するには、xpathSApply()という関数を使います。文章を抽出するには、第2引数を”//p”とし第3引数をxmlValueと指定します。タグを除去します。

 

###パースしたオブジェクトからXPathで文章を抽出する
> word <- xpathSApply(trg, "//p", xmlValue)
>
> head(word)
[1] "『新世紀エヴァンゲリオン』(しんせいきエヴァンゲリオン、Neon Genesis EVANGELION)は、日本のテレビアニメ作品。略称は「エヴァンゲリオン」「エヴァ」「EVA」。"
[2] "庵野秀明監督、GAINAXの原作によるSFアニメ作品。大災害「セカンドインパクト」後の世界(2015年)を舞台に…

 

 

これで文字列解析とかができます。ノードの抽出はgetNodeSet()でもできます。次は表を抽出します。グラフは<table>タグで構成されているので、引数を”//table”として指定すれば抽出できます。

 

> table<- xpathSApply(eva, "//table")

または

>table<-getNodeSet(eva,"//table")


> length(tmp)
[1] 44


> table1
<table class="plainlinks ambox ambox-content" role="presentation">
<tr><td class="mbox-image">
<div style="width:52px"><a href="/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Question_book-4.svg" class="image"><img alt="Question book-4.svg" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/50px-Question_book-4.svg.png" width="50" height="39" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/75px-Question_book-4.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/100px-Question_book-4.svg.png 2x" data-file-width="262" data-file-height="204"/></a></div>
</td>
<td class="mbox-text"><span class="mbox-text-span"><b>この記事は<a href="/wiki/Wikipedia:%E6%A4%9C%E8%A8%BC%E5%8F%AF%E8%83%BD%E6%80%A7" title="Wikipedia:検証可能性">検証可能</a>な<a href="/wiki/Wikipedia:%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E6%83%85%E5%A0%B1%E6%BA%90" title="Wikipedia:信頼できる情報源">参考文献や出典</a>が全く示されていないか、不十分です。</b><br/><a href="/wiki/Wikipedia:%E5%87%BA%E5%85%B8%E3%82%92%E6%98%8E%E8%A8%98%E3%81%99%E3%82%8B" title="Wikipedia:出典を明記する">出典を追加</a>して記事の信頼性向上にご協力ください。<small>(<span title="2014年7月">2014年7月</span>)</small></span></td>
</tr>
</table>

 

 

 

【R言語】Rでの単位根検定 その2

 

 

 

www.tkstock.site

 

 

というわけで前回に引き続き、Rでの時系列データを使った単位根検定を行っていきます。前回の結果としては2005年から2016年までのTOPIXのデータには、時系列分析を行う上で必要な定常性がありませんでした。なのでデータを加工することで、定常性を持たせることにします。

 

定常性の持たせ方は大きくこの5つです。

 

①データの差分を取る

②データを対数変換する

③データを対数変換して差分を取る

④データを指標(変化率など)に変換する

⑤データを指標に変換して差分を取る

 

まあ後のデータ計算も考えると⑤:対数変換して差分を取るというのが、一番オーソドックスな手法です。

 

> r.topix2016 <- diff(log(TOPIX2016)) ## データを対数変換して差分を取る

>  r.topix2016  <-  r.topix2016[!is.na(r.topix2016)] ##欠損地の削除


>  head(r.topix2016) ## データの確認
Close
2016-01-05 -0.004180864
2016-01-06 -0.009992065
2016-01-07 -0.023582617
2016-01-08 -0.003912562
2016-01-12 -0.027438276
2016-01-13 0.028436198

 

 

差分や対数変換については↓のリンクで解説しています。

 

www.dmjtmj-stock.com

www.dmjtmj-stock.com

 

 

というわけで、この対数変化率に加工した時系列データでADF検定(拡張ディッキー–フラー検定)に再挑戦してみます。

 

> adf.test(r.topix2016)

Augmented Dickey-Fuller Test

data: r.topix2016
Dickey-Fuller = -6.7341, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary

 

 

 

p値(p-VALUE)が0.01と極めて低いので、このデータは定常過程(定常性がある)と言えます。次は時系列モデルについて見ていきます。

 

 

www.tkstock.site

 

 

www.tkstock.site