インジケーター「sma符号」ができるまでの経緯
自作のインジケーター SMA符号
この記事では「sma符号」のできあがるまでの
論理の経緯を備忘録として書いています。
なんだか長ったらしいので記事としては、ボツにしようかと思ってましたが
やっぱり公開します。
まずは哲学的なところから
具材の準備~諸概念の導入~
1,符号の概念
もしも数というものが有限で、0から9までの10個しかなかったとします。
0 1 2 3 4 5 6 7 8 9
ある値 x はこの範囲0~9で推移をすることになります。
さてここで x-5 を考えます。
やっていることは単に5を引いただけですが
実は、思っている以上にすごいことが起きています。
もともとのxにはマイナスの値という概念がありません。
なぜなら数が0~9だけの世界でしたからです。
しかし5差し引かれると負の数が生まれて「符号」が登場しました。
x → 0 1 2 3 4 5 6 7 8 9
↓
x-5 → -5 -4 -3 -2 -1 0 1 2 3 4
x-5の世界においても、数字の数は変わらず10個あります。
でもよくみれば数字の記号の種類は0 1 2 3 4 5の6種類しか使っていませんよね。
そのうちの1 2 3 4の4個は、正の値と負の値を掛け持ちしています。
-5 -4 -3 -2 -1 0 +1 +2 +3 +4
その分6 7 8 9の4個は使わずに済んでいます。
これは符号を用いることで可能になっていることです。
符号と数字の種類との間で
保存則みたいな関係が見られるのです。
数字の役割を軽減すれば、その分、符号の負担が増えます。
2,「ハッシュ化的である」とは
コンピューターの世界では、ハッシュ化という変換があります。
詳しく知る必要はないので
ざっくり言えば、その変換ではどんなに長ったらしいデータでも、
一定の短い長さに変換してくれる特別な関数です。ビットコインの技術にも欠かせない関数でもあります。
ハッシュ関数で特徴的なのが、一度ハッシュ化してしまうと
もう元に戻すことができない点です。
ハッシュポテトからじゃがいもには、戻すのはほぼ不可能なのです。
対照的に先程のf(x)=x-5という変換については、復元ができます。
5引いたのだから逆に5足せばいいだけです。
ではそもそもなぜ復元可能な変換は、復元できるのでしょう。
言い方を変えるなら、どうしたら復元できなくなるでしょうか。気になるところです。
f(x)=x-5の変換後には、負の数発生ゆえに符号が必要でした。必要ということは、
それを奪ってみてはどうでしょう。復元できなくなりそうですよね。
そうです。例えば-3から「-」を奪うと3となり、+3も同様に3となり、どちらも3です。このようにかぶってしまい、「衝突」が発生してしまいます。衝突していてはどっちがどっちなのか不明なのでもう復元はできません。
実は、ハッシュ関数にもまさにこの「衝突」という現象が発生します。全く別の2つのデータそれぞれをハッシュ関数に通すとまれに結果がかぶるそうです。よく似ています。
符号の剥奪には、ハッシュ化の主要な機能である不可逆性という効果があります。
したがって復元ができない変換の様を、
「ハッシュ化的である」と僕は表現しています。
3,移動平均からの復元
代表的なインジケーターとして移動平均が最も有名で多用されます。
移動平均は平均値への変換の関数です。
この変換は、可逆的でしょうか
それとも不可逆的なハッシュ化的な変換でしょうか。
例えば平均が+3となるものは無限通りあって、
そのうちのどれかと断定できないので元のデータ再現はできなそうです。
したがって移動平均はハッシュ化的な処理に分類されます。
移動平均がハッシュ化的であるということは、
失われた符号が実は移動平均にはもともとあった、とも考えることができます。
その符号を捨てずに添えれば可逆型の移動平均になるはずです。
移動平均の符号がなんなのか気になるところです。
4,符号の拡張
ここで一旦次元の話になります。
次元の数は要はデータの数です。
常識的にたとえば、「10」は一つのデータですし
「-6」も「5.9」もそれぞれ一つの値です。つまりどれも一次元です。
でも実際には、それは嘘だったりします。
というのも「10」は十の位のデータと一の位のデータの2つから成り立つので
実は二次元なのです。我々はそれを無理やり一次元だと言い張っているに過ぎません。
同様に「5.9」も小数点を挟んだ左右の2つのデータで成り立つものであり二次元です。
下手したら小数点自体もデータと見なすなら三次元です。
あるいは左右それぞれ記載してないだけで無限に桁があるので無限次元ともみなせるのです。
ところで「-6」は 同様に考えて符号部分と数字部分の二次元データなのですが
符号に着目すると記号は+-の2種類のみでしかも桁は一つだけです。ずいぶんと限定的で遠慮していますが
符号の種類を数字みたいに増やして、かつ複数桁持たせるのはどうでしょう。
それこそが「符号の拡張」という考え方です。
イメージとしては例えば -#+◆23 みたいな数が存在するということです。
もはややりたい放題な感じですが、
実は移動平均の符号を表現するには従来の符号のあり方では、力不足なので
符号の拡張が必要になります。
5,符号付き移動平均①
たとえば1,2,3の平均値は2です。
平均2から元の1,2,3は復元できないので、わかるようにするには
一番大胆な方法としては
(1,2,3)2 と表記することです。一目瞭然ですね。
(1,2,3)の部分が2の符号ということになります。
これでも良いのですが、もっと工夫を加えたいです。
6,値の推移と変化量の推移
100 101 102という推移があったとします。
はじめの値100からの変化量は
+1 +2 ですね。
このように変化量で表現すると値が小さくなりやすい特徴があります。引き算ですからね。
もしも推移データを扱う必要がある場合、
変化量を代わりに利用して同じ結果が得られるなら、
数値が小さくなりやすいのでそっちのほうが良さそうですよね
よほど激しい値動きでもない限り。
ということでそれを利用します。
調理開始
7,符号付き移動平均②
a b c という推移を考えます。
初めの値aからの変化量は
b-a c-a と書けます。
それらを使ってa b c をこう書き直すこともできることを確認してみてください。
a b c
↓ ↓ ↓
a a+(b-a) a+(c-a)
つづいて太字部分を形状を残したままa b cの平均値の式を作ります。
平均={3a+(b-a)+(c-a)}/3 ですね。
式変形します
a={3*平均-(b-a)-(c-a)}/3 こうなります。
この式から言えることは、平均値からだけではaを求めるには、至らないですが、あとb-a,c-aの2値さえがわかれば求まるということです。
(aが求まれば、b,c も同時に決まる形です。)
したがって
変化量であるb-a,c-aは、移動平均の符号になれる器(資格がある)であることがわかります。
また、移動平均の期間を変えても同じく成り立ちます。
例として5足移動平均の場合も
推移 a b c d e
変化量 b-a c-a d-a e-a
平均={5a+(b-a)+(c-a)+(d-a)+(e-a)}/5
a={5*平均-(b-a)-(c-a)-(d-a)-(e-a)}/5
やはり変化量が平均値の足りない情報を補ってaを復元している形なので
変化量は符号として成り立ちます。
そして、符号付き移動平均は以下のように書くこととなります。
( b-a , c-a , d-a , e-a )平均値
復元可能な移動平均の完成です。
8,インジケーター化
いままで復元復元言ってきたのですが
したいのは復元ではなく
本当の狙いは、符号部分をインジケーターとして
使えないかどうかというところにあります。
というかインジケーターとして使うのです。
ということで
チャート上に表示させるためにpineで記述していきます。
9,Pineでの記述
終値ベースの5足移動平均の符号をpineの記法で考えます。
最新の5足のそれぞれの終値は、古い順で並べて書くとこうです。
close[4] close[3] close[2] close[1] close
close は終値という意味で、
close[n] はn個前の終値という意味です。
符号はこのように表現できます。
( close[3]-close[4] , close[2]-close[4] , close[1]-close[4] , close-close[4] )
あとはこれをコードにしてとりあえず一旦完成です。。
4個のplot()で表示してあげる必要があります。
記述例
//@version=4
study("sma符号")
plot(close-close[4],color=color.red)
plot(close[1]-close[4])
plot(close[2]-close[4])
plot(close[3]-close[4])
改めて見ると、ただの引き算なんですよね。
あんなごちゃごちゃやって、正直結局こんな単純な式になるとは
思っていませんでした。
具体的な使い方案は、また別の記事で。
このままでも十分に一つのインジケーターとして成り立ちますが
まだこれは、始祖インジに過ぎません。
これをもとにして色々と派生や、複雑な発展インジケーターが生み出せると思います。