2008/03/20

システムトレードの研究-1

金融工学を学んでいる途中なんですけど、ぼちぼち平行してシステムトレードの研究をしてみたいと思います。映像とは全く関係ないっすねぇ :) もうそろそろブログのタイトルを違うものにしたほうがいいかもしれないです。

というわけでシステムトレードの研究です。この記事は正直研究日誌的なもので、実際に運用している人にとっては全く役立たないっす。数ヵ月後自分がこの記事を見て「うわぁこれはねーよ」って言って赤面するために書いてます。あんま気にしないでください。

うっし。それじゃあ書いていくか。

システムトレードとは

投資法の一種で、一般にはプログラミングによって金融商品の分析、売買を全てコンピュータに委託させる手法のことを指している。広義では一定のルールを予め決め、そのルールに従って売買を繰り返す手法もシステムトレードと言うので、必ずしもコンピュータで完全に自動売買させることを指すわけではない。

システムトレードの利点

  • 過去のデータを用いてシステムの検証ができる。過去のあらゆる時点でテストを行うことによって、その構築したシステムのパフォーマンスや欠点が判明し、よりよいシステムを構築することができる。
  • 感情を廃して取引を行えるため、きちんとしたプログラムを組めば人間よりも合理的な判断を行える。
    ex.人間は「損を極端に嫌う」という傾向がある。そのため一旦損をしてしまうと、その補填をしようと何回もリスクのある取引を行ってしまい、深みにはまってしまう(ざわ・・・ざわ・・・)とか。

システムトレードの欠点

  • 過去に無い相場に遭遇した場合、損失を出すリスクが高くなる。
  • 過度にパラメータを最適化してしまうと、未知の事象に対処しきれなくなってしまうため、むしろ損失してしまう場合がある。

欠点を克服するにはどうすればいい?

  • 十分に長い期間(5年以上くらい)バックテストを行うことで、システムのパフォーマンスや欠点を分析する。
  • パラメータが現時点において適切であるような「合理的」なパラメータになるよう学習させる。

雑感

  • システムトレードで検索すると胡散臭いサイトばっかり出てくるのはなんで?プログラムで自分は何もしなくて良いという所が受けるんだろうか。
  • システムトレードでExcelを使っている人が多いけど、個人的にはそんなにExcel VBA使いたがるのか理解できない。
  • という自分はC#信者。
  • なんで金融系ってオープンソースコミュニティが成熟していないんだろう。あんまそういう閉鎖的な部分ってよくないと思うんすけどねぇ

次に実際に自分がプログラムしたシステムトレードについて書いていきます。

2008/03/01

ポスター製作。

Depalma-Poster

東北大学映画部 デパルマの新入生歓迎用のポスターを製作しました。製作時間は約4、5時間。下には連絡先とかが入ってたんですけど、公開するのはまずいんで省略。オブジェクトはXSIを用いて作成しましたが、こういう質感にするんだったら手書きでもよかったかも。これでモノクロ印刷とかだったら嫌だなぁ X-(

どうしても自分が作るとスタイルが明朝体になってしまって、映画の宣伝ポスターっぽくなっちゃう。なんかこういうスタイル好きなんですよ。エレガントだし落ち着きがあって。「Trajan」フォントなんてもう最高で、なんにも考えないとすべてこのフォントを使ってしまうってくらい気に入ってます。

最近映像系を全くやってないように見えますが、実はぼちぼちと進めています。ただすごく地道なんです。うぅ。もう少ししたら報告します。

2008/02/20

金融工学入門。

全然内容が映像とかけ離れているのですが、最近はここ一ヶ月くらい金融工学に興味がわくようになって、それで図書館に行って勉強してる感じです。

いままで経済学っていうとあんま数式を使わずにミクロ経済だとかマクロ経済だとかやってる印象が強くて、手を出す気にならなかったんですけど、この金融工学っていうのはむしろ数式をぶんぶん振り回して資産運用だとか投資だとかリスクヘッジだとかを合理的に選択するための学問らしいんです。驚いたのが経済学なのに確率微分方程式とか多重積分とかモンテカルロシミュレーションとか出てくるんですよ。え~!って思いません?自分は思った。

そしてやる気になった理由の二つ目としては、金融工学っていう学問が最近出てきた新しい理論(1950年代頃)であり、そしてその理論が広く金融機関に応用されているというところ。なんか個人でも応用できそうじゃないっすか?少なくともいままで習ってた中国語よりは役にたちそうです(あれ絶対一生使わないと思う)。

そんでどうせなら大学で習った数学の知識もあるし、見た感じそんな難しい数式はなさそうだからいっちょやってみっか!と思って大学の図書館から借りてみた本がこれ。

金融工学入門
金融工学入門
  • 発売元: 東洋経済新報社
  • レーベル: 東洋経済新報社
  • スタジオ: 東洋経済新報社
  • メーカー: 東洋経済新報社
  • 価格: ¥ 2,730
  • 発売日: 2002/04
  • 売上ランキング: 259606

印象としては自分のような理系大学生相手に分かる程度の数式を組み立ててって、無裁定価格理論から最終的にはノーベル経済学賞を受賞するに至った「ブラック-ショールズ方程式(Black-Scholes equation)」を導出するよっていう内容。大学の講義と同じようにノート取りながら、大体2ヶ月かけて読破しました。読んだ感想としては、

「いやぁーすごいっすねぇー言われりゃあ分かりますけどこんなん思いつかないっすよ~」

という感じ。でも金融工学が大体どんな感じの理論なのかは理解できました。そして現在読み始めてる本がこれ。

金融工学入門
金融工学入門
  • 発売元: 日本経済新聞社
  • レーベル: 日本経済新聞社
  • スタジオ: 日本経済新聞社
  • メーカー: 日本経済新聞社
  • 価格: ¥ 5,040
  • 発売日: 2002/04
  • 売上ランキング: 95035
  • おすすめ度 4.5

入門書と言っておきながらとにかく分厚い。600ページくらいある。小さい辞書並み。4月末返却予定なんですけどそれまでに読破する気になれません。うぇ。

前の本が理論的に金融工学について説明しているのに対し、今回の本はどちらかというと「どのようにして金融工学を用いるのか」について重点的に語っている印象。もちろん数式や証明などの理論的説明も載ってます。前の本を読んでいるおかげで、少しですがさくさく読める感じです。

で、まだ学習している途中なんですがいまんとこ思っていることは

「これ応用範囲広すぎ」

です。

お金っていうのはたとえ好きだろうが嫌いだろうが-資本主義社会にいる限り-否応なしに自分らの生活に深くかかわってきます。そしてそれにまつわる問題(例えば住宅や車などのローンとか保険とか)も生きているうちに出会うことになります。

金融工学とか投資科学は、そういったお金に関するリスクを適切に管理する合理的な選択肢を提示してくれる。それが強みなんかなぁと思っています。あんま学んでないんで偉いこと言えないですけど・・・

最後に投資科学についての応用について言及している『金融工学入門』デービッド・G・ルーエンバーガー氏の文章を引用して終わります。

投資分析は、代替案を検証し、どの代替案が最も好ましいかを決定する方法である。(p.4)

個人に対しては、それは住宅のモーゲージの決定や、退職に対する計画などの個人の投資決定に適用される。また、製品開発に投資すべきか、新しい製造工場を建設すべきか、どのように資金源を管理するかといった、事業の意思決定にも適用される。最後に、ダムを建設すべきか、税率を変更すべきかなどといった行政の意思決定にも適用される。(p.3)

2008/02/13

After Effectsのエクスプレッションでパーティクルを表現する-03

お久しぶりです。それではAfter Effectsのエクスプレッションでパーティクルを表現する記事の第三回目です。今回は今までの知識を応用しつつ、もうすこしパーティクルの挙動を複雑にしていきます。途中で少し数式が出てきますがそんな難しくないんで大丈夫だと思います。(クリックで動画再生)

前回より少し複雑な運動にしてみました。それではこのような表現をExpressionでつけていきます。このプロジェクトのデータはこちらからダウンロードできます。

基本的な考え方

基本的な考えは前回と同様です。ただ今回はパーティクルの動きを複雑化するために、少し数学の力を借りることにします。

今回は曲線が中央から飛び出すような表現にしたかったので、パーティクルの動きを二次元の極座標として考えて、運動を記述することにしました。画面中央を原点とすると、パーティクルの位置ベクトルxは、

math01

math02

で考えると都合がよさそうです。ですがべつにこれといって根拠があるわけではないので、そこは各々が適当にやればいいような気がします。後はこのkr,Cr,θ0,Cθの値を各インデックスごとにランダムにしてやればうまくいきそうです。

しかし様々な曲線が飛び交うようにするには、Cθの値をある程度極端にしなければなりません。ただCθを、例えば-10 < Cθ < 10として、その値を一様な乱数で決定してしまうと、Cθ ~ 0、つまり直線も曲線と同じ割合で作られてしまいます。それはできるだけ避けたかったので、今回は練習がてら「確率密度関数」を始めに定義して、その確率分布に従う乱数を生成するようにしました。

確率密度関数

今回はCθ~0の部分をなるべく作らないように、確率密度関数f(x)を

math03

として定義しました。

math04

(イメージとしてはこんな感じ)

今回はこの確率密度関数f(x)を用いて、Cθを作ることにします。

それではエクスプレッションを記述します。nullを作成。レイヤー名を"system"とし、スケールにアニメーションを打ち、パーティクルの名前を"c_01"とします。そしてパーティクルの位置とスケールのエクスプレッションに以下を記述します。

位置のエクスプレッション



var system = thisComp.layer("system");
var rate = thisComp.layer("system").effect("レート")("スライダ");
var seed = thisComp.layer("system").effect("シード")("スライダ");
var centre = thisComp.layer("system").position;
var varR = thisComp.layer("system").effect("半径のヴァリエーション")("スライダ");
var VR = thisComp.layer("system").effect("半径速度")("スライダ");
var varVR = thisComp.layer("system").effect("半径速度のヴァリエーション")("スライダ");
var kr = thisComp.layer("system").effect("半径変位量")("スライダ");
var ktheta = thisComp.layer("system").effect("角度変位量")("スライダ");

/*--------Expression記述-----------*/
var index = name.slice(2,4)-1;
seedRandom( seed+index ,true );
var otime = time - index/rate;
var t;
if(otime > 0){
t = otime;
}else{
t = 0;
}

//運動式の記述
var r = random(kr-varR, kr+varR)*Math.log( random(VR-varVR,VR+varVR)*t + 1);
var theta = random(6.283) + RZRandom(ktheta)*t;

var pos = [r*Math.cos(theta),r*Math.sin(theta)];

centre + pos;

//棄却法を用いて確率分布を作成。
function RZRandom(alpha){
var x,y;
while(1){
x = random(-alpha, alpha);
y = random(0, alpha);
if( Math.abs(x) > y ){
return x;
}
}
}

確率密度関数のところは棄却法を用いました。


スケールのエクスプレッション


var system = thisComp.layer("system");

var rate = thisComp.layer("system").effect("レート")("スライダ");
var seed = thisComp.layer("system").effect("シード")("スライダ");
var variation = thisComp.layer("system").effect("スケールのヴァリエーション")("スライダ");

/*----------Expression開始------------*/
var index = name.slice(2,4)-1;
seedRandom( seed+index,true );

random(1-variation, 1+variation)*system.scale.value_at_time( time - index/rate );


particle03SS
プロジェクトのスクリーンショット。



最後にエコーとグローを加え、タイムリマップで強調させて完成です。レンダリングは正直かなり重いですが、それでもパーティクルのレートや速度、その変化量まで柔軟に変更できるという点が便利かと。

2008/02/11

Modxの文字化けを解消する方法

modx

現在構築中のWebサイトのCMSにModx(version 0.9.6.1)を導入しているのですが、ローカルで構築したxampp上のModxのデータベースをlolipopに移そうとすると、どうしても文字化け状態で出力されてしまう。ローカルでは文字化けしてないのに。なんで?なんで?なんで?

普通なら

  • phpMyAdminを用いてデータベースをエクスポート
  • それをlolipopのphpMyAdminからインポート

するだけなのに、どーもこのままでは見事に文字化けしてしまって上手くいかない。Modx経由でエクスポートしたり、EUC,SJISエンコードに変換してみたり、エクスポートファイルをUTF8に変換してみても全く意味がなし・・・う~ん・・・このままじゃ安心してバイトにもいけません。

数時間ほど格闘した結果、どうやらphpMyAdmin経由でMySQLのエクスポートを行うとphpMyAdminが『親切なことに』テーブルに設定してある照合順序の文字コードに変換して出力してくれるらしいことが判明しました(自分の場合はLatin1でした)。

つまり自分の場合ですと、phpMyAdmin側からするとエクスポートの際、

  • Latin1の文字をUTF-8に変換してくれている

はずなのに、実際はModx側のミス(といっても問題ないと思う)で、最初のデータベース作成の部分で照合順序にLatin1をデフォルトで指定してしまっているため、

  • UTF-8の文字をさらにUTF-8に変換する

という二重変換が行われていた結果、文字化けが生じてしまったらしい。よけいなことをー

それでこの問題をどうすればいいのか。だらだらと書いてきたけど解決方法は容易で、要は『変な文字コード変換をせずに生のデータ(バイナリ)を出力する』ようにすればよい。そうすればもともとデータベーステーブルにはUTF-8状態でデータが存在しているので、生の状態でもきちんとしたUTF-8の文章が出力されることになるはずです。

phpMyAdminはバイナリ状態でエクスポートすることはできないので、そのために今回は"MySQLDump"を使用して、コマンドプロンプトから

mysqldump -u root -p --compact --compatible=mysql40 --default-character-set=binary "データベース名" > "出力ファイル名"

注)--compatible=mysql40オプションはlolipopのMysqlのバージョンがローカルのより低かったからつけただけです。他のレンタルサーバ(xreaとか)はなくてもいいかも。

を実行!見事バイナリ形式で出力されましたので、これをlolipopにインポート。無事文字化けしないでデータベースがインポートされました。ふぅ。

Modxの文字化けに悩んで検索から飛んできた人はぜひ試してください~