2008/07/31

linuxで一斉に画像をリサイズしたい場合

とある事情で2,300枚ある画像をすべて800x600のjpgに変換しなきゃなんなくなりました。

最初は面倒くさいから「縮小専用。」をwineで動かそうかなっていう安易な発想をしていたんですが、どうもドラッグ&ドロップのイベントが効かなくなっているようで動く気配がありません。しょうがないのでlinux上でなんとかしなきゃということで調べてみたら、mogrifyコマンドがどうやら有効なようで。対象のディレクトリに移動してから、
$ mogrify -geometry 800x600 -quality 80 *.jpg
で一発でした。ただし画像はすべて上書きされてしまうので、不安だったらバックアップをとってください。
このmogrifyコマンド、スケールだけじゃなくてどうやらクリップやドロップシャドウなんかもできるらしいので、結構高性能です。

それにしてもlinuxは覚えると圧倒的に楽ですが、それまでが大変ですね。

2008/07/28

The ting tings - Great DJ & Shut Up And Let Me Go

Motion Graphicsとしてはあまり真新しいものではないですが、最近気に入っているバンドなので掲載しました。

Wowowをぼーっと見ていたら偶然このバンドのPVが流れていたので、気になって後で調べてみたらびっくり。このバンドってiPodのCMに使われたことがあるみたいです。The fratellisの件といいDaft Punkの件といい、iPodのCMに使われるアーティストと自分が好きなアーティストにはどっかしら共通点があるのかもしんないです。


The Ting Tings - Great DJ

これが最初にwowowで見たPV。この人たちは本当にやる気があるんでしょうかというくらいダンスが適当。けどそれがいい。曲調と遊び具合がすんごく木村カエラっぽいなぁと思ったら、やっぱりカエラ自身もそう思ったらしく、お勧めだよと言ってました

The Ting tings- Shut up and let me go

手の中に映像があってさらにその手の中に次の映像があって…というよく使われている手法ですが、自分はこの手法が大好きです。途中のカンフーはたぶんアクションシーンが好きで入れたんだと思います。だって唐突でよくわかんないし。

ちなみに名前の由来は中国語のTing(聴く)からきているらしいので、そういう変な意味はないです。

2008/07/25

CodeReposをやることにしました。

CodeReposのcommit権作っといたよーっいうメールが届いてました!

いままでプログラムを書く際にはローカルなレポジトリを作ってそこで管理するようにしていたんですが、これだと学校などで思いついたアイデアを実装したいときちょっとめんどいですし、なによりネット上で常に最新のリビジョンを公開することができません。
それでいろいろと調べてみた結果、CodeReposが一番自分の目的に合っているようなサービスだと感じましたので、これからはこのサービスを使って開発をしていきたいと思います。

それにしても、このサービスは基本的にハイレベルなプログラマーがちょこちょこcommitしているような印象がありますので、ちょっと緊張しますね。

2008/07/14

Black-Scholes Equation in Python 改良版

前回のコードをある程度改良しましたので、載せておきたいと思います。主な改良点は以下。

  • ヨーロピアン(コールorプット)オプションのデルタ、ガンマ、ベガ、シータ、ローを求める関数を追加しました。
  • ヨーロピアン(コールorプット)オプションのインプライド・ボラティリティをニュートン法より求める関数を追加しました。
  • その他若干の名称変更や、引数に関する説明を加えました。

数式は"Black-Scholes (1973) Option Pricing Formula"を参考にしました。

インプライド・ボラティリティに関しては適切な引数を加えないと、負の値や無限大に発散することがあるので注意が必要です。とはいえ実際の市場価格と理論価格がそこまで乖離することもないでしょうから、大抵正常な値を返すはずです。

商用、非商用に関わらず自由に使用、改変していいですし連絡する必要もないですが、無保証です。使う人はあんまいないと思いますが、一応建前として。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
Functions for calculating the Black-Scholes equation.
"""
import math

A1 = 0.319381530
A2 = -0.35653782
A3 = 1.781477937
A4 = -1.821255978
A5 = 1.330274429
RSQRT2PI = 0.3989422804
GAMMA = 0.2316419

def BS_Call(S,K,T,R,V):
"""Calculate the Black-Scholes formula for a call option.

Arguments:
S:the price of the underlying stock
K:the strike price
R:the continuously compounded risk free interest rate
T:the time in years until the expiration of the option
V:the volatility for the underlying stock
"""
d1,d2 = _getD1D2(S,K,T,R,V)
ret = S*_normalDist(d1)-K*math.exp(-R*T)*_normalDist(d2)
return ret

def BS_Put(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
ret = -S*_normalDist(-d1)+K*math.exp(-R*T)*_normalDist(-d2)
return ret

def BS_Call_IV(S,K,T,R,Pr,HV,maxNum=100,i=1):
"""Calculate the Implied Volatility using Newton's method.

Arguments:
Pr:the real price of call option
HV:the Historical Volatility
maxNum:the number of repeating calculation
i:index(Do not specify this parameter)
"""
if i > maxNum:
return HV
else:
newV = HV - (BS_Call(S,K,T,R,HV)-Pr)/BS_Vega(S,K,T,R,HV)
return BS_Call_IV(S,K,T,R,Pr,newV,maxNum,i+1)

def BS_Put_IV(S,K,T,R,Pr,HV,maxNum=10,i=1):
if i > maxNum:
return HV
else:
newV = HV - (BS_Put(S,K,T,R,HV)-Pr)/BS_Vega(S,K,T,R,HV)
return BS_Put_IV(S,K,T,R,Pr,newV,maxNum,i+1)

def BS_Call_Delta(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return _normalDist(d1)

def BS_Put_Delta(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return _normalDist(d1) - 1.0

def BS_Gamma(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return _normalDist(d1)/(S*V*math.sqrt(T))

def BS_Vega(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return S*_normalDist(d1)*math.sqrt(T)

def BS_Call_Theta(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return -S*_normalDist(d1)*V/(2*math.sqrt(T))-R*K*math.exp(-R*T)*_normalDist(d2)

def BS_Put_Theta(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return -S*_normalDist(d1)*V/(2*math.sqrt(T))+R*K*math.exp(-R*T)*_normalDist(-d2)

def BS_Call_Rho(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return K*T*math.exp(-R*T)*_normalDist(d2)

def BS_Put_Rho(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
return -K*T*math.exp(-R*T)*_normalDist(-d2)

def _getD1D2(S,K,T,R,V):
vSqrtT = V*math.sqrt(T)
d1 = (math.log(float(S)/K)+(R+(0.5*V*V))*T)/(vSqrtT)
d2 = d1 - vSqrtT
return (d1,d2)

def _normalDist(x):
if x >= 0:
k = 1.0/(1.0 + GAMMA*x)
cnd = RSQRT2PI*math.exp(-0.5*x*x)*(k *(A1+ k*(A2+ k*(A3 + k*(A4 + k*A5)))))
ret = 1.0 - cnd
return ret
else:
return 1.0 - _normalDist(-x)

て、そんなことやってる場合じゃない。早くテスト対策行なわないと。

2008/07/13

Black-Scholes Equation in Python


Photo by Martinlu, "Math"

やっぱ金融学んでるんだったら、オプションの理論価格ぐらい自分で出さないといけないよねー
ってわけで、あっちの方面では超がつくほど有名なBlack-Sholes Equotionをノリで実装してみました。特にこれといって特別なことはしてないですし、もう既にどっかの誰かがやってそうですが、こんくらい自分でやんないと。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import math

A1 = 0.319381530
A2 = -0.35653782
A3 = 1.781477937
A4 = -1.821255978
A5 = 1.330274429
RSQRT2PI = 0.3989422804
GAMMA = 0.2316419

def Black_Scholes_Call(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
ret = S*_normalDist(d1)-K*math.exp(-R*T)*_normalDist(d2)
return ret

def Black_Scholes_Put(S,K,T,R,V):
d1,d2 = _getD1D2(S,K,T,R,V)
ret = -S*_normalDist(-d1)+K*math.exp(-R*T)*_normalDist(-d2)
return ret

def _getD1D2(S,K,T,R,V):
vSqrtT = V*math.sqrt(T)
d1 = (math.log(float(S)/K)+(R+0.5*V*V)*T)/(vSqrtT)
d2 = d1 - vSqrtT
return (d1,d2)

def _normalDist(x):
if x >= 0:
k = 1.0/(1.0 + GAMMA*x)
cnd = RSQRT2PI*math.exp(-0.5*x*x)*(k *(A1+ k*(A2+ k*(A3 + k*(A4 + k*A5)))))
ret = 1.0 - cnd
return ret
else:
return 1.0 - _normalDist(-x)

ちなみに累積正規分布関数のところは5次の項まで近似した関数を使ってます。

2008/07/02

そういうこともある。

うーん…最近はなんかずっと『三歩進んで二歩下がる』を地で行っているような気がします。
調べる→組んでみる→お、これ凄いんじゃね!?→あー間違ってた…成果微妙…
の繰り返し。そりゃあ一朝一夕で全てを成すことができるとはとても思っていませんが、高揚の次に必ず待っている失望がかなりやんなっちゃう感じです。

http://ymatsuo.com/
最近見つけたサイト。「業績」の欄を見てみると、人工知能とWebの特性を生かした面白い研究をなされているようです。
日本語でこういった最新の論文を見ることが出来るというのはかなり珍しいですので、これから要チェック。