Machine Learning for Trading (Lesson8)
Lesson 8
ポートフォリオ
1. 正規化株価:日単位の株価の時系列データを初日の株価で割る
2. allocation:正規化後の株価に投資割合を掛ける
3. position value:allocation後のデータに初期値を掛ける
4. ポートフォリオ:position valueの日合計を出す
ポートフォリオから収益率を見る。その際、配列の最初の値は0とし、今後使わない。
ポートフォリオはボラティリティが小さい方が良い
Sharpe ratio:ポートフォリオのリスクの数値化
volatilityは少ないほうが良く、リターンは大きい方が良い
resk free rate:無リスク利子率。理論的にリスクが皆無か極小の投資案件の期待利回り
- LIBOR
- 3month T-bill
- 0
daily_rf = (1.0+0.1)^252
:ポートフォリオリターン
:リターンのrisk free rate
:ポートフォリオリターンの分散
このとき分母のは0として扱う。
Machine Learning for Trading (Lesson1~7)
UdacityのMachine Learning for Tradingを観始めた
Udacity
以下に講義メモを残していく
Lesson 1~4
pandas、numpyの使い方
Lesson 5
移動平均:pd.rolling_std(values, window=window)
移動分散:pd.rolling_mean(values, window=window)
移動平均と株価が交差するところが株価上昇、下降の見極めるチャンス。
移動平均に分散の2倍を足し引きしたものが株価上昇、下降の上限、下限となる事が多い(Bollinger Bands)
upper_band, lower_band = rm + 2*rstd, rm - 2*rstd
ここまでやったことのコード抜粋
os.path.join(base_dir, "{}.csv".format(str(symbol))) #ファイル名取得 df = pd.DataFrame(index=dates) #日付をインデックスにしている df_temp = pd.read_csv(symbol_to_path(symbol), index_col='Date', parse_dates=True, usecols=['Date', 'Adj Close'], na_values=['nan']) #日付をインデックスにしてcsvファイルを読んでいる。 df_temp = df_temp.rename(columns={'Adj Close': symbol}) #Adj Closeを銘柄名に置換 df = df.join(df_temp) df = df.dropna(subset=["SPY"]) #欠損値を削除 dates = pd.date_range('2012-01-01', '2012-12-31') #日付でデータの範囲を絞れる
Lesson 6
株価に欠損データがあるときは
1. 欠損直前の値で後を埋める:df.fillna(method='ffill', inplace=True)
2. 欠損終了直後の値で前を埋める:df.fillna(method='bfill', inplace=True)
Lesson 7
2つの銘柄を比較する際は収益率(Daily returns)を用いる
Daily return=今日の株価/前日の株価 - 1
daily returnsの計算式
daily_returns = df.copy() daily_returns = (df[1:] / df[:-1].values) - 1 daily_returns.ix[0, :] = 0
Daily returnsを時系列からヒストグラムにすると比較しやすい
ベル・カーブっぽくなる→正規分布
kurtosis:分布の両端
fat tails:positive kurtosis
skinny tails:negative kurtosis
ヒストグラムの描き方
daily_returns.hist(bins=20) mean = daily_returns['SPY'].mean() plt.axvline(mean, color='w, linestype='dashed', linewidth=2)
std = daily_returns['SPY'].std()
stdが大きいとvolatility(変動性)が大きい
2つの銘柄(片方は市場平均?)の収益率を散布図で表して単回帰分析でを引く
傾きをβ=slope
y切片をα
とおく
βは市場の成長に対してどれだけ反応するか
αは市場平均に対してどれだけ優位か
を表しているみたいなこと言っていたけどよくわからなかった。
slopeはcorrelationとは違う
correlationは回帰線にどれだけ近いかを示す
散布図の描き方
daily_returns.plot(kind='scatter', x='SPY', y='XOM') bera_XOM, alpha_XOM = np.polyfix(daily_?returns['SPY', daily_returns['XOM'], 1) plt.plot(daily_returns['SPY'], beta_XOM*daily_returns['SPY'] + alpha_XOM, '-', color = 'r') plt.show()
相関係数の導出方法
daily_returns.corr(method='pearson')
投資信託のアルファとベータってなに? [資産運用] All About
上記URLによると
α:アクティブリターン
市場の平均値からの超過リターン
β:パッシブリターン
株式や債券を含む幅広い市場指数に連動するリターン
とのこと
多次元の微分まとめ
ゼロから作るDeep Learningで多次元の微分の式(5.13)がわからなかったので書き下してみた。 個人的な理由からX,Wの掛け算の順序が逆になっているが、本質は変わらないはず。 まずは定義から \begin{eqnarray} \bf{W} &=& \left( \begin{array}{cc} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{array} \right) \\ \bf{X} &=& \left( \begin{array}{c} x_{1} \\ x_{2} \end{array} \right) \\ \bf{B} &=& \left( \begin{array}{c} b_{1} \\ b_{2} \\ b_{3} \end{array} \right) \\ \bf{Y} &=& \bf{W} \cdot \bf{X} + \bf{B}\\ \end{eqnarray}
こっから実際に多項式の微分を書き下してみる \begin{eqnarray} \frac{\partial L}{\partial \bf{B}} &=& \left( \frac{\partial \bf{Y}}{\partial \bf{B}} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \frac{\partial \left(\bf{W} \cdot \bf{X} + \bf{B}\right)}{\partial \bf{B}} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \frac{\partial \left( \begin{array}{c} w_{11}x_{1}+w_{12}x_2+b_{1} \\ w_{21}x_{1}+w_{22}x_2+b_{2} \\ w_{31}x_{1}+w_{32}x_2+b_{3} \end{array} \right)}{\partial \left( \begin{array}{c} b_{1} \\ b_{2} \\ b_{3} \end{array} \right)} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \begin{array}{ccc} \frac{\partial w_{11}x_{1}+w_{12}x_2+b_{1}}{\partial b_{1}} & \frac{\partial w_{11}x_{1}+w_{12}x_2+b_{1}}{\partial b_{2}} & \frac{\partial w_{11}x_{1}+w_{12}x_2+b_{1}}{\partial b_{3}}\\ \frac{\partial w_{21}x_{1}+w_{22}x_2+b_{2}}{\partial b_{1}} & \frac{\partial w_{21}x_{1}+w_{22}x_2+b_{2}}{\partial b_{2}} & \frac{\partial w_{21}x_{1}+w_{22}x_2+b_{2}}{\partial b_{3}}\\ \frac{\partial w_{31}x_{1}+w_{32}x_2+b_{3}}{\partial b_{1}} & \frac{\partial w_{31}x_{1}+w_{32}x_2+b_{3}}{\partial b_{2}} & \frac{\partial w_{31}x_{1}+w_{32}x_2+b_{3}}{\partial b_{3}} \end{array} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array} \right) \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \frac{\partial L}{\partial \bf{Y}} \end{eqnarray}
お次はこっち \begin{eqnarray} \frac{\partial L}{\partial \bf{X}} &=& \left( \frac{\partial \bf{Y}}{\partial \bf{X}} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \frac{\partial \left(\bf{W} \cdot \bf{X} + \bf{B}\right)}{\partial \bf{X}} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \begin{array}{ccc} \frac{\partial w_{11}x_{1}+w_{12}x_2+b_{1}}{\partial x_{1}} & \frac{\partial w_{11}x_{1}+w_{12}x_2+b_{1}}{\partial x_{2}}\\ \frac{\partial w_{21}x_{1}+w_{22}x_2+b_{2}}{\partial x_{1}} & \frac{\partial w_{21}x_{1}+w_{22}x_2+b_{2}}{\partial x_{2}}\\ \frac{\partial w_{31}x_{1}+w_{32}x_2+b_{3}}{\partial x_{1}} & \frac{\partial w_{31}x_{1}+w_{32}x_2+b_{3}}{\partial x_{2}} \end{array} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \left( \begin{array}{ccc} w_{11} & w_{12}\\ w_{21} & w_{22}\\ w_{31} & w_{32} \end{array} \right)^{\mathrm{T}} \cdot \frac{\partial L}{\partial \bf{Y}} \\ &=& \bf{W}^{\mathrm{T}} \cdot \frac{\partial \it{L}}{\partial \bf{Y}} \end{eqnarray} 最後に行列で偏微分 \begin{eqnarray} \frac{\partial L}{\partial \bf{W}} &=& \frac{\partial L}{\partial \bf{Y}} \cdot \left( \frac{\partial \bf{Y}}{\partial \bf{W}} \right)^{\mathrm{T}}\\ &=& \frac{\partial L}{\partial \bf{Y}} \cdot \left( \frac{\partial \left(\bf{W} \cdot \bf{X}+\bf{B}\right)}{\partial \bf{W}} \right)^{\mathrm{T}}\\ &=& \frac{\partial L}{\partial \bf{Y}} \cdot \bf{X}^{\mathrm{T}}\\ \end{eqnarray} う~んよくわからない…
ここまでやってみて、
行列計算における連鎖律(なんで転置するの?、なんでWとXで$$\frac{\partial L}{\partial \bf{Y}}$$は逆なのか等)
行列で微分する の二点が不明であることがわかった。
もうちょい調べてみるか
今日やったことまとめ【tensorflow 環境構築】
環境構築
docker imageを用いてtensorflowを動かした
とりあえずtensorflowそのものを動かしてみる
参考にしたのは↓ TensorFlowの勉強に必要なDocker導入サバイバルメモ - Itsukaraの日記
docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.5.0
でもなんかimageが古い…そこで本元に行ってみた
公式ページ
Get Docker for Fedora - Docker Documentation
https://hub.docker.com/r/tensorflow/tensorflow/
docker run -it -p 8888:8888 tensorflow/tensorflow
デフォルトでJupyter notebookが動くようになっている。 Virtual boxで動かしていたので、ポート8888をポートフォワーディングしてあげる。
Jupyter notebookはバックグラウンドでターミナルをいじりたいと思い
docker run -it -p 8888:8888 tensorflow/tensorflow /bin/bash
を実行し、ターミナル状態で始められたが、ここからJupyter notebookを立ち上げるにはどうすれば良いのかわからなかった。
ターミナルでjupyter notebookと打つと
[I 13:37:57.623 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret [W 13:37:57.648 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended. [C 13:37:57.666 NotebookApp] Running as root is not recommended. Use --allow-root to bypass.
こんなエラーが出てしまった。 時間があったら調べてみるか
pythonでLinuxコマンドを実行する
Linuxでlsとかmkdirがしたくてちょっと調べてみた.
色々方法はあるらしいがsubprocessを使うのが良さそうだった.
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess p0 = subprocess.check_call(['ls','-al']) p1 = subprocess.check_call(['mkdir','test'])
ついでにC言語を実行できるか確かめてみた.
test.c
#include <stdio.h> int main(void){ int a; while(1){ scanf("%d",&a); if(a == 0){ return 0; } printf("%d\n",a); } return 0; }
これを実行するには
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess p0 = subprocess.check_call(['gcc','test.c','-o','test']) p1 = subprocess.Popen(['./test'], stdout=subprocess.PIPE,stdin=subprocess.PIPE) p2 = subprocess.Popen(['echo','-1'], stdin=subprocess.PIPE, stdout=p1.stdin) p2 = subprocess.Popen(['echo','5'], stdin=subprocess.PIPE, stdout=p1.stdin) p2 = subprocess.Popen(['echo','0'], stdin=subprocess.PIPE, stdout=p1.stdin) output = p1.communicate()[0] print output
実行ファイルを実行するプロセスを作成した後,実行ファイルのプロセスの入力にp2で作成したプロセスの出力をつなげればOK