2008/06/24

雑感。


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

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

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