tensorflow備忘用

Pythonistaで遊んでみる

pythonのお勉強の一環でPythonista3をipadにインストールしてみました。
結構このアプリ便利ですね。

いきなりレベルアップです。まず、CLIが使えるようにしちゃいます。StaShというツールがあって、
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
を記載して実行します。

すると、こんな画面になります。
20160720

こいつが非常に便利でpipが使えてしまうのです。なんで、そのままpandasも入れてしまいます。ついでにscikit-learnも入れようと思ったのですが無理でした。numpyのバージョンがダメだというのですが、調べてみるとそうでもないみたい。

https://forum.omz-software.com/topic/3182/cannot-install-scikit-learn
によるとFORTRANベースっぽいので、pythonistaでは難しいみたい。まあ、どうせtensorflowも動かないし、そもそもCPUがもたないだろうし、とりあえずpythonistaはデータ加工のために使ってみよう。

それにしてもよく出来てる。。。
あ、ちなみにmatplotlibは使えます。
スポンサーサイト

tensorflowを改め、pythonのお勉強その5

リーマンショック以降、ニュースでストレステストがどうのって話がよく出てましたが、VaR計算(モンテカルロ法)をやってみました。信頼区間におけるリスクがどの程度か、ってのがポイントになります。

いつものようにインポートして、、、
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

アップル、グーグル、マイクロソフト、アマゾンの株価を取得します。以前のコードのまま。
tech_list = ['AAPL','GOOG','MSFT','AMZN']
now = datetime.now()
end = datetime(now.year - 1,now.month,now.day)
start = datetime(now.year - 2,now.month,now.day)

for stock in tech_list:
globals()[stock] = DataReader(stock,'yahoo',start,end)

終値ベースのデータフレームを作成しておきます。
closing_df = DataReader(['AAPL','GOOG','MSFT','AMZN'],'yahoo',start,end)['Adj Close']
tech_rets = closing_df.pct_change()
rets = tech_rets.dropna()

ここからがVaR計算。1年間を前提として平均と標準偏差を求めておきます。
days = 365
dt = 1/days
mu = rets.mean()['AAPL']
sigma = rets.std()['AAPL']

ここからが株価のモデルです。モデルを関数化します。ショックとドリフトは株価の用語らしいですが、ショックのほうに乱数を適用します。numpyのrandomを使ってますが、normalには引数が3つあって、1つ目が平均、2つ目が標準偏差、3つ目は無いですが戻る個数です。
def stock_monte_carlo(start_price,days,mu,sigma):
price = np.zeros(days)
price[0] = start_price
shock = np.zeros(days)
drift = np.zeros(days)

for x in range(1,days):
shock[x] = np.random.normal(loc=mu * dt, scale=sigma * np.sqrt(dt))
drift[x] = mu * dt
price[x] = price[x-1] + (price[x-1] * (drift[x] + shock[x]))

return price

実際にここからがシミュレーションの開始です。今回は10回シミュレーションします。10回for文で回している部分です。
start_price = AAPL.iloc[0,5]

for run in range(10):
plt.plot(stock_monte_carlo(start_price,days,mu,sigma))
plt.xlabel("Days")
plt.ylabel("Price")

結果がこちら。単に乱数を発生させて誤差を出しているので特に規則性は無いです。
201607131

ちなみに、実際のデータを見ておきます。1日目のデータは92.88なのでグラフのx軸が0の部分の値です。
AAPL['Adj Close'].head(1)
Date
2014-07-14 92.884773
Name: Adj Close, dtype: float64

で、肝心の1年後の値がこちら。x軸の365日後のデータですが、最大の振れ幅が約96なのに対し、実際には123.13です。つまりシミュレーションでは有り得ないくらいに振れています。
AAPL['Adj Close'].tail(1)
Date
2015-07-13 123.138612
Name: Adj Close, dtype: float64

ではもっと回数を増やしてみましょう。3000回で実行。
runs = 30000
simulations = np.zeros(runs)
np.set_printoptions(threshold=5)
for run in range(runs):
simulations[run] = stock_monte_carlo(start_price,days,mu,sigma)[days-1];

表示してみます。今回はカーネル密度推定も表示してみます。
sns.distplot(simulations,bins=200)

綺麗に正規分布してますね。
201607132

まあ、よく考えてみると乱数を発生するときに平均と標準偏差を使っているので当たり前といえば当たり前のような気がします。何で平均と標準偏差かは金融のプロではないのでサッパリわかりませんが、経験的にわかっているようです。。。

ちなみに、99%タイル(信頼区間)を見てみると
np.percentile(simulations, 1)
90.145215464335124

となりました。見方としては倒産するかどうかまではわかりませんが、かなりリスクがあったとしても約93ドルの株価が90ドル以下になることは無いだろうというもののようです。でもね、実際には123ドルになってしまっている訳で、このリスク計測って当てになるのかはかなり疑問です。

ちなみに、必ず正規分布することがわかっているならモンテカルロ法なんか使わなくても予測できそうだな(というかやるだけ無駄だな)と思ったので少し調べてみましたが、日銀のパワポにそのままズバリが書いてありました。以下のPDFのP.41ですが、モンテカルロ法の利点は正規分布以外のモデルが使えると書いてあります。そりゃそうだ。じゃないとループさせてこれだけ計算させる必要がないですからね。要はもっと複雑なモデルに対応できるんでしょう。
https://www.boj.or.jp/announcements/release_2009/data/fsc0903a1.pdf

ちなみに、日銀の資料によると、VaR計算には分散共分散法(デルタ法)とヒストリカル法があるようで、デルタ法というのがモンテカルロやらなくてもいいじゃんと思った解になっています。多分昔はこういう単純なモデルが使われていたのだと思いますが、金融リスクが重視されてきたのと、コンピュータリソースが劇的に増加してより複雑なモデルの検証が可能になったのだと思います。

が、一定の効果はあると思いますが、金融リスクの計算ってあまり当てにならないのでは?というのが今回の感想でした。。。

tensorflowを改め、pythonのお勉強その4

いつものようにインポートから。
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

今日は、バンクオブアメリカ、モルガンスタンレー、JPモルガン、グーグル、ヤフー、アマゾン、インテルの株価をゲット。
stocks = ['BAC','MS','JPM','GOOG','YHOO','AMZN','INTC']
for stock in stocks:
globals()[stock] = DataReader(stock,'yahoo',start,end)

とりあえずバンカメをチェック。
BAC.describe()

201607091

終値から始値を引いて差分を抽出。
BAC['diff']=BAC['Adj Close']-BAC['Open']

BAC.head()
201607092

他の銘柄も差分を抽出。なんかセンス無いなあ。。。for文で回したかったんだけどデータフレームをを配列にして順序処理する方法がわからず。。。
MS['diff']=MS['Adj Close']-MS['Open']
JPM['diff']=JPM['Adj Close']-JPM['Open']
GOOG['diff']=GOOG['Adj Close']-GOOG['Open']
YHOO['diff']=YHOO['Adj Close']-YHOO['Open']
AMZN['diff']=AMZN['Adj Close']-AMZN['Open']
INTC['diff']=INTC['Adj Close']-INTC['Open']

差分専用のデータフレームを作成。
diff_df=pd.concat([BAC['diff'],MS['diff'],JPM['diff'],GOOG['diff'],YHOO['diff'],AMZN['diff'],INTC['diff']], axis=1)

diff_df.head()
201607093
あー、カラム名が全部diffになってしまった。。。

これじゃわからないので変更。
diff_df.columns = ["BAC","MS","JPM","GOOG","YHOO","AMZN","INTC"]
diff_df.head()
201607094
これでオーケー。

早速グラフ化。
diff_df.plot(legend=True,figsize=(10,7))
201607095
やってみて思ったけど、差分ではなくて割合にしたほうがいいかも。あと、MAXとMINの差分にすると何か違いが見えてくるかな。。。

相関性をチェック。
sns.pairplot(diff_df.dropna())
201607096
※右のほうが切れてしまった場合は画像をクリックすれば全部見れます。まぁ、対角線に対して同じ図ですけど

結構相関性の高い会社もありそう。なんでヒートマップでチェック。
201607097
バンカメ、モルスタ、JPモルガンは関係性が高いみたい。まあ、金融セクターだからでしょうね。意外なのはなぜかインテルが金融セクターと相関しているところ。なんでだろう。。。
逆にIT系だと相関しているのはアマゾンとGoogleだけ。他はそこまで相関してないみたい。

いろいろ考えてみると分析ができそうですな。。。

今日はおしまい。

tensorflowを改め、pythonのお勉強その3

昨日の続き。

少し工夫して終値から始値を引いてみて、一日の変化量を出してみる。
diff=AAPL['Close']-AAPL['Open']

テスト用のデータフレームを作ってみる。
AAPL_TEST=AAPL[['week','diff']]
AAPL_TEST.head(5)
201607071


さらにweekでまとめてみて
AAPL_group=AAPL_TEST.groupby(AAPL_TEST['week'])

AAPL_group.mean()
201607072

火曜と木曜が値上がりしやすいのかな。他の株価との比較や、次期の比較をしてみると面白いのかもしれないけど、何をどう見ればいいのかがすぐに思いつかない。。。経験と勘が必要な領域ですね。

tensorflowを改め、pythonのお勉強その2

まずはデータの形を見てみる。OracleならDESC的な使い方。
AAPL.head(3)
201607061


インデックスの日付を抜き出して、曜日に変換。
date =AAPL.index.get_level_values('Date')
week=date.dayofweek

変換した結果はアレイ型になってるんですね。
week
array([4, 0, 1, ..., 2, 3, 4])

で、データフレームのAAPLにweekとして追加。
AAPL['week']=week

week列を見てみると、
AAPL.head(10)
201607062
月曜から木曜なので数字が0~4なのね。。。ってことは5、6が土日かぁ。

列を抽出して、、、
AAPL_TEST=AAPL[['Close','week']]

ヒートマップで表示してみる。
AAPL_TEST=AAPL_TEST.head(150)
sns.heatmap(AAPL_TEST)
201607063

んぁ?なんか違うぞ。

でも今日はここまで。。。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。