Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード

2009-07-25

リターン時系列の作成方法について(timeSeries Object)

| 17:13 | リターン時系列の作成方法について(timeSeries Object) - My Life as a Mock Quant を含むブックマーク

ポートフォリオ最適化や時系列解析をRmetricsで実施するには、対象とするデータをリターン時系列をtimeSeriesクラスで持つ場合が多いのですが、往々にして手元にあるのはデータが指数時系列で、それがCSVExcelファイル、DBの形で転がっているというようなケースが多いと思います。

ここでは指数時系列データ(CSV)を加工してRmetricsに喰わせやすいtimeSeries型のリターン時系列データにまで持っていく方法について書きます。

library(timeSeries)
#http://finance.yahoo.com/q/hp?s=^GSPC
#からCSVでダウンロードしたデータがC:\Temp\table.csvとして保存してあるとして読み込み
data.df <- read.csv("C:/Temp/table.csv")
#以下関数 as.timeSeries を呼ぶまでの処理は上記URLのデータの場合は不要だが
#ExcelからCSVを作成する際には日付表示のデフォルトが-(ハイフン)ではなく/(スラッシュ)で切れていることが多いので以下の処理が必要
#内容の確認.日付が日付系のクラスではなくFactorになっているのがわかる
head(data.df)
str(data.df)
#1列目の日付項目を日付型に強制変換.列名をDATEへ.as.Date関数で日付型にすると変換がうまくいかない。
data.df <- cbind(Date=as.POSIXct(data.df[,1]),data.df[,2:ncol(data.df)])
#内容の再確認。きちんとPOSIXct型になっているのがわかる
head(data.df)
str(data.df)
#終値だけのデータにして、timeSeriesオブジェクトへ変換する
data.df <- data.df[,c("Date","Close")]
data.ts <- as.timeSeries(data.df)
#内容の確認。
head(data.ts)
str(data.ts)
#指数データをリターン系列にするためにはreturns関数を使用。デフォルトは対数リターン、simpleで通常の収益率(Y/X-1の形)
return.ts <- returns(data.ts,method="simple")
head(return.ts)

tikunamitikunami 2009/10/18 22:07 毎週配達ありがとうございます。それももうすぐ終わりかもしれませんね。あ、更新してくださいね。

tikunamitikunami 2009/10/18 22:14 引越ししても続けてもらえると嬉しいですねぇ…。

2009-07-12

ポートフォリオ最適化・効率的フロンティアの作成(QP)

| 17:35 | ポートフォリオ最適化・効率的フロンティアの作成(QP) - My Life as a Mock Quant を含むブックマーク

マーコヴィッツアプローチ、俗にいうMean-Variance最適化、数理計画的には二次計画法によるポートフォリオ最適化法をRmetricsで行う方法。

プログラム内部にデフォルトで定式化されている問題は

min_{w} w^{T} ¥Sigma w

s.t

w^{T} ¥hat{¥mu} = r

w^{T} ¥vec{1} =1

w ¥geq 0

という空売りの許されないタイプの2次計画問題になっている。

これをスタートとしてさまざまな制約をユーザが課して行き、最終的な結果を取得する。

また、効率的フロンティア作成関数portfolioFrontierで作成されるfPORTFOLIOクラスのオブジェクトには最適化に使用された情報、および最適化結果が格納されている。

以下、コード

#ポートフォリオ用ライブラリのロード
library("fPortfolio")
#fPortfolioに用意されているSMALLCAPのリターンデータから6銘柄だけ抽出。(timeSeries型のオブジェクト)
data <- SMALLCAP.RET[,1:6]
#作成するフロンティアの条件設定.フロンティア上のポートフォリオを10個作成。
conditions <- portfolioSpec()
setNFrontierPoints(conditions) <- 10   
#データ、効率的フロンティアの作成
efficientFrontier <- portfolioFrontier(data ,conditions)
#効率的フロンティアを描画
plot(efficientFrontier,1)
#plot(efficientFrontier)後、選択画面から1を選択でも可能.
#そのほか
#最小リスクポートフォリオ(2)
#接点ポートフォリオ(3)
#各資産のリスクリターン平面での位置(4)
#等ウェイトで保有した場合のポートフォリオ(5)
#指定したデータの2資産ごとを保有した場合のフロンティア(6)
#モンテカルロシミュレーションで算出したポートフォリオ(7)
#シャープレシオ(8)
#が追記描画可能(0で終了)


#ウェイト制約を追加してみる。
#1、2番目の資産の最低保有ウェイトがそれぞれ10%,20%
#各資産の最大ウェイトが50%という意味
weightConstraints <- c("minW[1:2]=c(0.1,0.2)","maxW[1:6]=0.5")
efficientFrontier <- portfolioFrontier(data ,conditions,weightConstraints)
#ウェイト制約が満たされているか確認
print(efficientFrontier)
#効率的フロンティアを描画
plot(efficientFrontier,1)
#以下のような特殊な描画が可能な関数も用意されている。
#フロンティア上の点での資産ウェイトのプロット
weightsPlot(efficientFrontier)
#各資産が全体のリスクをどのくらい占めているかというリスクで見た資産配分プロット(リスクバジェッティング)
covRiskBudgetsPlot(efficientFrontier)
#接点ポートフォリオ、各資産の位置等がデフォルトで記述される効率的フロンティア描画関数
tailoredFrontierPlot(efficientFrontier)

#各資産を”グルーピング”して制約条件を課すことも可能
#1番目の資産と2番目の資産の投資ウェイトの合計が30%以上、3番目と4番目の資産の合計が50%以下
groupConstraints <- c("minsumW[c(1,2)]=0.3","maxsumW[c(3,4)]=0.5")
#個別資産の投資ウェイト制約も同時に適用し効率的フロンティアを記述
efficientFrontier <- portfolioFrontier(data ,conditions,c(weightConstraints,groupConstraints))
#結果確認
print(efficientFrontier)

ku77ku77 2012/04/08 10:46 を始めて3日目です(汗
素晴らしい、記事の数々に感激です。
質問させていただくのも大変気が引けるのですが、
下記、minvariancePortfolio(Data)とportfolio.optim(Data)の最適解が一致しません。
minvariancePortfolio(Data)の解は、自作の2次計画法ルーチンの解と有効数字4桁で一致します。

ヒントだけでも、ご教唆いただければ大変助かります。

library(tseries)
library(fPortfolio)

Data = SMALLCAP.RET
Data = Data[, c("BKE", "GG", "GYMB", "KRON")]
#class(Data)

#自作の2次計画法ルーチンの解と一致。こちらの解が正解のようです。
minvariancePortfolio(Data)
#一致しない?
portfolio.optim(Data)

teramonagiteramonagi 2012/04/09 07:12 >minvariancePortfolio(Data)
の方はその名の通り「最小分散ポートフォリオ」を結果として返している一方、
>portfolio.optim(Data)
の方はデフォルトだと
> mean(Data)
[1] 0.02430841
の値を期待リターンとして、このリターン制約の下で一番リスクを小さくするような最適化を行っているので、そこでずれてくるのかと。

最小分散の結果が返してくるリターンの値(この場合0.0265)
>Target Return and Risks:
> mean mu Cov Sigma CVaR VaR
>0.0265 0.0265 0.0931 0.0931 0.1324 0.0901
を指定して計算してやると(portfolio.optim(Data, 0.0265))
だいたいイイ感じに結果が合いまっせ。

ku77ku77 2012/04/09 23:03 ありがとうございます。

おかげ様でよく理解できました!!

teramonagiteramonagi 2012/04/10 20:04 どういたしまして〜!

2009-06-20

プレーン・バニラ・オプションのインプライド・ボラティリティの算出

| 15:09 | プレーン・バニラ・オプションのインプライド・ボラティリティの算出 - My Life as a Mock Quant を含むブックマーク

プライシングはこちら

「プレーン・バニラ・オプションのプライシング」

http://d.hatena.ne.jp/teramonagi/20090610/1244645460

リスク指標算出はこちら

「プレーン・バニラ・オプションのリスク指標算出」

http://d.hatena.ne.jp/teramonagi/20090615/1245076200

一般化ブラックショールズマートン方程式からインプライド・ボラティリティを算出するためにはGBSVolatility関数を使用する。

GBSVolatility(price, TypeFlag, S, X, Time, r, b, tol, maxiter)
price:オプション価格
b:キャリーコスト(年率)
r:金利(年率)
S:原資産価格
Time:満期までの期間(年)
TypeFlag:"c"でコールオプション、"p"でプットオプション
X:行使価格
maxiter, tol:インプライドボラティリティ算出のために使用される、最大反復回数と計算精度。
(内部で根を探す関数unirootが使われているっぽくその関数の引数と思われる)

注意すべきはプライシング・リスク指標と同様に

キャリーコストb=金利rとすれば通常のブラック・ショールズ・マートン公式

キャリーコストb=0とすればブラック76先物公式

キャリーコストb=金利r-配当利回りqとすればマートンの株式オプションモデル

と扱われる点。

例:5ヶ月物の株式コールオプションのインプライドボラティリティ

(株価62円・行使価格60円・金利10%・配当なし・オプション価格5.797785円)

#ライブラリのロード
library(fOptions)
#インプライド・ボラティリティの算出
GBSVolatility(price = 5.797785,TypeFlag = "c", S = 62, X = 60, Time = 5/12, r = 0.10, b = 0.10)

無論、ここから出てくるボラティリティ(0.2)を使用してオプションの価格を計算すると5.797785円となる。

2009-06-15 プレーン・バニラ・オプションのリスク指標算出

プレーン・バニラ・オプションのリスク指標算出

| 23:30 | プレーン・バニラ・オプションのリスク指標算出 - My Life as a Mock Quant を含むブックマーク

プライシングはこちら

「プレーン・バニラ・オプションのプライシング」

http://d.hatena.ne.jp/teramonagi/20090610/1244645460

リスク指標(Greeks)の算出にはGBSGreeks関数を使用する。

また、同時にプライシングも行う場合にはGBSCharacteristics関数を使用する。

GBSCharacteristics関数ではリスク指標を一括で算出もしてくれて便利。

GBSGreeks(Selection, TypeFlag, S, X, Time, r, b, sigma)
GBSCharacteristics(TypeFlag, S, X, Time, r, b, sigma)
b:キャリーコスト(年率)
r:金利(年率)
S:原資産価格
sigma:ボラティリティ
Time:満期までの期間(年)
TypeFlag:"c"でコールオプション、"p"でプットオプション
X:行使価格
Selection:リスク指標の種類。デルタ"delta",ガンマ "gamma",ベガ "vega",シータ "theta",ロー "rho"、ラムダ "lambda"

注意すべきはプライシングと同様に

キャリーコストb=金利rとすれば通常のブラック・ショールズ・マートン公式

キャリーコストb=0とすればブラック76先物公式

キャリーコストb=金利r-配当利回りqとすればマートンの株式オプションモデル

と扱われる点。

例:5ヶ月物の株式コールオプションのデルタ

(株価62円・行使価格60円・ボラティリティ20%・金利10%・配当なし)

#ライブラリのロード
library(fOptions)
#デルタの算出
GBSGreeks(Selection = "delta", TypeFlag = "c", S = 62, X = 60, Time = 5/12, r = 0.10, b = 0.10, sigma = 0.20)
#プライシングとリスク指標の一括算出
GBSCharacteristics(TypeFlag = "c", S = 62, X = 60, Time = 5/12, r = 0.10, b = 0.10, sigma = 0.20)

2009-06-10

プレーン・バニラ・オプションのプライシング

| 23:51 | プレーン・バニラ・オプションのプライシング - My Life as a Mock Quant を含むブックマーク

RmetricsにはfOptionsと言うライブラリがあり、

これを用いることで(汎用)ブラック・ショールズ・マートン公式によるプレーンバニラオプションのプライシングを行うことができる。

(汎用ブラック・ショールズ・マートン公式はこちらを参照:http://www.findai.com/kouza/4009opt.html

プライシングには関数

GBSOption(TypeFlag, S, X, Time, r, b, sigma, title = NULL, description = NULL)
BlackScholesOption(...)
Black76Option(TypeFlag, FT, X, Time, r, sigma, title = NULL, description = NULL)
b:キャリーコスト(年率)
r:金利(年率)
S:原資産価格
FT:先物価格
Time:満期までの期間(年)
title:名前がつけられる
TypeFlag:"c"でコールオプション、"p"でプットオプション
X:行使価格

を使用する。

GSBOptionが親玉の関数でGBSOptionはそのラッパー関数、Black76Optionはb=0と値決め打ちの関数となる。

(Black76Optionで出てくる値はGBSOptionでb=0,FT=Sとすれば同一)

注意すべきは

キャリーコストb=金利rとすれば通常のブラック・ショールズ・マートン公式

キャリーコストb=0とすればブラック76先物公式

キャリーコストb=金利r-配当利回りqとすればマートンの株式オプションモデル

となる点。

例:5ヶ月物の株式コールオプションの価格

(株価62円・行使価格60円・ボラティリティ20%・金利10%・配当なし)

#ライブラリのロード
library(fOptions)
#プライシング
pricing <- GBSOption(TypeFlag = "c", S = 62,X =60,Time=5/12,r=0.1,sigma=0.2,b=0.1) 
#プライシング結果データ構造の確認
str(pricing)
#S4クラスで出力されるので、各種情報にアクセスするには@を使用する。
#価格
pricing@price
#原資産価格
pricing@parameters$S

pseudoquantpseudoquant 2009/06/11 22:48 「注意すべき」ところであるキャリーコストについて、実はbはキャリーコストじゃないってことのように見えますが、そういうことですよね?
リンク先のページの表現中のqをbとみて、
exp(-bt)S_0N(d_1) - exp(-rt)KN(d_2)
とみると、あからさまに合わない。どこか私の見方がおかしいのだろうか。

teramonagiteramonagi 2009/06/12 00:11 Rのマニュアルの中ではb = r - q となっているのでこれならわかりやすいかと思います。
つまり株を持たないで現金を保有した際のリターン(コスト)がbということです。

キャリーリターン(コスト)についてはこちらがお奨めです。
http://japan.pimco.com/LeftNav/Bond+Basics/2006/Basics+Carry+Rolldown.htm

pseudoquantpseudoquant 2009/06/17 23:15 キャリーコストの定義について、前に曖昧な話をしましたが、普通はRの定義のようにr-qとして考えておくとよいようですね。
株の先渡契約で、先渡しの売りポジションをヘッジするとしたら、
Cash and Carry (資金調達して株を買って保持)することになるわけです。
配当がなければ、無裁定な先渡価格は 直物価格 + 金利となり、金利がキャリーコストとなる。
配当があれば、直物価格 + 金利 - 配当となり、金利 - 配当がキャリーコストになるいうことですね。
つまり通常、先渡価格には、現物をキャリー(保持)することによるコストが価格として上乗せされている、ということになりますね。