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

暇人の研究室

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

<

【R言語】Rでのプログラミング  その2

・条件式と論理記号

 

==:等しい !=:等しくない !:~でない

 

・条件ごとに異なる処理を行う

 

条件ごとに異なる処理を行う場合はswitch()を使います。

 

> x<-2
> y<-5
> z<-"+"
> switch(z,
+ "*"={print("掛け算");x*y},
+ "+"={print("足し算");x+y})
[1] "足し算"
[1] 7

 

第1引数には条件を指定します。次に続くのが実行式であり、文字列と「;」を挟んだ右側にあるやつです。

 

 

・繰り返し文

 

次はスクリプトを書く上で絶対必須である繰り返し分を取り上げていきます。Rでは、for()で繰り返し処理ができます。

 

試しに1から10000までの数字の合計を繰り返しで計算してみます。

 

> x<-1:10000
> i<-0
> for(a in x){
+ i<-i+a
+ }
> i
[1] 50005000

 

これは足し算の結果を「i」というオブジェクトに保存し、そしてループで「i」を上書きしていくというものです。

 

また繰り返す回数をしてしないときはwhile()を使います。

 

> i<-0
> while(i<100){
+ i<-i+1
+ }
> print(i)
[1] 100

 

ここで「i」の更新方法(上の式の i<-i+1 の部分)を指定忘れると無限にループになりRを強制終了しないといけなくなるので注意しましょう。

 

 

・ループの終了とスキップの指定

 

nextbreakを使えば条件が満たされた場合にループを終了したりスキップすることができます。

 

 

 

> i<-0
> while(i<100){
+ i<-i+1
+ if(i%%30!=0)next
+ if(i%%90==0){
+ cat("\n")
+ break
+ }
+ cat(i,"\t")
+ }
30 60

 

この式は30の倍数になったら画面に表示し90で打ち切るというものです。30で割れるかどうかは%%演算子(余りを求める演算子)で調べられます。

 

もちろん割り切れる場合は0ですが、割り切れない場合は0ではありません。なので、条件式の後にnextを加えることによって、割り切れなかったら次に行くとしています。

 

そしてiが90になったら、cat()で結果を画面に出力させ、breakでループを打ち切るとしています。

 

【R言語】Rでのプログラミング  その1

 

・条件文(if文)

 

Rでは、ifとelseを使って条件文が書けます。

 

書式は>if (条件式) (処理) else (処理) といった感じです。

 

簡単な例としてxが10未満かどうかを判定し結果を表示します

 

> if(x<10)"YES"else"NO"
[1] "YES"

 

ちなみにRにおいて不等号(≦・≧)は<=,>=と表されます。

そして当たり前ですが、条件式は改行したほうが分かりやすいです。

 

>if(x >= 10) ## xが10以上ならyes、そうでないならno
"YES"
else
"NO"

 

すると、エラー: 予想外の 'else' です。と返されます。Rではelseは先頭におけません。

elseを使う場合は{}を使います。

 

> if(x >= 10){
+ "YES"
+ }else{
+ "NO"}
[1] "NO"

 

とまあ変数xが一つの数字であればこんな感じでできるのですが、Rの良く挙げられる長所はオブジェクトにベクトルやデータフレームを入れて効率的なデータ処理ができるという点です。

 

次はxにベクトルを入れた場合を見ていきます。

 

 

・ベクトルを使った条件文

 

ベクトルにおける条件式を描きたいときはifelse関数を使います。おそらくこれがRでスクリプトを描くときに一番使います。

 

> y<-1:100
> y
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100

 

> ifelse(y<10,"yes","no")
[1] "yes" "yes" "yes" "yes" "yes" "yes" "yes" "yes" "yes" "no" "no" "no"
[13] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[25] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[37] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[49] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[61] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[73] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[85] "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no" "no"
[97] "no" "no" "no" "no"

 

 

ifelseの書式はこんな感じです。

>ifelse(条件式,"条件を満たしたときの処理","条件を満たしていなかった時の処理")

 

 

ただifelse()は、条件に合った場合だけ処理を行うのではなく、ベクトル内のすべての要素に、真の場合と偽の場合の両方の処理を行ってから条件式に当てはまる結果を返しているので、条件に当てはまっていないベクトル内の要素の数値が変わってしまいます。

 

 

 

 

【R言語】Rによるウェブスクレイピング その1

 

 

Rで実際にウェブ上のHTMLデータをスクレイピングするには、rvestパッケージがオススメです。

 

 

インストールと読み込み

>install.packages("rvest")
>library(rvest)

 

まず例として簡単なHTML(https://ishidamotohiro.github.io/sample_check/simple.html)を読み込みます。

 

f:id:oruka199665:20170421174451j:plain

 

アクセスすれば分かりますが、なんか仕込んでるのか疑うレベルの本当に単純なやつです。

 

 

では実際にこのサイトのHTMLを収集します。rvestパッケージではread_html()という関数でやってくれます。そして、収集したデータをsimpleというオブジェクトに保存します。

 

> simple <- read_html("https://IshidaMotohiro.github.io/sample_check/simple.html")

 

これでできたはずなので、オブジェクトにアクセスして確認してみます。


> simple
{xml_document}
<html>
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF ...
[2] <body>\n <h1>大見出し</h1>\n <a href="http://www.okadajp.org/RWiki/"> ...
>

 

Rのデータってサンプルデータみたいな行列で区切られたデータが一般的なので、ちょっと意味が分からないというのが初めて見た感想だと思います。

 

 

これはHTMLをツリー状で表現するDOMという形式で保存されています。

 

html

→head

  →title(ページタイトル)

→body

  →h1(見出し)

 

 

www.tkstock.site

 

 

それでは要素を検索していきます。rvestパッケージではhtml_nodes()という関数で検索・抽出ができます。

 

 

まず見出し要素(h1)を抽出してみます。

 

> simple %>% html_nodes("h1")
{xml_nodeset (1)}
[1] <h1>大見出し</h1>

 

タグを抜いて文字列だけを抽出したい場合は、html_text()関数を使います。

 

> simple %>% html_nodes("h1") %>% html_text()
[1] "大見出し"

 

 

次にリンクを抽出します。

 

> simple %>% html_nodes("a") %>% html_attrs()
1
href
"http://www.okadajp.org/RWiki/"

2
href target
"http://rmecab.jp" "_blank"

>
> simple %>% html_nodes("a") %>% html_attr("href")
[1] "http://www.okadajp.org/RWiki/" "http://rmecab.jp"
>

 

見出しとリンクはこのようにして抽出することができます。ちなみにhtml_nodes()の因数はx、css、pathの3つがあり、xはDOMに置換されたhtmlの抽出で、残り2つはcssとxpathを抽出します。

 

 

www.tkstock.site

 

 

次は表の抽出やAPI、JSON形式のデータ抽出を見ていきます。

 

 

追記:スクレイピングについて本格的に勉強するならばこちらの本がオススメです。入門と書いてますが実務で使えるレベルのことが分かりやすく書いてあります。

 

 

 

【プログラミング】HTMLの仕組み

 

 

近頃はビックデータの時代でデータ集めや分析が簡単になりました。そしてデータの収集先で一番多いのがインターネットです。

 

 

インターネットからデータを集める方法の1つとしてサイトのHTML情報をそのまま引っ張ってくる所謂、スクレイピングというものがあります。

 

 

そして、Rなどほとんどのプログラミング言語では収集したHTMLはDOMという形式に変換されて保存されます。そしてDOMから必要な部分を検索したり抽出してデータ分析を行うのです。

 

 

ですが、HTMLについて知らなければデータを引っ張って来ても扱い方が全然わからないということになります。(私がそうでした)なので、今回はHTMLについてざっくり見ていきたいと思います。

 

 

 

・HTMLとは?

 

 HTMLとはHyper text markup languageの略で文書を構造化するために形式で、国際的な基準となっているフォーマットです。

 

 

・HTMLの形式

 

ブログとかをやってた人はなんとなく分かると思いますが、HTMLはざっくり表すとこんな形式です。基本としては<html>~</html>の中に要素を詰め込みます。

 

 

<html ...>
<head>
ヘッド要素の内容
</head>
<body>
ボディ要素の内容
</body>
</html>

 

 

・HTMLの要素

 

1番目の部分をHTMLのhead要素といい、2番目の部分をbody要素といいます。この2つをあわせたもの、つまりHTMLの本体をhtml要素といいます。

 

 

このように、HTMLは文書を構成するパーツを「要素」と呼んで、要素の組合せとしてページを作り上げていきます。

 

 

さて、私たちが勝手に「これは要素だ」と決めても、それを何らかの方法で明示してあげないことには、「利用者」には区別がつきません。

 

 

そこで、文中に「ここからここまでがこの要素だ」という目印を付けることにします。この目印を「タグ」と呼び、目印を付けていくことを「マークアップ」といいます。

 

 

このように、HTMLは「タグ」で構成されているので、スクレイピングしたデータを分析する際はタグの文字で検索を掛けていくことになります。

 

 

ちなみに、スクレイピングについてはこちらの本が解説しているのでオススメです。入門と書いてますが、実務でも使えるレベルです。

 

 

 

【R言語】dplyrパッケージの使い方

 

今回はRでデータ処理を効率的に行うのを手助けしてくれるパッケージの一つであるdplyrパッケージの使い方を紹介していきます。この記事ではざっくりとした説明で、詳しく知りたい方はこちらの本に書いてあるので是非どうぞ

 

 

 

 

パッケージのインストールと読み込み

>install.packages("dplyr")

>library(dplyr)

 

 

www.dmjtmj-stock.com

 

 

内臓データの呼び出し

> head(ToothGrowth)
len supp dose
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10.0 VC 0.5

 

 

>?オブジェクト名で確認すると、このデータは60匹のネズミにビタミンCを与えた場合の歯の長さを図ったデータだそうです。

 

 

条件を満たすものの抽出

> ToothGrowth[ToothGrowth$supp=="OJ",]
len supp dose
31 15.2 OJ 0.5
32 21.5 OJ 0.5
33 17.6 OJ 0.5
34 9.7 OJ 0.5


 

これはsuppの列でOJと書いてあるデータを抽出しろという意味になります。==は等しいを意味し、,はカンマ前が行、カンマ後が列を示しています。[行,列]というイメージです。
 
 
この場合、カンマ後を空欄にして]で閉じることでOJと書いてある列の行を全部取り出せということになります。
 
 

他にもsubset()を使って抽出する方法もあります。subsetの場合は

 

>subset(ToothGrowth,supp=="OJ")

 

まあ単一条件の場合ならこの書き方でもいいのですが、もし、性別が女で身長が160以下で体重が50kg以下みたいな複数条件で抽出したい場合は、この書き方だととても汚くなってしまいます。

 

 

そのため複数条件で抜き出すときは%>%演算子を使うのがオススメです。パイプ処理というやつです。

 

>ToothGrowth %>% filter(supp == "OJ") %>% head()

 

 

 

・データ操作に必須の関数一覧

 

 

・ filter()

また列の数値が〇〇以上などの指定した条件で抽出をかけたい場合は filter()が有効です。長さが25以上でdoseが1以上のデータを抽出したい時はこんな感じです。

 

>ToothGrowth %>% filter(length > 25, dose == 1)

 

 

・mutate()

 データフレーム内の値を操作したいときはmutateを使います。mutateで新たに列を追加することができます。今回はlengthの長さをインチ表記にしたlen2という列を新たに作ります。

 

> ToothGrowth %>% mutate(len2 = length * 0.039) %>% head()

 

 

またデータを上書きしたいとき、dplyrでは%<>%演算子で上書きが可能となります。

 

>library(magrittr)
>ToothGrowth %<>% mutate(len = length * 0.039) %>% head()

 

 

dplyrには他にも、arrannge()やgroupby()など便利な関数がたくさんあります、dplyrについては使う機会があればまたメモします。

 

 

 

追記:Rで株価や決算書のデータを処理・分析したい方はこちらの本がとてもオススメです。

【金融工学】ポートフォリオ理論とCAPM

 

 

今回はファイナンスにおける債権のリスクの計算方法の一つであるCAPM理論について取り上げていきたいと思います。

 

 

まず今2つの証券ABを保有しているとします。そして、A・Bそれぞれの収益率:rA,rBは平均:μA,μB、分散:σA,σBの確率分布の実現値とします。そして2つの共分散をσABと表します。

 

 

確率分布?共分散?となってしまう方は↓の記事を見ていただけると理解できると思います。

【統計学】確率変数・確率分布の分かりやすい説明

【統計学】 共分散と相関係数の簡単な説明 

 

 

今この2つの証券でポートフォリオを組むという事はそれぞれの証券をs:tの割合で保有するという事になります。(s+t=1)

 

 

手数料などは考慮しないとするとこのときの月次収益率:rは、r=s×rA+t×rBで算出されます。このrをポートフォリオ収益の確率変数からの実現値と考えれば、ポートフォリオの確率変数は平均と標準偏差は期待リターンとリスクを表しているという事になります。そして、このポートフォリオの期待収益率とリスクを式で表すと、下のようになります。

 

 

E(R)= s × μA + t × μB

SD(R)= √s²σ²A + t²σ²B + 2st σAB

 

 

上でも述べたようにσABは2つの証券ABの共分散であり、この値はAとBの相関関係が強いほど数値が大きくなります。なのでAとBの相関関係が小さいほどリスクの値は小さくということになります。

 

 

そしてこのE(R)とSD(R)とs+t=1を連立し、そのリスクとリターンの関係の軌跡を図で表すと下のようになります。

 

http://words.equity-investment.info/img/%E6%9C%89%E5%8A%B9%E3%83%95%E3%83%AD%E3%83%B3%E3%83%86%E3%82%A3%E3%82%A22.jpg

参照:http://words.equity-investment.info/portfolio.theory.html

 

 

下半分の点線になっている部分は、リスクの方がリターンよりも高くなっているので、無視します。つまり大切なのは上の部分でこのカーブの事を効率的フロンティアと言い、かのカーブの上で最も分散(リスク)の小さいポートフォリオを最小分散ポートフォリオと言います。

 

 

次に効率的な部分の中でより効率の高い部分の絞り込みに入るわけですが、このカーブだけでは決まることができないので、無リスク資産の金利を使います。無リスク資産のポートフォリオは(0、r)※rは無リスク金利を切片した直線(資本市場線)で表すことができます。資本市場線の計算は難しいのでここでは省略します。

 

 

ここで市場が、参加者が常に同じ価値観のもと効率的に行動し、証券の情報は常に株価に織り込まれる効率市場仮説であると仮定した場合、接点ポートフォリオは市場ポートフォリオ(全ての証券を時価総額の比率で購入したポートフォリオ)と一致します。

 

 

そしてこの理論を1つの証券に当てはめた場合、その証券の期待収益率:E(R)は下のような式になります。

 

E(R)= r + β ( E (Rm) ー r )

 

 

rは無リスク資産の金利、E(Rm)は市場リターン、βはβ値を表しています。

【金融工学】 β値(ベータ値)とは?

 

 

そして、このβを推定するために使われるのが、線形モデル(回帰分析)の考え方です。具体的には個別証券の収益率(y)とインデックス指数の変化率(x)を回帰分析し、y=βx+αの β の部分がβ値とされます。

 

このCAPMによって計算された個別証券の期待収益率は、企業価値の算出においてはその証券に投資することで期待される収益(株主の期待収益率)であることから、株主資本コストの値とされます。

 

 ↓の本は、こんな感じで証券のリスクリターンの数値化などについてできるだけ分かりやすく説明しているのでもし興味があればどうぞ

 

【金融工学】ファイナンスにおける相関の意味

 

・相関とは?

 

 

まずおさらいですが、「相関」とは2つの変数(データ)の関わり具合を示しています。

 

 

「相関が高い」とは2つの変数が互いに密接に結びついているという事を指し、反対に「相関が低い」場合は2変数間の関係は薄いという事になります。そして「無相関」とは2変数の間に何の関係もないことに意味します。

 

 

また「相関」がある場合でも「正の相関」と「負の相関」の2種類が存在します。「正」の相関とは、1つの変数が上昇(下降)すればもう1つの変数も上昇(下降)する関係を指し、「負の相関」とは1つの変数が上昇(下降)すればもう一つの変数は下降(上昇)するという関係のことを言います。

 

 

株式市場の場合であれば、同じ業種の株式は比較的相関関係が高いと言われています。そしてこのような相関を調べるのが相関係数と言われるものです。

 

 

www.dmjtmj-stock.com

 

 

・ファイナンスにおける相関の使われ方

 

 

現代のファイナンス分野では、株式は対数差収益率を確率変数とみて分析することが一般的です。

 

 

では、これをどのよう使って株式投資における利益へとつなげるのかというと、もし自分が持っている株式間の相関が分かれば、市場が大きく下落した時に1つの株式の暴落に他の株式が同じように暴落するかどうかなどがある程度予測できます。

 

 

このように複数の証券を組み合わせて保持することをポートフォリオと言います。そして一つの証券を単独で持つよりも複数の証券を組み合わせてポートフォリオとして持つ方がリスクは分散できると金融工学の分野では理論的に証明されています。

 

 

これは分散投資効果と呼ばれ、そのリスクを計算する上において標準偏差が使われますが、その値は証券間の相関係数に大きく左右されます。

 

 

つまりなぜファイナンスにおいて2変数(この場合だと2つの証券)の相関を調べることが大切なのかというと、リスクを回避しつつ安定的に収益を生み出すポートフォリオを構築するのに不可欠だからです。

 

 

 

・収益率と相関の注意点

 

 

収益率で相関関係を把握する際は、対数差収益率ではなく累計収益率を使わなければなりません。また配当などがあるかどうかも分析によっては注意しなければなりません。

 

 

↓の本は、こんな感じで証券のリスクリターンの数値化などについてできるだけ分かりやすく説明しているのでもし興味があればどうぞ