ihit's diary

ちょっとしたメモに

Machine Learning for Trading (Lesson8)

Lesson 8
ポートフォリオ

1. 正規化株価:日単位の株価の時系列データを初日の株価で割る
2. allocation:正規化後の株価に投資割合を掛ける
3. position value:allocation後のデータに初期値を掛ける
4. ポートフォリオ:position valueの日合計を出す

ポートフォリオから収益率を見る。その際、配列の最初の値は0とし、今後使わない。
ポートフォリオボラティリティが小さい方が良い

Sharpe ratio:ポートフォリオのリスクの数値化
volatilityは少ないほうが良く、リターンは大きい方が良い

resk free rate:無リスク利子率。理論的にリスクが皆無か極小の投資案件の期待利回り

daily_rf = (1.0+0.1)^252

R_pポートフォリオリターン
R_f:リターンのrisk free rate
\sigma_pポートフォリオリターンの分散

Sharpe\ ratio = \frac{E[R_p-R_f]}{std[R_p-R_f]}
このとき分母のR_fは0として扱う。

SR_annualized = \sqrt{\#samples\ per\ year} * SR
daily\ K = \sqrt{252}
weekly\ k = \sqrt{52}
monthly\ K = \sqrt{12}

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} う~んよくわからない…

ここまでやってみて、

  1. 行列計算における連鎖律(なんで転置するの?、なんでWとXで$$\frac{\partial L}{\partial \bf{Y}}$$は逆なのか等)

  2. 行列で微分する の二点が不明であることがわかった。

もうちょい調べてみるか

今日やったことまとめ【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

設定方法はここ参照

OS version パッケージ管理
Windows
Mac
Ubuntu
Fedora 3.6.0 Anaconda 4.3.0

パッケージ管理

今後はAnacondaを用いていく予定

新規パッケージ導入方法
conda search <パッケージ名>
conda install <パッケージ名>

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

python Tips

mapに複数の引数の関数を渡す

def func(x,y):
	return x*y

に対して

map(func,range(10),range(11:21))

map(lambda x,y:func(x,y),range(10),range(11:21))

でOK

ただし,multiprocessingを使うときはこうは行かなくて

def argwrapper(args):
	return args[0](*args[1:])

を定義した後

func_args = zip(range(10),range(11:20))
p.map(argwrapper, func_args)

としなければいけない.

あと

c = zip(a,b)

の逆は

a,b = zip(*c)