重回帰分析による米雇用統計の予測モデルを作成してみる
公開日:
:
最終更新日:2015/12/17
Python
この記事はPython その2 Advent Calendar 2015 の17日目の記事です。
目次
1 はじめに
雇用統計のモデルで有名なにほんばっしー(現在活動停止中?)が公開していた予想方法を元に、雇用統計の数値を予想するモデルを作成してみます。
2 モデル作成
2.1 使用する指標
ザイのリンクからにほんばっしーが使っていた指標は以下となっています。
- 新規失業保険申請件数
- ニューヨーク連銀製造業景気指数の「雇用」
- フィラデルフィア連銀製造業景況指数の「雇用」
- ミシガン大学消費者信頼感指数
- カンザスシティ連銀製造業景況指数の「雇用」
- ダラス連銀製造業活動指数の「雇用」
- リッチモンド連銀製造業景況指数の「雇用」
- 消費者信頼感指数の「雇用不十分」
- 消費者信頼感指数の「雇用困難」
- 米ドル/円変化率(1カ月前)
- ISM製造業景況指数の「雇用」
- S&P500指数変化率(1カ月前)
- ADP雇用統計
- チャレンジャー人員削減予定数
このうち、無料では入手が困難だったカンファレンスボード関連の消費者信頼感指数の「雇用不十分」、「雇用困難」を除いた指標を使うことにします。まとめたデータを公開したいのですが、二次公開には色々と成約が付きまとうので今回は残念ながら公開できません。代わりにリンクをまとめておきます。
ここでは、”Summery Of Indexes.xlsx”というエクセルファイルにデータを保存しました。
2.2 単純に重回帰分析をしてみる
“Summery Of Indexes.xlsx”のファイルのTrainというシートのデータを取得します。
1 2 3 4 5 6 7 |
import pandas as pd import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt data_table = pd.read_excel("Summary Of Indexes.xlsx", sheetname="Train") data_table.head() |
statsmodels.api.OLSを使えば、簡単に重回帰分析をした結果を取得できます。
1 2 3 4 5 6 7 8 |
# Read Data y = data_table[u"新規失業保険申請者数"] x = data_table[[u"NY連銀雇用", u"フィラデルフィア連銀雇用", u"ミシガン大指数", u"カンザスシティ連銀雇用", u"ダラス連銀雇用", u"リッチモンド連銀雇用", u"ISM製造雇用", u"S&P500 変化率1ヶ月遅行", u"ADP雇用統計", u"チャレンジャー人員削減数"]]model = sm.OLS(y, x) model = sm.OLS(y, x) results = model.fit() results.summary() |
結果をプロットしてみます。
1 2 3 |
import matplotlib.pyplot as plt plt.plot(results.predict(), "r") plt.plot(y, "b") |
青が実際の値で、赤が予測値です。
パッと見でなんとなくいけてなさそうですが、訓練データとしてしか使っていないのでこれだけでは実際の予測能力の評価ができません。
2.3 交差検証(Cross Validation)する
訓練データとテストデータに分けて評価してみます。あまりデータ数がないので、Leave One Out Cross Validation を用いることにします。
Leave One Out はscikit-learnに便利な module LeaveOneOut が提供されているのでそれを用いることにします。
1 |
from sklearn.cross_validation import LeaveOneOut |
LeaveOneOut検証を行った後の結果を返す method を作成します。targetに予想したい結果を入れて、予想に使う要素をinputsに入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def make_prediction(target, inputs): loo = LeaveOneOut(len(data_table)) predict_results = [] for train, test in loo: train_table = data_table.iloc[train] test_table = data_table.iloc[test] y_train = train_table[target] x_train = train_table[inputs] y_test = test_table[target] x_test = test_table[inputs] model = sm.OLS(y_train, x_train) result = model.fit() calc_prediction = (result.params * x_test) prediction = calc_prediction.sum().sum() predict_results.append(prediction) return predict_results |
1 2 3 4 5 6 7 8 9 10 11 12 |
target = u"雇用統計結果" inputs = [u"新規失業保険申請者数", u"NY連銀雇用", u"フィラデルフィア連銀雇用", u"ミシガン大指数", u"カンザスシティ連銀雇用", u"ダラス連銀雇用", u"リッチモンド連銀雇用", u"ISM製造雇用", u"S&P500 変化率1ヶ月遅行", u"ADP雇用統計", u"チャレンジャー人員削減数"] predicts = make_prediction(target, inputs) actuals = data_table[u"雇用統計結果"] forecasts = data_table[u"雇用統計予想値"] import matplotlib.pyplot as plt plt.plot(predicts, "r") plt.plot(actuals, "b") plt.plot(forecasts, "g") |
predicts にはLeaveOneOut検証によって得られた結果だけを格納されています。全然いけてないですね・・。
2.4 アナリスト予想に対する方向性の精度を検証
一応、アナリストの予想値と結果の方向性をどのぐらい予想出来ているかを計算してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# calc predictive accuracy def accurates_and_faults(predicts, actuals, forecasts): accurates = 0 faults = 0 for p, a, f in zip(predicts, actuals, forecasts): if (f < a): if(f < p): accurates += 1 elif(f > p): faults += 1 elif(f > a): if(f > p): accurates += 1 elif(f < p): faults += 1 return accurates, faultsk |
1 2 3 |
accurates, faults = accurates_and_faults(predicts, actuals, forecasts) print "accurates: %d, faults: %d accurate ratio: %f"%(accurates, faults, accurates * 1.0 / (accurates + faults)) # accurates: 59, faults: 52 accurate ratio: 0.531532 |
予想値と結果のずれの方向性を59回的中させ、52回失敗し、的中率は53%となりました。
2.5 アナリスト予測に対する精度を検証
これもまた一応ですが、結果とのずれ具合を検証してみます。
1 2 3 4 5 6 7 8 9 10 |
def calc_diff(inputs, targets): diff_sum = 0 for i, t in zip(inputs, targets): diff_sum += abs(t - i) return diff_sum sum_diff_predict = calc_diff(predicts, actuals) sum_diff_forecast = calc_diff(forecasts, actuals) print "difference against forecasts: %f"%(sum_diff_predict*1.0 / sum_diff_forecast) # difference against forecasts: 3.394691 |
アナリストの予想に対し、今回のモデルの予想精度は約3.4倍劣る結果となりました。
3 作りこんでいけば・・
Cross Validation で使うべき要素を選別、精度を高めていけば、それなりに予測能力を持つモデルを作成できるようになります。下が実際に作成しているモデルから得られた出力例です。独自に追加した要素などを使えば、このぐらいの精度までは出せました。今のところ、2回連続的中しています。
3.1 実際に予想した結果
11月
明日の雇用統計、にほんばっしー予想は公開しないのかなぁ。自前モデルと数値の比べてみたいんだけど。ちなみにキリンモデルでは219k。初の予想なので参考にはしないでください(´・ω・`)
— fx-kirin (@fx_kirin) November 5, 2015
米国、非農業雇用者数増減 27.1万(予想18万)
— 岡三マン (@okasanman) November 6, 2015
12月
キリンさん予想は231K。
— fx-kirin (@fx_kirin) December 4, 2015
米国、非農業雇用者数増減 21.1万(予想20万) 米国、失業率 5.0%(予想5.0%)
— 岡三マン (@okasanman) December 4, 2015
ipython データ
あとがき
なんか書いてみるとあんまりPython関係ないのかなと思ったり思わなかったり。こういう情報って使えるもの出すと色々怖いので、丁度いい案配だったんじゃないかなぁと思います。
About Fx-Kirin
2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。
- Web |
- More Posts (362)
Adsense
関連記事
-
-
Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ
[2015/02/07 追記] [bm url="http://fx-kirin.com/python
-
-
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介
以前こんな記事を書いていたのですが、これがまったく不要になるとても便利なPython Libraryがあった
-
-
vim-ipythonをWindows 7 x64で使うとR6034 が出る件
個人的なただの忘備録。 Visual Studioのコマンドプロンプトから実行すること。 http://st
-
-
PythonのThreadを待機させるか、必要の度に作成するのかのベンチマーク比較
QueueとThreadのベンチマーク比較 2つのケースについて比較検証してみました。 実際に処理する内
-
-
話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件
Rubyの読書会に行ったら、Pythonの面白いお話を聞けたというお話です。 Rubyクローラー本の読書会に参
-
-
絶対ダメ! マルチスレッドでの共通変数のインクリメント演算
デバッグ中の発見 とあるマルチスレッドプログラムをPythonで書いていた際に遭遇した誤使用です。C/C++等
-
-
Pythonのsocketでプロセス間通信をして価格データ等を送信する
どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ
-
-
stop automatically closeing vim-ipython output with jedi-vim
Even though I commented out the following code in vim_ipytho
-
-
VimでPythonのIDE 環境を一から構築する
追記 これ見ておいたほうがいいかも。 Vimを最強のPython開発環境にする2 - Λlisue's blog
-
-
PythonでsleepしているThreadを呼び起こすプラクティス
Pythonのsleep中のThreadをWake up PythonのThreadにて、RubyのThr
Adsense
サイト内検索
NEW ENTRY
-
- 重回帰分析による米雇用統計の予測モデルを作成してみる
この記事はPython その2 Advent Calendar 2015 の17日目の記事で
-
- stop automatically closeing vim-ipython output with jedi-vim
Even though I commented out the following code in
-
- Derivatives analytics with Python の学習ノート 3章
前回の続きです。 読んでいる本はこちら。少しでも興味をお持ちになったら、ここでは詳細には触れま
-
- Derivatives analytics with Python の学習ノート 1,2章
洋書を読んでいると、いつも読んだ気になってちゃんと理解出来てるか自信がないことが多いので、チャプタ
-
- How to fix invisible problem of ColorDict.
Do not use .dict.dz files I encountered the
Twitter
RSS
カテゴリー
-
人気記事一覧
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介 101 views
話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件 87 views
Androidのステータスバーに秒数表示を追加する方法 76 views
Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ 56 views
Derivatives analytics with Python の学習ノート 3章 47 views
重回帰分析による米雇用統計の予測モデルを作成してみる 46 views
YJFXに善意の重大バグの報告後、報告人だけに新規約上停止措置 41 views