2024/08/08
simulation_data
フォルダ内に格納している株式データch05_stock_data.csv
を読み込もう.stock_data
に格納されている各変数stock_price
: 月末時点での終値DPS
: 一株当たり配当額 (Dividend Per Share; DPS)shares_outstanding
: 月末時点での発行済株式数adjustment_coefficient
: 調整係数R_F
: 月次無リスク金利\(t+1\)期の配当性向 (\(\text{配当性向}_{t+1}\))の計算方法
\[ \text{配当性向}_{t+1} = \frac{D_{t+1}}{X_{t+1}} \]
\(t+1\)期のDOE (\(\text{DOE}_{t+1}\))の計算方法
\[ \text{DOE}_{t+1} = \frac{D_{t+1}}{Y_{t}} \] - 分母の1株当たり株主資本は,期首期末の平均 (\(=(Y_{t}+Y_{t+1})/2\))を採用したり,期末の\(Y_{t+1}\)を採用する場合などもある.
month_ID %in% 27:30
はmonth_ID
が27
, 28
, 29
, 30
を含んでいるという意味.DPS
であるが,権利確定月,及び一株当たりの受け取り配当を記録するデータである.firm_ID
が1
の企業について見てみると,2017年6月の月末時点の株主に対して,一株当たり43円の配当が支払われたことが分かる.1
以外の値を取る例adjustment_coefficient
は,株式分割や併合などに伴う株式数の変化を調整するためのデータである.2
として,リターンを計算する際に調整する必要がある.プライス・リターンとは?
stock_data
に時価総額ME
列をmutate()
関数を使って追加してみよう.トータル・リターンの計算式
\[ R_t = \frac{({\rm stock\_price}_t + {\rm DPS}_t) \times {\rm adjustment\_coefficient}_t - {\rm stock\_price}_{t-1}}{{\rm stock\_price}_{t-1}} \label{eq:definition_R} \tag{5.1} \]
lagged_stock_price
を定義してから,(5.1)式に基づいて月次のトータル・リターンR
をデータフレームstock_data
に追加している.ここで,\(R_{F,t}\)は同期間に安全資産で運用した場合のネット・リターンを指し,\(R_{t}^e\)の\(e\)は超過を意味するexcessの略である.
# 月次超過リターンの追加も加える
stock_data <- stock_data %>%
group_by(firm_ID) %>%
mutate(lagged_stock_price = lag(stock_price)) %>% # 前月株価をlagged_stock_priceと定義
ungroup() %>%
mutate(R = ((stock_price + DPS) * adjustment_coefficient - lagged_stock_price) / lagged_stock_price, # (5.1)式に従って月次リターンを計算
Re = R - R_F) # 月次超過リターンを計算
\[ \begin{align*} \underbrace{\left(\frac{W_{\text{3月}}}{W_{\text{12月}}}\right)}_{\textbf{グロスの3ヶ月間のリターン}} = \underbrace{\left(\frac{\cancel{W_{\text{1月}}}}{W_{\text{12月}}}\right)}_{1 + R_{\text{1月}}} \times \underbrace{\left(\frac{\cancel{W_{\text{2月}}}}{\cancel{W_{\text{1月}}}}\right)}_{1 + R_{\text{2月}}} \times \underbrace{\left(\frac{W_{\text{3月}}}{\cancel{W_{\text{2月}}}}\right)}_{1 + R_{\text{3月}}} \end{align*} \]
\[ \begin{align*} \underbrace{\left(\frac{W_{\text{翌年12月末}}}{W_{\text{12月末}}}\right)}_{\textbf{グロスの年次リターン}} & = (1 + R_{\text{1月}})\times (1 + R_{\text{2月}})\times \cdots \times (1 + R_{\text{12月}}) \nonumber\\ & = \prod_{t = \text{1月}}^{\text{12月}}(1 + R_{t}) \end{align*} \]
目標
stock_data
を基に,新しくannual_stock_data
というデータフレームを作成し,各銘柄の年次リターン,及びそれに対応する年次超過リターンをネットで計算してみよう.annual_stock_data
は,firm_ID
, year
, R
, Re
, R_F
の五変数で構成されるようにすること.simulation_data
フォルダにannual_stock_data.csv
として出力しておこう.(ヒント1) ネットの年次リターンは,単純にグロスの年次リターンから1を差し引けば良い.
(ヒント2) 各要素の積は,prod()
関数により求めることができる.
以下のコードでは,group_by()
関数を用いてfirm_ID
,及びyear
の各ペアに関して,stock_data
をグループ化し,summarize()
関数を用いて年次リターンR
,及びそれに対応する年次無リスク金利R_F
を計算した後,年次超過リターンRe
を定義している.
# 月次リターンを累積して年次リターンを計算
annual_stock_data <- stock_data %>%
group_by(firm_ID, year) %>% # firm_IDとyearのペアでグループ化
summarize(R = prod(1 + R) - 1, # バイ・アンド・ホールドの年次リターン
R_F = prod(1 + R_F) - 1) %>%
mutate(Re = R - R_F) %>% # 年次超過リターンの計算
select(firm_ID, year, R, Re, R_F) %>% # 必要な変数のみ選択
ungroup()
# head()関数により確認
head(annual_stock_data)
目標
firm_ID
が1
の銘柄の月次超過リターン\(R_{1,t}^e\)は,期待値の意味でゼロより大きいだろうか?
drop_na()
関数を利用して欠損値を除去した後の月次超過リターンのベクトルをRe_firm_ID_1
として定義している.# 月次超過リターンの期待値に関するt検定 (1)
Re_firm_ID_1 <- stock_data %>%
filter(firm_ID == 1) %>% # firm_IDが1の企業のみ抽出
select(Re) %>% # 月次超過リターンのみ抽出
drop_na() %>% # 欠損値を削除
unlist() # データフレームからベクトルに変換
mu0 <- 0 # 帰無仮説を期待値0と設定
n <- length(Re_firm_ID_1) # 標本サイズ
t_value <- (mean(Re_firm_ID_1) - mu0) / sqrt(var(Re_firm_ID_1) / n) # 定義に従ってt値を計算
## [1] 2.121296
t.test()
関数が用意されている.Financial Accounting