Translate

2019年2月5日火曜日

ブログを移転しました。

新たにブログを開設しました。
https://n.k-kachi.net

新規の投稿は新しいブログのほうに行う予定です。
新ブログの方もよろしくお願いいたします。

2018年9月12日水曜日

リーマン計量を「導く」

ご無沙汰しております.
最近情報幾何の勉強をしており,その過程でリーマン計量がでてきたのですが,定義がやや天下り的だと思ったので自分なりに考察してみました.

 ベクトル空間とその双対

体K上のベクトル空間$V$を考えます.(よくわからない場合は$K$を実数として普通の実数ベクトルがなす空間を想像してください.)
このとき,関数$V\to K$のうち「良い性質を満たす」関数の集合$V^*$もまたベクトル空間になることが知られています.
この$V^*$を$V$の双対なベクトル空間といいます.

ここで$V$,$V^*$からそれぞれ一つずつベクトル$x$,$x^*$を取ってきましょう.
すると $x^*(x)$はKを返します.
このことから二項演算$\tilde{\cdot}: V\times V^* \to K$を定めることができます.(つまり$x\tilde{\cdot}x^* = x^*(x)$)

この二項演算$\tilde{\cdot}$を内積に変えていきます.

ベクトル空間の圏

得られた二項演算$\tilde{\cdot}$は$V$,$V^*$を引数に取ります.
しかし内積は$V$を2つ引数に取ります.
そこで,2つの$V$のうち一つを$V^*$に変換してしまうという戦略を取りましょう.

ここからは圏論の力を借ります.
(ベクトル空間の圏が完備であることに注意)

$V$を$V^*$にする変換は$V\to V^*$とかけます.
$V^*$は$V\to K$のことだったのでこれは$V\to V\to K$と書き直せます.
これに逆カリー化を施すと$V\times V\to K$ となります.
つまり,求めたい変換は$V\times V\to K$となります.

ベクトル空間の圏の直積はテンソル空間のことでした.
なので求めたい変換は$V\otimes V\to K$,つまり$V\otimes V$の双対空間ということになります.

リーマン計量

ここまでくればリーマン計量が一体何者なのかが見ててきます.
これまでの議論は任意の体$K$で成立しますが,多様体を考えるときは$K$は実数のみを考えます.

 上で得られた変換$T$を用いて,「内積っぽい」二項演算$\cdot : V\times V \to \mathbb{R}$を定めることができます.(つまり$x\cdot y = (T(x))(y)$)
実は$T$のうち$\cdot$が「内積にふさわしい性質」をもつものに限定したものがリーマン計量と呼ばれているものになります.

まとめ

  • リーマン計量は双対空間への変換$V\to V^*$とみなせる
  • 実態は$V\otimes V$の双対空間

2017年4月6日木曜日

Rust のすゝめ

最近Rustという言語にハマっているので簡単に紹介したいと思います。

Rustとは

公式サイトにかかれている通り、Rustは
  • Safety
  • Speed
  •  Concurrency
に焦点をあてたプログラミング言語です。CやC++のように低レベル処理を行うことができます。
ちなみに実行速度は爆速です。コンパイル時にLLVMを使って最適化されるため、Cと同程度の速度が出ます。

しかし、ただ速いだけではありません。Rustで書かれたプログラムはCやC++と異なり安全です。この安全性が Rustの1番の強みといっても良いでしょう。Rustは「所有権(Ownership)」という概念を取り入れ、安全性を担保しています。

所有権(Ownership)

まず所有権について話す前に下のような簡単なコードを見てみましょう。Rustを知らなくてもノリで読めると思います。

このコードはちゃんと動きます。ではさらにもう一回関数fを呼んでみましょう。

今回はエラーを吐かれてしまいました。
use of moved value: `a`
というエラーです。このエラー、実は所有権に違反したために生じたものです。 お気づきかもしれませんが、2つ目のプログラムにはバグが含まれています。1回目のfで引数のaはフリーされているため、もうaは何もデータを持っていません。なのでもう一回fにaを渡すことはできないのです。Rustは「所有権」という概念を用いることで、このようなメモリーに関するバグをコンパイル時に見つけることができます。これはセキュリティ上非常に重要なことです。

では2つ目のプログラムがなぜいけないのかを所有権という立場で説明します。4行目でaはデータの所有権を手に入れます。次に5行目でaが関数の引数xに代入されますが、このときデータの所有権はaからxに移ります。よってこの時点でaはmoveされます。なので6行目でもう一度aを使おうとするとコンパイラに
use of moved value: `a` 
と怒られるのです。

ただ所有権を手放すのではなく、使い終わったらデータの所有権を返してもらいたい時もあります。Rustはこのようなときのために借用(Borrow)という仕組みも用意しています。(詳しい説明はググッてください)

実は、この所有権という仕組みは単に安全性を保証するだけではなく、データ競合など並行性に関する問題も解決してくれるのです。1コアあたりの処理能力が頭打ちになりマルチコア化が進む今、並行性は非常に重要です。

その他便利な文法

安全性を付加したという時点ですでにRustの存在意義は十分なのですが、Rustの良い点はこれだけにとどまりません。生まれて間もない言語なので、最近流行っている文法をふんだんに取り入れています。全部挙げるときりがないので、お気に入りのものをいくつか紹介します。

enumとmatch

RustのenumはCのそれと少し違います。集合論的に言うと、structが型の直積であるのに対し、型の直和にあたるものがRustのenumです。
matchはCのswich-caseの拡張版で、enumとの相性が抜群です。サンプルコードを載せておきます。

このenumとmatchは、Rustのエラー処理でも使われています。エラーが起こるかもしれない関数の返り値を、「正常値の型」と「異常値の型」のenumとすることで、プログラマはmatchを使ってそれぞれの返り値に応じて動作を変えることができるのです。

IteratorとClosure

イテレーターはPythonとかでお馴染みのあれです。クロージャーはラムダ式のことです(正確には嘘)。サンプルコードとして「正の奇数のうち3で割ったあまりが1のものを小さいものから順に10個足し合わせた和」 を求めるコードを載せておきます。

最後に

本当はもっと書きたいことはあるけど、めんどくさいので書くとしてもまた後日。

2017年3月9日木曜日

新通貨システムの模索 〜平等な世界を目指して〜

ようやく本題へ。

今回の目標は、今の通貨システムに変わる新たな通貨システムをつくり、貧富の差が勝手には生まれないような社会をつくることです。

新通貨システムの設計

前々回の投稿で価値関数を導入しました。この価値関数によって、お金の額面とその価値を別々のものだと捉えられるようになりました。今回はこの価値関数を基準に通貨システムを設計しなおすことにします。時間の項が絡むと複雑になるので、今回は省略します。

額面と資産

その前に単語をふたつ定義しておきましょう。額面と資産です。

額面はものの値段を表すものとし、これの単位をKachiと定義します。たとえば、このりんごの値段は0.1 Kachiである、というふうに用います。

一方資産はその人が持つ資産のこととし、これの単位をeKachiと定義します。給料などを思い浮かべてもらえばわかりやすいと思います。たとえば、私の年収は100 eKachiである、というふうに用います。

そして、これらは価値関数を用いて$y=f(x)$と変換できます。$x$は額面、$y$は資産です。

価値関数の設計

価値関数を「資産が自然とバラけるように」設計しましょう。

$\alpha, \beta >0$とし、価値関数の逆関数を$g=f^{-1}$と定義します。このとき、資産$\alpha + \beta$を額面に変換すると
$$g(\alpha + \beta)$$
となります。もしもこの資産を分割したあとに額面に変換すると、額面の合計は
$$g(\alpha) + g(\beta)$$
となります。「資産が自然とバラけるようになる」というのを、「資産を分割したほうが額面の合計は多くなる」と言い換えてあげれば、不等式として以下のように表現できます。
$$g(\alpha  + \beta) < g(\alpha) + g(\beta)$$
実は、
$$g(y)=\log (1+y)$$
は上の不等式を満たします。確認してみましょう。
$$g(\alpha  + \beta) - g(\alpha) - g(\beta)$$
$$=\log\frac{1+\alpha+\beta}{(1+\alpha)(1+\beta)}$$
$$=\log\left(1-\frac{\alpha\beta}{(1+\alpha)(1+\beta)}\right)$$
$$<\log 1=0$$

$g=f^{-1}$だったので、価値関数$f$は
$$f(x)=g^{-1}(x)=e^x -1$$
となります。

同じ人の中で資産を分割されても意味がないので、ひとりひとつだけウォレットを持ち、その中ですべての資産を管理するとします。

まとめ

今回は新通貨システムの原型を提示しました。やったことはただひとつ、
価値関数を$f(x)=e^x-1$に変更
しただけです。これにより自然と資産が分散していくことが期待できます。

まだまだ考えるべき課題があることは承知していますが、ぼくの目指す「新しい通貨システム」のイメージを伝えることだけは少なくともできたかなと思っています。

抽象的な議論が続いたので、具体例を考えて理解を深めましょう。

例えば、Aさんの資産が10 eKachi、Bさんの資産が1 eKachiの状況を考えます。この資産を関数$g=f^{-1}$を用いて額面に変換すると、それぞれの資産に対応する額面は、$\log(1+10)=2.40$Kachi、$\log(1+1)=0.69$Kachi、となり、二人の合計額は3.09 Kachiとなります。

ここで、AさんがBさんに2 eKachiあげたとします。このときAさんとBさんの資産はそれぞれ8 eKachiと3 eKachiになるので、これに対応する額面は、$\log(1+8)=2.20$Kachi、$\log(1+3)=1.39$Kachi、となり、二人の合計額は3.59 Kachiとなります。

これらふたつの状況を見比べると、二人の合計資産は変わらないのにもかかわらず、二人の合計額面は増えていることが確認できます。これは後者のほうが前者よりも「平等」だからです。

発展的内容:囚人のジレンマ

流通する額面の量が増えたら(本来の意味での)価値がさがるので意味がないのではないかと思ったそこのあなた!いいセンスをしてます。この疑問に対して「囚人のジレンマ」的議論で答えます。

大富豪のAさんBさんがいるとしましょう。ここでBさんだけが自分の資産の一部を平民に分け与えたとします。

もちろんタダであげるのではなく、見返りとして平民から労働力などを提供してもらいます。このとき大富豪と平民の間に格差があればあるほど、少ない資産で多くの額面を与えることができるので、1資産あたりに平民から得られる見返りは多くなります。

このときAさんのもつ通貨の価値はどうなるでしょう。Bさんが資産を分割したことで市場に出回る額面が多くなります。よってAさんの持つ通貨の価値は相対的に下がってしまいます。

よってAさんは、平民が貧乏なうちにBさんよりもはやく資産を分割したいと考えます。もちろんBさんも逆のことを考えるので、囚人のジレンマとおなじように(大富豪からみたら望まない結果である)平等な世界に落ち着くのです。

ぼやき

この新通貨システムにより、お金は物理的束縛から開放され、形而下のものから形而上のものへと昇華するのである。。。

2017年3月6日月曜日

お金の持つ欠点

ブログの更新サボっててすみませんでした。

前回に引き続き今回もお金の話です。予告通りお金の持つ欠点を考えてみたいと思っています。前回の投稿の内容を前提に書くので、まだ読んでいない方がいればぜひ読んでください。

金利


本題に入る前に質問です。金利というシステムはなぜ成り立つのでしょうか?つまり、なぜお金を預けているだけなのに金利がつくのでしょうか。

様々な答えが考えられますが、私の答えは「お金でお金を生む機械を買えるから」です。(この答えは、言葉通りの意味以外にも人を雇うことなど広い意味を含んでいます。)たとえば100円の原材料で200円の製品を作り出す機械を考えてもらうのが一番わかり易いと思います。つまり、お金があればさらにお金を増やせる機会を得ることができるので、金利を払ってでもお金を借りたいと思う人が一定数いて、金利制度が成り立つわけです。

ここまでくると、察しの良い読者の方には私の考える「お金の持つ欠点」が
なにか分かり始めてきたでしょう。そうです、「お金の持つ欠点」は、貧富の差が勝手に拡大する点です。

しかし、前回の投稿をしっかり理解している読者さんの中には論理の穴に気づかれた方もいるかもしれません。気づけなかった人は価値関数について一緒に復習しましょう。

価値関数というものは額面と時間を引数とする関数で、そのお金の持つ本当の価値をもとめる関数$f(x,t)$でした。前回の投稿での議論から、同じ額面をもつ紙幣でも、時間が経つにつれて価値が指数関数的に減少することをしめしました。

ここまでくれば多くの方が論理の穴に気づかれたことでしょう。つまり、金利分による額面増加分は価値関数ですでに考慮されており相殺されるのではないか、ということです。

この指摘に反論するために重要となるキーワードは「シャープレシオ」です。

シャープレシオ


シャープレシオは次の式で表されます。
$$\frac{\text{期待リターン}-\text{リスク無しリターン}}{\text{リスク}}$$
つまりシャープレシオは「1リスクに相当するリターン」です。ファイナンス理論を学んだことのない人からするとリターンが大きければ大きいほどよいと考えてしまいがちですが、実際の投資家はリターンよりこのシャープレシオを基準に投資先を決めます。

シャープレシオが重要視されるのは、リスク回避的な投資家が多いからです。銀行がわかりやすい例です。銀行は口座に預けられたお金を運用して利益をあげていますが、口座内のお金を減らすわけにはいきません。なので、高リターンの投資案件でも、元本割れのリスクが高いものには手を付けないのです。

お金の持つ欠点:貧富の差が拡大すること


シャープレシオの話の裏を返せば、リスクを取れば取るほどより良いリターンを期待できます。なので大富豪のように自由に使えるお金が多ければ多いほど有利であり、金利分の価値減少分を考慮してもなお、指数関数的に価値は増加していくのです。一方、生活費だけで精一杯のひとは、リスクの高い投資をすることができないので価値は増えていきません。こうして貧富の差は拡大していくのです。

まとめ

リスクをとれる大富豪は資産が勝手に増えてゆく一方、リスクを取れない人は資産を増やすことができない。ゆえに貧富の差は拡大していく。

もちろん税金などを活用することで貧富の差を縮小させる試みは行われていますが、お金の持つ欠点の抜本的な解決策とは言えません。次回はこの問題を通貨システムそのものを変えることで解決することを試みます。

2017年2月10日金曜日

お金の線形性・指数性

今日はお金そのものについて考察していきます。

そもそもなぜお金が必要なのでしょうか。
その大きな理由の一つは物の流動性を高めるためです。

たとえばりんごをペンと交換したい人がいるとします。
お金というものがなければ、ペンをりんごと交換する人を探さなければいけませんが、そう都合よくそのような人が見つかるわけではありません。
しかし、現代のようなお金の流通している社会では、お金を介することでそのような人を探さなくても売買できます。

また、貯蓄可能だということもお金が必要な理由の一つでしょう。りんごは長時間放置していれば腐って価値がなくなってしまいますが、お金に変えればそのような心配はありません。

このように、お金の良い所は簡単に挙げられます。では逆に悪いところはあるのでしょうか?
今回はこのことを議論する前に、お金の2つの性質「線形性・指数性」について理解しておきましょう。

お金の線形性・指数性

結論から言いますと、お金は、同時刻では額面に対して線形性を、同額面では時間に対して指数性を持ちます。
順番に考えてみましょう。

たとえばお店で500円の物を買った場合を考えます。このときあなたは500円玉を出す必要はもちろんありません。1000円札でも10000円札でも支払うことができます。
もしも500円よりも高い額面の紙幣で支払った場合はお釣りをもらいます。当たり前ですが、このときお釣りとして受け取る金額は単純に支払った金額から商品の価格を引いたものになります。

つまり、差が等しければ価値は等しいのです。これはお金が線形性を持っていることを表しています。

つぎに、2017年から2018年まで利率0.1%で1000万円人にお金を貸すときのことを考えます。お金を借りる人は2018年に、2017年に借りた金額に加え、0.1%の利子をつけ返済しなければなりません。この場合は1000万円で借り1001万円で返すことになります。

よって、2017年の1000万円と2018年の1001万円が同じ価値を持つと考えることができます。利子が借りる量に比例することを考慮すると、お金の価値は時間に対して、線形的ではなく、指数関数的に増えていきます。

価値関数 $f(x,t)$

数学的に議論できるようにするため、価値関数$f(x,t)$を導入します。$x$は額面、$t$は時刻を表します。
たとえば、$f(100\text{円},2017\text{年})$は2017年時点での100円のもつ価値を表します。じつは上で説明した2つの性質から$f(x,t)$は以下のようにもとまります。
$$f(x,t)=ax\,e^{bt}$$
この式がちゃんと2つの性質を満たしているかどうか確認してみましょう。

同時刻のとき、額面の変化による価値の変化は
$$\frac{\partial f(x,t)}{\partial x}=ae^{bt}=Const.$$
となります。よって価値が額面に比例していることがわかります。

同額面のとき、時刻$t$、$t+\delta t$での価値の比は
$$\frac{f(x,t+\delta t)}{f(x,t)}=e^{b\,\delta t}=Const.$$
となります。よって指数性も満たされています。

まとめ

  • お金の価値は、額面に対しては線形的、時間に対しては指数関数的に増える。
  • 具体的に$f(x,t)=axe^{bt}$とかける。
次回はこの価値関数をベースに、お金の持つ欠点について考えてみたいと思っています。

2017年2月3日金曜日

[FX] 最小二乗法でトレンドを把握する

こんばんは。
今回も前回に引き続きFX関連です。

数理モデル

現在時刻を$t=0$として、株価が
$$f_{\epsilon}(t)=a_0+a_1t+a_2t^2+\epsilon$$
と表されると仮定します。$\epsilon$はノイズです。

ノイズ項を無視すれば、$a_1$と$a_2$はそれぞれ(定数倍を除き)$f'(0)$と$f''(0)$に対応していることがわかります。つまり$a_1$は現在のトレンド、$a_2$はトレンドの変化を表しています。


重み付き最小二乗法

最小二乗法とは一般的に
$$y_i=f(t_i)+\epsilon_i$$
となるときに
$$\sum_i {\epsilon_i}^2$$
で表される自乗誤差が最小にするようなパラメータを求めます。今回は時系列データでなるべく最新のデータが重要視されるようにしたいので、この最小二乗法をすこしいじり、
$$\delta=\sum_{i=-\infty}^0 c_i{\epsilon_i}^2$$
で表される重み付き自乗誤差を代わりに使います。$c_i$は$c_i<c_{i+1}$が成り立つ適当な配列を用意します。

以下表記の簡略化のため、総和$\sum_{i=-\infty}^0x_i$を単に$x_i$と表記することにします。

$$\delta_i=c_i(y_i-(a_0+a_1t_i+a_2{t_i}^2))^2$$
となるため、
$$\frac{\partial \delta_i}{\partial a_0}=0 \iff c_iy_i=c_i(a_0+a_1t_i+a_2{t_i}^2)$$
$$\frac{\partial \delta_i}{\partial a_1}=0 \iff c_iy_i=c_i(a_0t_i+a_1{t_i}^2+a_2{t_i}^3)$$
$$\frac{\partial \delta_i}{\partial a_2}=0 \iff c_iy_i=c_i(a_0{t_i}^2+a_1{t_i}^3+a_2{t_i}^4)$$
となります。総和の記号が省略されているので$c_i$で約分することはできないことに注意してください。

これを行列表示すると
$$c_i\begin{pmatrix}y_i\\t_iy_i\\{t_i}^2y_i\end{pmatrix}=c_i\begin{pmatrix}1_i&t_i&{t_i}^2\\t_i&{t_i}^2&{t_i}^3\\{t_i}^2&{t_i}^3&{t_i}^4\end{pmatrix}\begin{pmatrix}a_0\\a_1\\a_2\end{pmatrix}$$

よって逆行列をかければパラメータが求まります。

ぼやき

機械学習でトレーディングするとき、データとしてナマの株価を与えるのではなく、代わりに複数の$\beta$にたいする$a_1$、$a_2$を与えて学習させたほうがうまくいきそう。。。