因子分析メモ

概要

・RでPCAはよくやられてる(というか前やった)が因子分析ってどうやるんでしたっけというメモ

コード断片

ライブラリは”psych”を使うと良いらしい

nfactorsで因子数
factor loadingの推定はml = 最尤法
因子の回転はvarimax回転(参考分析はpromax回転推奨)
因子スコアの計算はAnderson(faのデフォルトはRegression, 参考文献ではAnderson and Rubin法として紹介)とすることで直交回転した場合にも因子スコア間の相関がゼロになる

result$loadingにfactor loading
result$scoresに因子スコア
が格納されている

参考文献

Amazon.co.jp: 因子分析入門―Rで学ぶ最新データ解析: 豊田 秀樹: 本
http://www.amazon.co.jp/dp/4489021267

為替秒足データ作成

概要

・いわゆる前処理
・TrueFX(参考1)にて公開されているミリ秒単位のクオートをもとに秒足データに加工する

NYSOLを使うまで

そもそもなんでNYSOLなのかといいますと、とてもcsvの処理が早いらしい(参考3)
しかもTrueFXからダウンロードできるcsvファイルが月別に1つのファイルにまとめてありエクセルではもはや開けない代物
というわけで実験がてらNYSOLを試してみることに。

で、

NYSOLはなんとまさかのUNIX環境のみの提供だったのでWindowsでは動かない。
Cygwin環境ならインストールできるかなとも思ったりしましたが

屋上へ行こうぜ…キレちまったよ…という感じだったので大人しくLinux環境(今回はUbuntu)を整えるの巻
今回はVMware Playerを使って仮想マシンをセットアップしました。詳しくは参考サイト4を参照ということで。

NYSOLのサイトにはUbuntu 12.04まで動作確認されていると書いてありますが、私の環境(14.04)でも特に問題なく動いています。

コード

シェルスクリプトにまとめています。
やっている内容としては、1行目でTrueFXからダウンロードしてきた対象csvを指定し、秒毎に終値を取得して秒足チャートとしています。
4本値はめんどくさくて取ってないよ。
私の環境では今回のファイル(147万行ほど)の処理に5秒ほどですね。速度は比較してないのです。速さはどうなんですかね、ようしらんけど。

1箇所ハマった点としては、TrueFXからダウンロードできるcsvの改行コードはCRLFである一方、nysolで対応しているのはLFのみ。
1行目でNYSOLが処理できるようにcsvの改行コードを修正しています。

また、NYSOLは秒単位までにしか対応していないので、日時と時間をパースしたりらじばんだりというのが2行目以降。
9行目で欲しい項目だけを選択してoutput.csvに吐き出しています。

結果

ということでめでたく秒足のbidサイドをまとめることができましたというお話でした。

Image

感想

NYSOLは各処理のアウトプットをパイプ(縦棒記号 |)でつなげてチェーンすることができるので文法が分かってくるとやりやすいですね。
ただ一方で純和製ソフトなのか知名度が低いのかよく分かりませんが公式サイト以外にネット上に文章が無いのが調べにくいですね。

ちなみになんでこんなことをやってるかというと、秒単位のデータはリバーサルが効きやすいというのを聞いたからです(参考5)
さらにちなむと、この動画ではマイクロ秒ではモメンタムが効きやすいって話もしていますので、誰か分析はよ!という感じですね。

ついでにちなむとTrueFXというサイトを知ったのは参考6の書籍からでした^^

参考

TrueFX — Tick-By-Tick Real-Time And Historical Market Rates, Clean, Aggregated, Dealer Prices
https://www.truefx.com/?page=frontpage

NYSOL
http://www.nysol.jp/

#TokyoR 39 高速に前処理するNYSOL
http://www.slideshare.net/SatoshiKitajima2/nysol-tokyor39

Ubuntuで作業環境を整えよう
http://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToUbuntu.html

Algorithmic Trading and Machine Learning | TechTalks.tv
http://techtalks.tv/talks/algorithmic-trading-and-machine-learning/60847/

Amazon.co.jp: 金融データ解析の基礎 (シリーズ Useful R 8): 高柳 慎一, 井口 亮, 水木 栄, 金 明哲: 本
http://www.amazon.co.jp/dp/4320123719

メモ: 作成されたインスタンスに順次アクセスする

概要

・インスタンスをforループで作成し、配列に格納し、その配列に順次アクセスすればよろし

コード

番外編

単純に指定したクラスのインスタンスに総当りでアクセスするには以下も使える

参考

python – Printing all instances of a class – Stack Overflow
http://stackoverflow.com/questions/328851/printing-all-instances-of-a-class

python – Creating instances in a loop with different variables – Stack Overflow
http://stackoverflow.com/questions/10674093/creating-instances-in-a-loop-with-different-variables

メモ: 強化学習の勉強シリーズ

概要

・本当に強化学習が理解できているのかが謎だったので教科書の勉強シリーズ(続くとは言っていません^^)

内容と結果

とりあえず参考文献のP150辺りにある図6.6, 6.7あたりを再現しようとしています。
図6.6は似たような結果が出るのですが、図6.7はTD(0)法に関してどうしてもRMSEが落ち着かず。。。
何度読み返してもどのように教科書上で計算が行われているのか理解できなかったのでブログに放流
(アルファ(ステップサイズパラメータ)が違うからなんじゃないんかとか思ったりするんですが)

再現することが目的だったのでソースの可読性とか書き方についてはご愛嬌ということで何卒m(_ _)m

図6.6
140905_fig6.6

図6.7(TD法が暴れん坊将軍の巻)
140905_fig6.7

参考文献

Amazon.co.jp: 強化学習: Richard S.Sutton, Andrew G.Barto, 三上 貞芳, 皆川 雅章: 本
http://www.amazon.co.jp/dp/4627826613

強化学習+為替トレード戦略(その2)

概要

・強化学習シリーズその2
・Epsilon-greedyのEpsilonに対する感度分析
→ とりあえずEpsilon=0.1でやろうと思うがQ値が収束していなさそう。。より早く収束させる方法が求められる
・学習させたQ値に対して汎化能力をテストできるようコードを追加
→ 学習期間と同じ期間に対してテストするも微妙な結果に

Epsilonに対する感度分析

相変わらずこのシミュレーション方法で合っているのかすら謎シリーズとも言いますが^^

・Epsilon = 0.5
Q値
赤マスはロングポジションが最適な状態、グレーはフラットポジション、青色はショートポジション。以下同様。
q_ep0.5

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.5

・Epsilon = 0.1
Q値
q_ep0.1

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.1

・Epsilon = 0.05
Q値
q_ep0.05

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.05

・Epsilon = 0.01
Q値
q_ep0.01

各エピソードの累積リターンのエルゴード平均(expanding window)
c_ep0.01

まあどれも累積リターンはなんとなく収束しているようなイメージですが、Q値がシミュレーションを回す度に変わるので、Q値がまだ収束していなさそうな雰囲気。ここは工夫が必要なんですかな。状態数が増えるとなおさらですし。

で、それぞれを比較してみると以下
ep_ret

ep_std

ep_ratio

上から、累積リターンの平均、標準偏差、平均/標準偏差を表しています。
リターンに関しては、探索の頻度(=Epsilon)を上げるほどある程度早く収束しているような気がしなくもない結果に。
ただし収束のレベルはEpsilonによってまちまちという感じ。
平均/標準偏差の比率でみると、0.1がもっとも高くなっておりまして、収束レベルが大きくかつそのばらつきもそれなりに小さい感じなんですかね。Epsilon=0.5とかにすると平均リターンも大きくなりますが、それのばらつきも大きくなってしまうということで比率に直すとそこまで良いというわけでもなく、ここはバランスなんですかな。

ということでEpsilon-Greedy以外のやり方もあるかとは思いますが、とりあえずEpsilon=0.1で今後は進めていこうと思います。

汎化能力のテスト

汎化能力と言いつつ、とりあえず学習期間と同様の期間にテストしてみます。
具体的にはモンテカルロを1000回まわしたあとに得られたQ値を元に、グリーティー方策で同じ期間を運用した場合の結果。

・2011年
testRet: 当該期間に買い持ちだった場合の結果
testMomentum: 当該期間に学習されたQ値を用いたグリーディー方策による結果
test2011

・2012年
test2012

・2013年
test2013

微妙ですな。

コード

loadData関数はFREDから対象ティッカー対象期間のデータを抽出するオレオレ関数です。
今回のシミュレーション対象もドル円(dexjpus)
複利型強化学習(参考文献2)なんてのもあるらしく、複利型でもシミュレーションできるようにしてますがまだうまく考察できてないのでペンディング。
self.isCompoundをTrueにすれば複利型になります。

メモ

やはりシミュレーションの度にQ値が変わるというのがやっかいでして、モンテカルロの回数を上げるというレベルを上げて物理で殴るという方法も考えられますが、もう少し見なおした方が良さそうですね。

また、状態に関してもとりあえず自分自身の長期と短期のシャープレシオを見ていますが、その背景の考えとしては、「今までワークしていた方法が今後もワークする」というまさに順張りのそれがありまして果たしてそれで十分かって話ですね。

今は20営業日と60営業日を見ていますが他のウィンドウで見ても良いですし、他の通貨ペアのパフォーマンスを見ても良いわけですしね。

参考文献

Amazon.co.jp: 強化学習: Richard S.Sutton, Andrew G.Barto, 三上 貞芳, 皆川 雅章: 本
http://www.amazon.co.jp/dp/4627826613

松井 藤五郎:複利型強化学習, 人工知能学会論文誌,
26(2):330–334 (2011)
https://www.jstage.jst.go.jp/article/tjsai/26/2/26_2_330/_pdf