ポートフォリオ1

数式を載せたかったのですが,Markdownからの変換がうまくいかないので,軽い説明とプログラムだけ載せます.

まず,使用するデータをプロットする. f:id:ShogoAkiyama:20181110130607p:plain

これだと,データが対数増加率で正則化する.

# 対数増加率
r_df = np.log(df / df.shift(1))
# 累積利益率にする
cum_df = r_df.cumsum().dropna()

f:id:ShogoAkiyama:20181110130931p:plain

累積対数利益率でも同じグラフが描かれる.

平均-分散ポートフォリオを作成するので,平均と銘柄同士の共分散行列を求める.

mean = cum_df.mean()
cov = cum_df.cov()
std = np.sqrt(np.diag(cov)) 

{
S=\frac{\mu}{\sigma}
}

を計算すると,最大$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

最小分散ポートフォリオ,最大リターンポートフォリオ,最大Sharpe Ratioポートフォリオを求めることができる.

はじめに

はじめに

こんにちは,Shogoです

勉強している内容がマイナーであることと,文章を書くための練習として,ブログを書いていきたいと思います.

書いていく内容としては, 1. 金融工学 2. プログラミング 3. ベンガル語

について書いていきたいと思います.

週1ぐらいで書ければ良いかな.

コメント,指摘,大歓迎です.

よろしくねヽ(^ω^)ノ

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, "%")  #一番良かった学習率と正解率

結論

処理は重いので、ある程度範囲を絞っていきながら実行すれば、いい結果を見つけられる。