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とかデータマイニング関係に詳しい人いないかな。