ポートフォリオ1
数式を載せたかったのですが,Markdownからの変換がうまくいかないので,軽い説明とプログラムだけ載せます.
まず,使用するデータをプロットする.
これだと,データが対数増加率で正則化する.
# 対数増加率 r_df = np.log(df / df.shift(1)) # 累積利益率にする cum_df = r_df.cumsum().dropna()
累積対数利益率でも同じグラフが描かれる.
平均-分散ポートフォリオを作成するので,平均と銘柄同士の共分散行列を求める.
mean = cum_df.mean() cov = cum_df.cov() std = np.sqrt(np.diag(cov))
を計算すると,最大$S=2.2$,最小$S=-0.4$となった.
5銘柄の投資可能集合を計算する.
allocate5 = [] for i in range(0, 101, 10): for j in range(0, 101 - i, 10): # j <= 100 - i for k in range(0, 101 - i - j, 10): # k <= 100 - i - j for l in range(0, 101 - i - j - k, 10): # l <= 100 - i - j - k allocate5.append([i, j, k, l, 100 - i - j - k - l]) # [i, j, k, l, 残り] allocate5 = np.array(allocate5) / 100
Rの追加機能
Rの追加機能
Rにはたくさんのライブラリ、パッケージが用意されています。
それらは、ブラックボックス的な位置づけですが、コードを書く時にはそれらを利用することでストレスをかけずに作成することができます。
ライブラリ、パッケージをインストール
readxlはExcelファイルを読み込むためのライブラリです。 dplyrはパイプ演算を提供し、コードを簡単に書くことができます。
install.packages("readxl", dep=T) install.packages("dplyr")
ライブラリをロードする
インストールしたパッケージを使用するにはロードする必要があります。
library(readxl) library(dplyr)
Excelからデータを取得
testsオブジェクトにExcelのデータを読み込みます。
tests <- read_excel("classData.xlsx")
パイプ演算子
パイプ"%>%"は左から右にデータを流していき、それぞれデータの処理を行います。 また、Ctrl+Shift+Mでショートカット作成することができます。
tests %>% summary() tests %>% select(English:Mathematics) %>% var #分散、共分散を全て求める tests %>% select(English:Mathematics) %>% summarise_all(var) #分散のみ tests %>% select(English:Mathematics) %>% summarise_all(sd) #標準偏差
Rの基本的な統計処理
統計処理
R言語を用いて、平均値、中央値、四分位数などの基本的な計算を行います。
csvファイルからデータの取得
"<-"記号は代入するという記号です。head()関数で先頭から6行を表示します。 xオブジェクトの中のMethematicsを選択するには"$"記号で選択します。
x <- read.csv("classData.csv") head(x) x$Mathematics
平均値、中央値、分散、標準偏差
平均値にはmean、中央値にはmedianを使用します。
math <- x$Mathematics mean(math) #平均値 sum(math) / length(math) #平均値 median(math) #中央値 var(math) #分散 sd(math) #標準偏差 colMeans(x[,-c(1,2)]) #1,2列目以外の平均値
上野例題の場合には平均値と中央値は近い値でしたが、平均値と中央値が大幅に異なる場合を年収データの例を使って説明します。
c(..., ...)でベクトルを作成します。
salary <- c(300,300,300,400,400,2000,9000) mean(salary) median(salary) hist(math) hist(salary)
上のように平均値と中央値に大幅に差がでるときがあります。
一般に中央値のほうが平均値より外れ値に強い性質をもちます。
したがって、左右対称のグラフの場合には平均値は有効ですが、年収のような偏ったグラフになる場合には四分位数などで考える方が良い。
四分位点と箱ひげ図
最小値がひげの下端、第一四分位数が箱の下端、第二四分位数(中央値)が箱の中央の線、第三四分位数が箱の上端、最大値がひげの上端。
quantile(x$Japanese) #四分位点を表示 boxplot(x$Japanese) #箱ひげ図の作成
Rの環境設定
R言語
統計的な処理を簡単にできるため、PythonではなくRを使って解析を行いたいと思います。
Rのダウンロード
以下のURLに移動し、Windowsの場合にはDownload R for Windowsでダウンロード
https://cran.ism.ac.jp/
R Studioのダウンロード
以下のURLに移動し、RStudioのDownloadから一番左のRStudio Desktop Open Source Licenseをダウンロード
https://www.rstudio.com/
RStudioの起動
RStudioのショートカットをデスクトップなどに置き、RStudioを起動する。
Console画面を右上にするために、ToolsタブからGlobal Opinionを選択、Pane Layoutから右上のプルダウンをConsoleにする。
プロジェクトとスクリプトの作成
デスクトップにFirst_Rという名前のディレクトリを作成後、RStudioのFileタブからNew Project → Existing Directoryを選択し、先ほど作成したFirst_Rを選択後、Create Projectを押す。
FileタブからNew File→R Scriptで新規スクリプトを作成する。
Ctrl+Sでスクリプトを名前を付けて保存する。
ハイパーパラメータの自動最適化
ハイパーパラメータ
ニューロンの数や学習係数などをハイパーパラメータと言います。これらは幾通りもあり、なおかつ値によって結果がかなり異なることがあります。ハイパーパラメータをランダムに選び、実験することで自動で良い値を見つけます。
MNISTコード
max_lr = 0.0 max_ans = 0.0 for i in range(10): network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) lr = 10**np.random.uniform(-6,2) #範囲の中から自動で選ぶ optimizer = SGD(lr) #最適化手法を選択 for step in range(7001): #~訓練処理~# ans = network.accuracy(x_val, t_val)*100 #検証データで正解率を判定 print("[",i,"] ", "lr:", lr, "acc:", ans, "%") if ans > max_ans: max_lr = lr max_ans = ans print("lr:", max_lr, "acc:", max_ans, "%") #一番良かった学習率と正解率
XORコード
max_ans = 0.0 max_lr = 0.0 for i in range(100): lr = 10**np.random.uniform(-6,2) #lr=0.04 mom = 10**np.random.uniform(-1,0) #mom=0.374 optimizer = Momentum(lr, mom) #最適化手法を選択 ans = 0 #検証データがないので、30回の何回成功率を測定 for j in range(30): network = TwoLayerNet(2, 2, 2) for step in range(701): #~訓練処理~# y = np.argmax(network.predict(x_train), axis=1) a = (y == ans_label) if a.all(): ans += 1 print("lr:", lr, "mom:", mom, "ans:", ans, "/ 30") #良い正解率なら更新 if ans > max_ans: max_lr = lr max_ans = ans print("lr:", max_lr, "acc:", max_ans, "%") #一番良かった学習率と正解率
結論
処理は重いので、ある程度範囲を絞っていきながら実行すれば、いい結果を見つけられる。