2008/06/26

これは…

http://jihan.sblo.jp/
KOREHA…ここまで衝撃を受けたブログはもしかして初めてかもしれない。こういう地道な積み重ねは自分にも必要だと思う。

2008/06/24

FXのレバレッジについて。


Photo by cobalt123, "Money, Hanging On"


レバレッジとは?

外国為替証拠金取引であるFXは、証券会社に証拠金を手渡すことによって、それを元手に何倍、何十倍もの通貨を取引することができ、その仕組みを「レバレッジ」と呼びます。

例えば1万円を証拠金として1ドル100円の通貨を1000個購入して、後に1ドル120円になったときに売却したとすると、購入したときの代金は100*1000 = 10万円。それが後に12万円になっているので、差益は12万円-10万円=2万円。レバレッジは10万円 / 1万円 = 10倍となります。要は金利のない借金みたいなものです。実際にかけられるレバレッジの量は証券会社によって違いがありますが、だいたい400倍くらいが最高のようです。

さて、他のFXについて言及しているブログではレバレッジについてあんまり詳しく書いていなくてちょっと不満だったので、これを数式にして、そのあとそれから生じるリスクについて考えてみることにしました。

レバレッジの数式

あなたは優秀な投資家で、常に安定した複利で資産を成長させることができるものします。それにレバレッジを常に一定の倍率でかけた場合、資産はどのように成長するのでしょうか?

まずN0を初めに投資する資産金額、rを1期間における複利、Lを1期間にかけるレバレッジの倍率と定義します。そうすると1期間後における資産金額N1は以下のように表せます。

これは第2項目までが1期間によって生じた収益、第3項が元の金額となっています。同様にこの数式を2期間後にも適応してみましょう。

このように綺麗な数式となりました。これを第n期間まで拡張すると、

となります。単純にレバレッジをかけずに運用した場合、L=1となるので、この式はrをL倍した複利で運用することに相当します。

で、結局なんなのさ?

具体例で考えてみることにします。もしあなたが年利10%で安定した運用を行えたとすると、これをレバレッジをかけずに10年間続けた場合の資産の倍率はL=1,r=0.10より
(1+0.1)^10 = 2.59
となります。それではレバレッジを仮に3倍でかけたとすると、L=3となるので、倍率は
(1+3*0.1)^10 = 13.79
となります。全然違いますね。Lの値がN0ではなく、指数関数に入っているところが恐ろしいです。

でもそんなおいしい話が転がっているわけがない

そりゃあ安定して10%も運用できればいいですが、普通は下落するリスクも併せ持っていることが普通です。14倍になるってことは資産が14倍下落するリスクも同様に併せ持っているということです。

仮にrが確率変数で、平均がµ,標準偏差がσだとすると、確率変数の性質よりLrの平均はLμ,標準偏差がLσとなってしまいます。このことよりリスクもリターンもLに比例していることがわかります。

しかもFXは一度でも資産があるデッドラインまで下がったら自動的にロスカットが実行されてしまいます。つまりレバレッジを上げるということは、資産を失う確率も高めるということです。

どれくらいのレバレッジなら許容できる?

追記。それではどれくらいのレバレッジならば、ロスカットとならずに比較的安定した運用ができるのでしょうか?

通貨をUSDJPYで固定して、1年間の運用を行うものと考えてみます。仮にrが正規分布に従う確率変数として、1年間のリターンをμ[%],1年間の標準偏差(ヒストリカルボラティリティ)をσ[%],ロスカットとなる利率を-d[%]とすると、限度であるレバレッジLは

となります。試しに計算してみましょう。スワップ派のサイトによると、USDJPYのHVはσ=6.95%であるので、今回は確実に安定して運用するために95%の確率で収束する2σを採用します。またμの値はUSDJPYのスワップポイントである、2.1%を採用します。そしてdを50%とすると、Lの値は
L = 50 / (6.95*2 - 2.1) = 4.24[倍]
となるので、レバレッジが4倍以内であれば、およそ95%の確率で安全圏に収束するということが分かります。

まとめ

  • 確実に利益を出せるという自信がない限り、あまりレバレッジを極端にかけないほうがよい。
  • 逆に言えば、確実に利益が出せる自信があるなら積極的にレバレッジをかけたほうがよい。
  • 何も考えずに400倍とかのレバレッジでやっている人はただのギャンブラー。

雑感。


Photo by oskay, "WhiteMenorah.jpg"

Webプログラミングに関しては数多くのフレームワークが存在して(DJango, CakePHP, Ruby on Rails, etc...)いるのにも関わらず、システムトレードに関しては全くといっていいほどフレームワークが存在していない。存在していてもなぜかアプリケーション上で動くわけの分からない独自言語(MetaTraderとか)だったりで、非常に汎用性が低いのが現実です。なんでだろ?そっちのほうが使いやすいから?明らかに開発コストもかかるし、ライブラリも充実しない気がします。

うーん…これからはシステムトレードも独自言語じゃなく、フレームワークで管理する時代だと思います。これは今大雑把に考えている構想ですが、整理するために文章に直してみます。

バックテストやシステム評価はフレームワークが総合的に管理して、ユーザはシステムの開発それだけに専念すればいい。そしてそのシステムは手直すことなく、そのまま実際に売買を行うことができます。SimulationとRealの差異はフレームワークがある程度吸収します。

ここまではMetaTraderが実現していることですが、違うのはシステムの根幹となる言語をpythonで作ることでOSを気にすることなくマルチプラットフォームで動くようにして、なおかつpythonで培われた既存のライブラリを利用できるという点。まさに「巨人の肩の上に立つ」ことで、従来のアプリケーションには出来なかった領域を開拓していくフレームワークが出来ればなぁと考えています。

どうだろ?とりあえず自分のためにいろいろ勉強してみますが、もしうまく開発が進んでいったらオープンソースでリリースしてみたいです。いままで散々オープンソースコミュニティにはお世話になってきましたから、すこしでも恩返しができればいいですね。

2008/06/16

Pythonのソートについて: sort()とsorted()


Photo by Fort Photo, "Fountains of Light"
自分のためにメモ。pythonでソートを行おうとする場合、リストに組み込まれている関数list.sort()と、単独で使える関数sorted()の2つがある。基本的に取る引数は同じなので機能自体はあまり変わりないのだが、以下の2点が異なる。
  • sort()関数は返り値を出さずに、リストの本体自体を変更してしまう。これはreverse()関数と同じ。
  • sort()関数はソートの対象がリストであるのに対し、sorted()関数は対象がイテレータとなる。
試しにpython上で確認してみる。
>>> x = [1,6,3,8,4]
>>> y = [1,6,3,8,4]
>>> y.sort()
>>> y
[1, 3, 4, 6, 8]
>>> sorted(x)
[1, 3, 4, 6, 8]
きちんと両方ともソートが行われているようだ。それでは次に引数cmp, key, reverseについて調べてみる。
"cmp"キーワードには、二つのオブジェクトxとyがあったときに、どちらが大きいのかを示す関数、あるいはλ式を指定する。普通はそのままで十分であるが、比較用のオブジェクトがちょっと特殊な場合に役立つ。
もしcmpキーワードを指定しなければならないような場合、通常ならばλ式の中にcmp(x,y)関数を導入する。cmp(x,y)関数はxとyを比較して、指定すべき適切な値を返してくれる関数。これを導入すれば、
あれ?cmpキーワードってx < yの場合にはx - yを指定すればいいんだっけ?それともy - xだっけ?』とかいうような余計な心配をしなくて済む。
"key"キーワードには、比較対象とするオブジェクトはどのオブジェクトであるのかを示す関数、あるいはλ式を指定する。何も指定しなかった場合、配列やタプルであれば一番目(インデックスが0)のオブジェクトが比較対象であると判別されるようだ。
"reverse"キーワードはソート結果が昇順であるか降順であるかを指定する。Trueを指定すると降順になる。sort()してからreverse()などのように2つメソッドをくっつける必要はない。
それでは今までの流れを踏まえて試しに簡単なプログラムを組んでみる。辞書には{"名前":"点数"}などのように名前と点数のペアが保存されている。これを点数が高い順に並び替えるというプログラムは以下のように記述できる。
>>> dic = {"Hanako":"50", "Taroh":"80", "Ichiroh":"30", "Yoshio":"60"}
>>> sorted(dic.items(), cmp=lambda x, y:cmp(int(x), int(y)), key=lambda x:x[1], reverse=True)
[('Taroh', '80'), ('Yoshio', '60'), ('Hanako', '50'), ('Ichiroh', '30')]
ちなみに上の式は以下のようにも記述できる(というかそっちのほうが普通)。
>>> sorted(dic.items(), key=lambda x:int(x[1]), reverse=True)
[('Taroh', '80'), ('Yoshio', '60'), ('Hanako', '50'), ('Ichiroh', '30')]
6/30 追記
最初のソート部分が間違っていたので修正しました。以前の書き方だとxとyは同一の配列オブジェクトを参照していることになりますね。すいません。

2008/06/15

GECCO


Photo by oldbones, "Evolution found in the trash."

GECCO は進化計算の分野で世界最大であり,最も伝統のある国際会議です. 口頭発表は投稿論文の50%以下に絞られますが,通常の発表論文とは別にポスターセッションでの発表, ワークショップでの発表,Late Breaking Paperとしての発表があります. また,学会参加者は,ワークショップやチュートリアルに無料で参加できます. この国際会議では,GAやGP,ESなど分野ごとにBest Paper Awardが授与されますが,その候補は事前の 審査で決定され,同一セッションで発表が行われます.
(http://www.ie.osakafu-u.ac.jp/~hisaoi/news/news_gecco.html)

GECCOという進化計算に関わる学会があるということを最近知りました。とりあえず一通りGA関連の論文を読んでみたいのですが、バックグラウンドの知識が殆どないので暫くは引用先、書籍とにらめっこしながら読むことになりそうです。

でも教授に直接聞いたほうが早いかも。近くにGAとかデータマイニング関係に詳しい人いないかな。

2008/06/14

そうだ。海へいこう。

全然いままでの内容とは関係ないのですが、今日急に海を見たくなったので、海を見に出かけることにしました。自転車で。出発地点は仙台駅からで、走行距離は片道約12kmくらいです。

最初は国道線をずっと東に進むだけだったのでけっこう大きめの店(ドンキホーテとかパチンコとかブックオフとか地方の国道線によくある店)が立ち並んでいたのですが、途中から抜けて一面の小麦畑へ突入。天気も風もちょうど良くて気持ちがいい。

小麦畑が終わった後は森の中へ。森の中は自分以外誰も居ないため生活音が全くなく、とてもしずかで、ちょっと暗い。夜立ち入ったら普通に怖いと思います。なんか落書きがあちこちにあるし。
しばらく歩いて、もしかしたらこのルート間違ってるんじゃないの?って思ったあたりで謎の階段が。一生懸命のぼっていくと、

「そのとき突然、魚の目をした男は、自分がどこに向かって歩いているのか、理解した----はっきりと理解した。心臓が止まらんばかりに。
 海だ。」
ーミヒャエル・エンデ 『鏡の中の鏡』ー


いやーほんと人並みな感想で申し訳ないんですが、ほんとうに大きいです。でかい。そりゃ今まで海を見たことがないわけじゃないですが、今回はなんか感じるものがありました。うん。すごかった。
予想以上に綺麗だったので自分以外に2,3人くらいしかいない宮城の砂浜の上で、しばらく海の音を聞きながら30分くらいぼーっとしていました。

その後はしばらく自転車でうろうろ。なぜか途中のサイクリングロードでおばさんと談笑したり、帰りの国道沿いの店によってみたりとか。

最後は偶然ドスパラ(仙台にあるとは思わなかった)を見つけて、立ち寄ったらメモリが1Gで2000円という安めの価格だったので思わず購入して、そのまま帰宅。思ってた以上に距離があってけっこう疲れたり、結局なにしたかったのかよくわかんない一日でしたが、なんだかんだで楽しかったんで結果オーライです。


大きな地図で見る

2008/06/12

MeCab+pythonという組み合わせ


photo by s1m0ne "Ocean tender love cocktail"


最近は日本語を解析してなんかできないかなぁと思っているので、形態素解析用のソフトウェアMeCabをインストールして、いろいろ遊んでいる状態です。インストールはそんなに難しくないと思いますが、とりあえず載せておきたいと思います。

まずはMeCabとその辞書、ライブラリ一式のインストール。ソースからビルドしてインストールするのでもいいですが、今回は手軽にapt-getを使用。
$ sudo apt-get install mecab mecab-ipadic mecab-utils libmecab1 libmecab-dev
で簡単にインストールできました。
ですがこのままでは辞書の文字コードがeuc-jpであるため、utf-8が標準のubuntuでは少し使いづらい。調べてみたら、IPA辞書をeuc-jpからutf-8に変えるコマンド
$ sudo /usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic
-o /var/lib/mecab/dic/ipadic -f euc-jp -t utf-8 -p
がありました(From ubulog)ので、それを実行。ためしにコマンドラインから


$ mecab
隣の客はよく柿食う客だ
隣 名詞,一般,*,*,*,*,隣,トナリ,トナリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
客 名詞,一般,*,*,*,*,客,キャク,キャク
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
よく 副詞,一般,*,*,*,*,よく,ヨク,ヨク
柿 名詞,一般,*,*,*,*,柿,カキ,カキ
食う 動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客 名詞,一般,*,*,*,*,客,キャク,キャク
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS


無事に文字化けせずに形態素解析が行われているようです。面白い!

次にpython上からmecabを動かしたいので、mecab-pythonバインディングをインストールします。
sourceforge.jpからmecab-python moduleをダウンロードして、メインディレクトリ上から
$ python setup.py build
$ sudo python setup.py install
でインストール。ためしにpython上から、
$ python
>>> import MeCab
>>> m = MeCab.Tagger("-Ochasen")
>>> print m.parse("羊をめぐる冒険")
羊 ヒツジ 羊 名詞-一般
を ヲ を 助詞-格助詞-一般
めぐる メグル めぐる 動詞-自立 五段・ラ行 基本形
冒険 ボウケン 冒険 名詞-サ変接続
EOS

無事に出力されていることがわかります。

あとは文章のキーワードを抽出するようなプログラムを自分で書くだけ…と思っていたのですが、なんともう実際にモジュールとして提供しているサイトを発見。しかもApache License v2.0なのでとても使いやすい。マジっすか!ということでこれも試用してみます。

まずはhttp://tanashi.s240.xrea.com/mword/にアクセス。mword.pyとして保存。ただしこれは辞書がeuc-jpであることを前提としているので、エンコーディングをutf-8にした上で、"coding: euc_jp"から"coding: utf-8"に変更します。そしてsample.pyを手本にしながら、試しにあるニュース記事のキーワード抽出を行ってみると、

キーワードを抽出させる元の文章:
「4月半ばからレンジ相場が続いてきたドル/円<JPY=>が10日、テクニカル上の上値抵抗線だった106円半ばを上抜け、3カ月ぶり高値を更新した。バーナンキ米連邦準備理事会(FRB)議長の発言などをきっかけに、市場では米当局が信用リスク問題をにらんだ金融緩和から、インフレとドル安警戒に軸足を移したとの見方が強まっている。ドルは短期的に2月高値の108円台への上昇を見込む声も上がっている。....」

$ python test.py | head -n 10
ドル 63.639610
市場 17.320508
通貨 16.000000
インフレ 14.000000
上昇 13.856406
姿勢 12.000000
発言 10.392305
米当局 10.182920
豪ドル 9.797959
ドル安 8.239069

と、どうやらドル通貨に関する記事であるということがわかります。きちんとキーワード抽出を行えているようです。

しかし、殆どソースコードを書かずに日本語解析まで出来てしまうと、逆に心配になってきます。
『車輪の再発明は極力行わない』というのがプログラミングでの大原則ですが、ここまで簡略化されてしまうとなんか申し訳ないですね。開発者に感謝。

Monster Television Commercial: Stork

ちなみにMonster.comっていうのはアメリカの求人サイトなので、そこらへんを考慮に入れれば何を伝えたいのか分かりやすいんじゃないかと思います。それにしてもCMとは思えないくらいの綺麗な映像です。製作はFramestore



ついでにもう一つ。


2008/06/07

ランダムフォレスト(Random Forest)法を用いて株価予測を行ってみた。-03


photo by Desktopography

第三回。それでは今回行った手法について概要を説明していきます。

概要

まず株価についてのデータが欲しかったので、pythonで株価をネット上からダウンロードして結合するスクリプトを作成。そしてその時系列データを元に前日のデルタ、ヒゲの長さ、出来高などの実測値、Moving Average,MACD,RSI,Bolinger Band,RW%R...などのテクニカル指標を合わせて70個ほど算出し、CSVデータとして保存します。



CSVデータをOpenOffice.orgで開いた状態。


そのデータセットを元にR上で学習させます。予測させる数値は『翌日の終値-翌日の始値』とします。一応Rのソースを下に載せておきます。


> library("randomForest") #RFパッケージの読み込み
randomForest 4.5-25
Type rfNews() to see new features/changes/bug fixes.
> d <- read.csv("dataset/2502_R.csv", header=T) #CSVデータの読み込み
> dim(d) #次元の確認
[1] 1794 83
> d.learn <- d[1:1500,] #データを学習用と
> d.test <- d[1501:1794,] #テスト用に分割する
> d.rf <- randomForest(Result~., data=d.learn, ntree=300) #RFで学習させる。
> d.pred <- predict(d.rf, newdata=d.learn) #予測。試しに学習用のデータを入力してみる
> cor(d.pred, d.learn$Result) #相関係数を測定
[1] 0.9693442 #正しく分類が行われていることが分かる
> d.pred <- predict(d.rf, newdata=d.test) #テスト用のデータを用いて予測
> cor(d.pred, d.test$Result)
[1] 0.0266478 #ほぼ無相関の値を示す

結果


どうやらきちんと学習が行われているようなのに、未来のデータに対して予測を行わせるとほとんど無相関、つまりランダムの数値を返してしまうようです。この後も目的変数を『5日後の終値-翌日の終値』としたり、さまざまな銘柄に対して学習と予測を行ってみましたが、良くても相関係数が.2くらいで、実際に使えそうなデータはありませんでした。これは「過去の時系列データを元にして株価がどれくらい動くか予測することはかなり困難である」ことを表しています。

ウィーク型の効率的市場仮説によれば、時系列データを元に予測を行うことは不可能であると言っているわけですし*1、このような結果が出たのはある意味当然かもしれません。
でも結局『なんだかんだやっても予測はできない』で終わらせるのは正直微妙なので、ちょっとあるデータを加工して再び解析を行ってみたら、今度はけっこうおもしろい結果が出るようになりました。でももうこれ以上書いてしまうと長くなってくるので、続きは次回。


解析しているUbuntu(8.04 Hardy Haron)のスクリーンショット。使いやすくて綺麗。

*1 ただ本当にそうかと言われれば正直微妙なところです。株価は人間の心理によって動くわけですから、当然非合理的な動きをする部分もあると思います(たとえそれがマクロ的には消えてしまうにしても)。

2008/06/04

Lakai - Fully Flared Intro


Lakai- Fully Flared Intro

Motiongrapherを見ていたらおもしろい動画を発見したので掲載します。最初はただのスケートボードプレーの動画かなぁと思ったら、1分あたりで度肝を抜かれました。なんていうか、無茶苦茶です。

iPhone meets Softbank mobile

この度、ソフトバンクモバイル株式会社は、今年中に日本国内において「iPhone」を発売することにつきまして、アップル社と契約を締結したことを発表いたします。
「iPhone」について | ソフトバンクモバイル株式会社

おお〜!!!!ついに日本でiPhoneが販売されるのか〜!でもまさかソフトバンクとは思わなかった…

正直パケット代とかCMとかどーなるんでしょー?あのお父さんCMで出すんでしょーか?うーん…

2008/06/01

Ubuntu 8.04 (Hardy Heron)にRpyをインストールする。

pythonの上からRを扱いたかったので、RPyをUbuntu 8.04(Hardy Heron)にインストールしようと試みたんですが、どうやらこのまま
$ sudo apt-get install python-rpy
とかでインストールすると、インポートの段階でRPyモジュールが足りないなどのエラーがでるようです。

えーそれじゃあソースからコンパイルするしかないのかなぁ面倒くさいなぁとか思っていろいろ調べてみたら、どうやら8.04だけではなく、Ubuntu全般で起こる問題なようでいろんな人が書き込みを行っていました→(rpy import error at Gusty)。自分の他に躓いた人もいるかもしれないのでメモしておきます。

いろんな方法がありますが、いまのとこ一番楽な解決方法は以下のとおり。

  1. "http://cran.r-project.org/bin/linux/ubuntu/"にアクセス。自分が使っているヴァージョンを選択(自分の場合は"hardy")
  2. "r-base-core_2.7.0-1hardy0_i386.deb"と"python-rpy_1.0.3-1hardy0_i386.deb"の両方をダウンロードしてインストールする(ただし自分の場合AMD64を使っていたので、amd64をインストールしました)。警告がでるかもしれないけど気にしない。
  3. 無事インストールが完了したら、
    $ python
    >>> import rpy
    できちんと動作するか確認する。

本来こんなどーでもいいことで時間が取られるのはあんま好きじゃないんですが、いやぁーとりあえず解決できてよかったよかった。