N氏からの興味深いメール
まじんクラブのメンバN氏からメールをいただいた。大変興味深い内容だったので、勝手ながら、一部公開させていただく。
【N氏からのメール】
> まじん様、日々ブログをチェックさせていただいたおります。
>
> まじん様の体調は大丈夫でしょうか?
> 私はレンジ相場のように安定しております。
>
> ポナンザを作った人たちがどこぞの証券会社とタッグを組んで
> AIトレーディングの開発を進めているみたいですが、
> なかなか攻略法が見つからないみたいですね。
>
> チャートパターンの認識はアルパカがやっていますが、
> これも今一つ決めてにかけますね。
>
> 私も日々、どこがボーリングでいうセンターピンなのか…模索しております。
>
> コンピューターの特性は完全無欠の記憶力と、電光石火の計算力なので、
> この二つがカギになると思うのですが、この思い込みが迷宮の罠なのか…。
>
> 出口を見つけた時のワクワクがたまらないです!
> 何か思いつきましたらご報告させていただきます!
>
> ブログでのまじん様の報告、楽しみにしております!
【まじんからN氏への返信】
Nさま、興味深いご報告をありがとうございます。
十分な経験と知識を持つ人たちでも未だ無理のようですね。ディープアリスが、
彼らの先を越すとも考えにくいのですが、不思議なものですね。結局、何か新し
い発見が必要なのでしょう。その昔ガロアが、数学界でやったような奇跡が現代
に起こるとでもいうのでしょううか(笑)
まじん、ディープアリス代表。
数学者が大きな仕事をするのはガロアの例で分かるように20代なのだそうな。ぼくもN氏も若くない。ぼくは、古くてポンコツになってもポルシェはポルシェであるとうそぶいていたが、これは自分自身に対するはったりのようなものだろう。そんなことはどうでもいいが、早く彼らと同じ土俵に上がりたいと焦りを感じたよ。
明日からは早速、心を入れ替えて、まずは基礎的な勉強に集中したい。といいながら、ガロア理論の本を読んでいる(笑)急がば回れ(アホ)
ジグザグハンター(ZZH)
ジグザグ(ZZ)というのは、ぼくがFX初心者のころ、一番最初に興味を持ったインジケーター(IND)だ。ぼくはロウソクチャートの見方も何も何もぜんぜん知らなかった。でも、突然、勘だけを頼りにポンド円の取引を始めたんだ。なぜポンド円だったのか。値動きが大きいから。で、1日、1万円くらいを稼いだ。そのときの感の元はZZだったというわけ。
値がジグザグに動くというのは面白い性質に思えた。これをもっと研究したら何か発見できるかも知れないね。いづれ、機械学習もさせてみたいと思っている。何度かジグザグが成功(目標の80%以上とかね)すれば、ある程度大きなジグザグが次に実現するとか、性質が解明できるんじゃないかとか想像する。
とにかくジグザグは面白いし、きっと美しい特徴量が見つかるはずだ。
トレンドハンターとジグザグハンター
既に他の記事で書いてきたことだけど、FX市場の基本原理に係わること。トレンドの発生時期と消滅時期が正確に把握できれば、FXの方程式が解けたといってよいだろう。ジグザグについても同様だと思う。このごろは、この2つについて考えている。
ところで、ときどき Zigzag No Repaint(ZNR)というインジケーターがほしいというコメントやメールを見ず知らずの方からいただく。このようなことに関するぼくの考え方を詳しく書こうかと思ったけど、やめておく。まぁ、想像してほしい。それにしても、ZNRが、それほどFXで稼ぐ役に立つとは思えないのだけどね。
トレンドハンターとジグザグハンター(TRH&ZZH)はインジケーターとして実現したいと考えているが、その候補と言えるようなもの(インジケーター)が、昔から存在する。知ってますか?
TRH&ZZHについては今後また書きたいと思う。
スサノオ
スサノオって?スサノオノミコトさ。また神さまの名前だね( 機械学機能を備えたFXのAIロボットのことをアマテラスって聞いたぞ)。で、また、サスケの技だよね。そう、アマテラスの別バージョンさ。どう違うのか、書いているぼくも分からない。名前からすると、アマテラスよりも攻撃的なプログラムか?だから、知らん。
ぼくの作るプログラムは、まず、名前から決まるんだ。まっ、これはぼくのクセなんだ。つまりいま言えることは、アマテラスとは、別バージョンということだけ。
過去ぼくは、ロボットをたくさん作った。その名前は、ポセイドン、ロプロス、ロデムなんかがあった。そうだよ。バビル2世さ。いつまでも子供っぽいぼくなのさ。こんなことを書いているぼくだけど、機械学習に関しては、まだ勉強中の身なんだ。呆れる。
ところで、まじん倶楽部(掲示板)なんだけど、結局、2名の真面目な方からお申し込みをいただいた。もうないだろうし、この機会に募集を終了にする。失敗企画だね。いつか将来、あのとき申し込んでおけば良かったという後悔はあるかもね。2名の方には申し訳ありませんが、本格的に待っていただこうと腹を決めた。
さて、機械学習だけど、ぼくが高校生のころ、微積分に出会って、そのときの感動以来の感動を感じたんだ。ぼくの知的活動に激震を与えるものだ。しかも、日本における人口知能市場は90兆円を越えるそうだ。ディープアリスの仕事も独自開発(アマテラス、スサノオ、その他)以外にも忙しくなるかも知れないぞ。
ぼくの挑戦
ぼくは知的な挑戦が好きだ。5年位前だったろうか。Haskellの独学に挑戦した。そして、一応。自分のものにしたと言ってよいと思う。で、いまは機械学習の鉱脈探しに挑戦しようとしている。機械学習そのものじゃない。機械学習の理解は普通にできるはずと思っている。現在の機械学習には不備があって、学術的ブレークスルーが必要。それこそが鉱脈であって、その発見と突破こそが挑戦。それをディープアリスの名のもとで行う・それが挑戦なんだ。その挑戦はアマテラスの開発を通じてなされるはず。というのが、とても都合のよい、ぼくのシナリオ。
一方、いまぼくは、非可換幾何学に興味を持っている。これを理解したい。機械学習の鉱脈はどうしたって?ぼくは気が多いのだ(笑)。ところで中学生のころ、微分幾何学を理解したいと金華山にある大きな図書館に通った。そんなぼくなのに驚くことになんと中学一年になっても九九ができなかった。それで、微分幾何学か。ちょっと無理があったようだね。それにそんななか、気の多いぼくは、エリーカルタンの微分形式というものに目移りしてしまった。ご想像通り、結局共倒れになった。
後年のこと、特殊相対論自身が前提とする、光がガリレオの相対性原理に従うということが信じられなくてね。だって、光源から垂直に発せられた光が光源の進行方向とのベクトル合成になるなんて。ね、ぼくには到底思えないんだ。当然、明治時代に相対論の論文を書いたアインシュタインは、スターウォーズを知らない(笑)。
アマテラス
まじん倶楽部の募集をしてから、何日経ったろうか。いい加減な企画過ぎたか。これまでに1名だけ申し込みをいただいた。その方は、FXで食べていけるレベルだそうだ。恐れ入った御仁なのである。で、慌てて掲示板を作らなきゃという次第。どこまでもいい加減なまじん君だ。
で、結局、まじん倶楽部の面々(集まるんだろうか)に何を教えることが出来るだろうか。ぼくには、大風呂敷のアマテラスがあるじゃないか。アマテラスとは、機械学習能力を備えたFX-AIロボット(EA)なのだ。一体そんなものが可能なのだろうか。実は今のぼくニはわかっていない。きっと、新たな学術的ブレークスルーも必要になることだろう。つまり、生半可じゃ無理なんだ。
機械学習そのものを深く研究しなければならない。ぼくはその主体をディープアリス(DA社と呼んでおこう)と名付けた。まだ法人にはなっていない。DA社の中心はもちろんぼくだ。あと、ぼくの二男が、大学院でAIとくにディープラーニングを学んだ。ぼくとしては少し期待しているが、まぁ、無理だろう。自分でなんとかするほかはないだろうよ。
というわけで、遙か遠くを見ているぼくなんだ。気長に応援してほしい。
まじん倶楽部
た示板(パスワード付き) を利用した会員制倶楽部(性別年齢不問)を開催したいと思っている。会費などは無用。つまり無料だ、
一体何をするのか。これから FXを始めたい人がいれば、ぼくが手ほどきをしようと思う。また、FXのほかにも、、将棋 、チェス、プログラミングを始めたいという人も応援できると思う。
まじん倶楽部はコミュニケーションの場にもなればうれしい。つまり、思い付いたことを自由に書き込んだりしてもいい。自由なんだ。ぼくも思い付いたことを何でも書き込もうと思う。
参加してみようと思う人がいたら、「grailrobot@yahoo.co.jp」まで。本名、ニックネーム(掲示板で使用す津仮の名前)を書いて送ってほしい。折り返し、掲示板のパスワードをお知らせします。
フェニックス
きょうはフェニックス(Phoenix)について書こう。
フェニックとは、狭義にはぼくが作るFXロボットの一つであり、広義にはフェニックに至るいくつかのインジケーターをも指す。
ところで、フェニックスとは不死鳥という意味だけど、病院送りでもうダメかと思われたぼくが蘇って FXで儲けようというのだから、そりゃフェニックスだろうよ、というわけだ。
実は、ぼくには持ち株がある。その株を売った資金の一部を FXの運用資金にする計画なんだ。それが実現した時点で、フェニックス計画が始動する。それまでの期間が、ディープアリスを研究する期間となる。そして、ディープアリスの成果物として、アマテラス(機械学習FXロボット)を目指すという訳なんだ。これが完成すれば大変なことのなるだろう。その代わりと言っちゃ何だが、実現の可能性は低いだろう。しかし、フェニックスは確実に実現するだろう。ベースとするインジケーターの候補は既にあるのだ。一つは、「レインボーシグナル」と名付けたもので、既に存在する。あとは実戦で検証するばかりだ。もう一つある。「タカナシサラ」と実在するオリンピック選手の名前を借用して名付けた。これは商用のインジケーターで数万円はする代物なんだ。だから、まぁ、買うだけで、レディというわけ。
以上、お分かりのようにフェニックスは現実的なプラン。アマテラスは夢のプラン。あなたはどちらに興味が湧くだろうか。
ディープ アリス
ディープアリスってなんだ。まぁ英語で言うとこんな感じ。綴りは合ってたか?ディープ(Powerd By DEEP Lerning)アリス(Artificial Lovely Interigence)つまり、アリスは人口知能のこと。ディープはディープラーニングのこと。だから第2のDeep Mind社だと言いたいわけだね。ふーん、二匹目のドジョウって訳か。そうじゃない、いや、そうだ。ディープマインド社というのは人間の囲碁チャンピオンを打ち負かしたアルファ碁を開発した社員3人ほどの会社である。巨大頭脳集団グーグルですら作ることが出来なかったディープラーニングによる人口知能プログラムアルファ碁を開発したのだ。いまやディープマインド社は、グーグルに買収され、グーグルの一部となっている。
そもそも人口知能というのは長い間とても食えたもんじゃなかった。それを果敢に食って見せ、光り輝く美味の部位(ディ^プラーニング)を見い出して商売にしたのがディープマインド社だと言えるだろう。(厳密にはちと違う)
で、結局ディープアリスって何なんだ? うーん、鈍いなぁ。ここまで話せば、ディープアリスがだね、石原さとみが不思議の国のアリスのコスプレをしてだなぁ。そのかわい子ちゃんがディープラーニングの機構を備えている姿を想像してくれたまえ。そう、それこそがディープアリスなのだ。誰でもわかるだろう。わからんよ。
うん、実はそうじゃない。ディープアリスというのは、ディープラーニング周辺に眠る鉱脈を見つけ出し磨こうとしている存在なのだ。それが可能ならね。まぁ、くどくどとややこしい例えを話すのはこの辺りでやめることにしよう。
ディープアリスの成果が見られるとしたらアマテラス(人口知能FXロボットあるいはサスケの必殺技)の開発を通してとなるはず。アマテラスのなかにディープラーニングの新技術(新鉱脈を磨いたもの)が導入出来るかどうか。今の時点では限りなく夢物語だ。
鉱脈が見つかりそうになったら、ここに書くよ。
年金ロボット 2019年
ちょっと訳あって病院に長いこと入院していたのだ。で、現在なんと名古屋に住んでいるのだ。まるで新しい人生が始まったみたい。そんなわけでこれを機に新しいプロジェクトを開始したいと思っている。それはざっと以下のようなものだ。
① 人工知能研究
従来来取り組んでいたFX以外のことはすべて投げ出して人工知能の研究に取り組もうとしている。日本国内の人工知能市場は90兆円を越えると言われている。そのおこぼれに預かろうということか。
②フェニックス
オーソドックスなロボット。そしてシンプルなプログラム。確実に作ることが出来るが、面白味がイマイチだろうか。しかし、従来考えていた年金ロボットよりもアグレッシブルなものになるかも知れない。
③ アマテラス
人工知能研究の成果物としてのFXロボット。学習機能を内蔵するAIロボットということだが、実現の可能性に関する自信はない。まぁ、寝言の類いと思ってもらっても良い。
このブログも少しずつ再開したいと思っているのでよろしく。
プログラミング言語ごとの多倍長整数の取り扱い Scala 編
現在、ぼくは Haskell のどっぷりハマっている。でも、ちょっと前は Scala に取り組んでいた。なにを隠そう Scala に取り組んだおかげで、Haskell の価値に気付くことができたという次第なのだ。
さてこんかいは以前に書いた「プログラミング言語ごとの多倍長整数の取り扱い」という記事に Scala を追加したい。
Scala の多倍長整数演算については Project Euler Problem 20 を例にとって、紹介したいと思う。 Scala 使いにとっては当たり前の事項かもしれないが、ぼくはわからなかったので試行錯誤したのだ。
------------------------------------------
Problem 20 「各位の数字の和 2」
------------------------------------------
n × (n - 1) × ... × 3 × 2 × 1 を n! と表す.
例えば, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 となる.
この数の各桁の合計は 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 である.
では, 100! の各位の数字の和を求めよ.
■ 解答 in Scala
//-----------------------------------------------------------------
def fact(n: Int): BigInt = if (n < 2) 1 else n * fact(n - 1)
print(fact(100).toString.split("").map(_.toInt).sum)
//-----------------------------------------------------------------
上の2行が Scala による Problem 20 の解答になっていると思うが、本来は以下のようにできるはずと思っていた。
■ 本来の正解
print((1 to 100).reduce(_*_).toString.split("").map(_.toInt).sum)
↑これで、できると思ったけど、ダメだった。(1 to 10) ならうまく行くけど、(1 to 100) だとオーバーフローしちゃうんだよね。最初の解答のように BigInt を使えばいいと思うけど「本来の正解」でなんとかしたい。だけど、どうしたらいいのかまだわからない。
..ということだった。
■ Scala REPL で
scala> (BigInt(1) to 100).product.toString.split("").map(_.toInt).sum
res1: Int = 648
それが、上のようにすればできることがわかったのだ。どこで知ったのかって? いろいろやってみたらできた(笑)。
■ コンパイル用ソースコード
object PE20 extends APP {
print((BigInt(1) to 100).product.toString.split("").map(_.toInt).sum)
}
■ ついでに 1000の階乗
scala> (BigInt(1) to 1000).product
res0: BigInt = 4023872600770937735437024339230039857193748642107146325
43799910429938512398629020592044208486969404800479988610197196058631
66687299480855890132382966994459099742450408707375991882362772718873
25197795059509952761208749754624970436014182780946464962910563938874
37886487337119181045825783647849977012476632889835955735432513185323
95846307555740911426241747434934755342864657661166779739666882029120
73791438537195882498081268678383745597317461360853795345242215865932
01928090878297308431392844403281231558611036976801357304216168747609
67587134831202547858932076716913244842623613141250878020800026168315
10273418279777047846358681701643650241536913982812648102130927612448
96359928705114964975419909342221566832572080821333186116811553615836
54698404670897560290095053761647584772842188967...
まぁ、わかってしまえば簡単ということだった。
(1.toBigInt to 100).product などは試していたのだけどね。これが分かるまでちょっと時間がかかってしまった。同じように悩んでいる人のためにと思ったのだけど、まっ、そんな人はいないか。
ヒット&ブロー in Python
Python 仲間の sin さんが、プログラムを作ったので、許可を得て公開することにした。小さなプログラムだけど、ゲームの桁数を選べるようになっている。この拡張はぼくが行った。人のふんどしで相撲を取るとはこういうことかな。
遊び方は、ヒット&ブローがどういうものか知っていれば、プログラムを実行すればメッセージを出しているのでわかると思う。暇な人がいたら、遊んでみてください。
# ------------------------------------------------------
# ヒット&ブロー プログラム(hitblow.py)
# オリジナル : sin
# アレンジ : mazin
# ------------------------------------------------------
def makeanswer(length):
# 異なる(length)桁の数字を作る / 返値は(length)桁の数字配列
import random
answer = []
while len(answer) < length:
m = str(random.randint(0,9))
if m not in answer: answer.append(m)
return answer
def checknum(n, length):
# 入力された数字のチェック / n は数字文字列
n = list(n)
if len(n) != length: return "error length"
if max([n.count(i) for i in n]) > 1: return "error overlap"
return True
def jugement(n, answer, length):
# 入力された数字の判定 / n は入力数字文字列、answer は正解数字配列
n = list(n)
hit = 0
blow = 0
for x in range(length):
if n[x] == answer[x]: hit += 1
elif n[x] in answer: blow += 1
return [hit, blow]
# ヒット&ブロー メインプログラム
if __name__ == "__main__":
trial = 1
while True:
try: length = int(input("何桁の数字で遊びますか: "))
except: print("エラー:不正な入力です"); continue
if length >= 1 and length <=10: break
print("エラー:桁数は1桁以上10桁以下です")
continue
answer = makeanswer(length)
while True:
n = str(input(str(length) + "桁の数字を入力してください " + str(trial) + "回目: "))
if checknum(n, length) == "error length":
print("エラー:数字は" + str(length) + "桁です")
continue
if checknum(n, length) == "error overlap":
print("エラー:同じ数字は使えません")
continue
hit, blow = jugement(n, answer, length)
if hit == length:
print("大正解")
break
print(str(hit)+"ヒット" + " " + str(blow)+ "ブロー")
trial += 1
print("おめでとうございます! 入力回数は", trial, "回でした。")
# ------------------------------------------------------
(以上)
FUNP - 関数型プログラミング
また、少しご無沙汰してしまった。
そんなぼくが投稿する気になったのは、渡辺真さんからのコメントをいただいたからだ。実にありがたい。渡辺さんのように一つの言語(FreeBasic)に拘る姿勢には敬意を持ちます。
ぼくの場合は、気が多すぎるのと、自分にとっての理想の言語探しの最中に迷子になってしまっていたようなのだ。そして、迷子のまま歳を取ってしまったという感じ。そんなぼくが漸くにして、迷いから目覚めたように思うのだ。
それがなにかといえば、FUNP(ファンプ)なんだ。OOP とはよく言われるが、FUNP とは言われないようだけど、これ「関数型プログラミング」あるいは「関数型プログラミング言語」のこと。どちらかは文脈で判断する。
FUNP といっても色々あるが、まぁ、とりあえず Haskell かな。1~2年前に Haskell は学んだんだ。もちろん独学。そのとき、理解できたと思った。しかし、ぼくが想定するアプリケーションは入出力が多い。Haskell は不向きだと思った。しかし、それは理解不足に過ぎなかった。
また、Python などに馴染みの深いぼくは、Haskell の「型」への拘りが面倒で不自由なものに感じたんだ。カタカタカタカタとうるせぇよぉってな具合だ。結局、第1次の学習時点では、自分の身の丈に合った言語ではないと判断した。
その後、もっと自由な FUNP を求めて、Lisp と Scala を学んだ。そのことで漸く Haskell の価値に気付いたという次第。長い道のりであった。
そしていま、第2次 Haskell 学習がスタートした。もうなんとなく忘れかけていたので、復習からだ。Haskell の第2次が一段落したら、Elm(ウェブ世界の Haskell)と Agda(アグダ)を調べてみようと思っている。いずれにせよ FUNP なのだ。
それと、Haskell が簡潔な言語だということには誰もが賛同してくれると思うが、実は「簡単な言語」でもあるのではないかと近頃では思うようになった。どの書籍も細かなことと過剰な例題が、難しくしているだけなのではないかということ。
もっと大筋と利用する場合の全体像を明瞭に示せるのではないかと思い始めたのだ。勘違いである可能性もあるかな(笑)。それで、自分の学習が終わったら、つぎはそれ(簡単!FUNPってこと)に挑戦しようかと思いつつあるところなのだ。
で、簡単!FUNP のターゲットは、そりゃ、Haskell でしょってことになるけど、まずは Pythonを考えている。これは、Python を完全に FUNP として使ったらどうかというもの。ちょっと調べた感じでは、先行き暗いね(笑)。
というわけで、渡辺さんには、FreeBasic の情報をいただいてうれしいぼくなのだけど、いまは FUNP に夢中ってわけ。簡単!FUNP の成果はいつか何処かで発表したいと思っているけど、いまのところ先は見えていない。
※ こういう技術情報でも何でもないことを書いて、誰がうれしいのかってご批判もあろうけど、自分のために書いているってことで、たまたま見た方はご容赦ください。
FreeBASIC の日本語標準入力問題について
ちょっと前「I love FreeBASIC」という記事を書いた。誰が無理だってぇ。
そこで、FreeBASIC は魅力的な処理系だけど、標準入力からの日本語入力に問題があるという話をした。
そして、その問題に対処する裏技を発見したとも書いた。で、その対処法を書かなかった。誰か突っ込んでくれないかなぁという想いからである。寂しいのである(笑)。
その記事に対し、FreeBASIC の大先生と思しき方から、きみのうんちくを訊いてやろうとお声が掛かった。ぼくはうれしくなって、早速ここに書いている次第なのだ。
と、中身のない話で出だしは十分。で、なんだっけ。
''----------------------------------------------------
Dim s As String
Input "なにかキー入力して下さい: ", s
Print "あなたがキー入力した内容: "; s
Sleep
''----------------------------------------------------
そうそう、FreeBASIC は↑これができない。この s に日本語が入れられない。で、大した方法でもないしけど、ある方法で、うまく行ったのだ。それが↓これ。
''-----------------------------------------
Dim s As String
Open Cons For Input As #1
Print "なにかキー入力して下さい: ";
Input #1, s
Print "あなたがキー入力した内容: "; s
Close
Sleep
''-----------------------------------------
入力装置をオープンして、それに標準入力を割り当てるということ。だだそれだけ。
ひょっとしたらと思ってやってみたら、まぁまぁうまくいったということ。
上のプログラムを実行した結果は以下の通り。
C:\_bas>fbc constes.bas
C:\_bas>constes
なにかキー入力して下さい: こんにちは
あなたがキー入力した内容: こんにちは
C:\_bas>constes
なにかキー入力して下さい: ―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿
あなたがキー入力した内容: ―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿
C:\_bas>
と、こんな感じで、ちゃんとできてる。
この方法でも完璧というわけじゃないけど、まぁ、動いているね。それでよしっ。
ってことで。
きょうから、FreeBASIC で日本語入力ができるぞっ!
Nim 0.15.0 リリース!
と、書けばめでたいようだけど、そうじゃない。
よろこんで、リリース日に早速インストールしたけど、文字化けの嵐だ。
0.15.0 では「Now when you compile console applications for Windows, console output encoding is automatically set to UTF-8.」と、こんなことをしでかしてくれたのだ。
Go や Free Pascal を見習えよ!と言いたい。まぁ、そこまでしてくれなくてもいいから、現状維持で頼むよ。というわけで、0.15.0 は、日本語 Windows じゃ、使えない。あっ、コンソールアプリのことね。仕方ないから 0.14.2 を使うようにしてほしい。
で、Nim のサポートに連絡をしておいたよ。
余計なことをしてくれたなぁ~ってね。
【追伸】
その後、Nim サポートから「Alright, I will see what I can do for you. 0.15.2 is around the corner, fixing installation hassles and regression.」という返信が来た。(変なの)
調子に乗ったぼくは、もし可能なら、Go や Free Pascal の仕事を調べてほしい、彼らの日本語に関する仕事は完ぺきだから、と頼んだ。まっ、無理なんだけどさ。だって、こう言うのが楽だったから。それに言ってやりたかった。
0.15.0 でがっかりしたみんなは、0.15.2 とやらを待とう!