自作DSL(Esgrsdnl)で株シストレ

株シストレ用の自作DSLの概要

自作シストレツールにて5年以上日本株のシストレを実施しています ↓本家ブログ↓

/*

http://cdn-ak.f.st-hatena.com/images/fotolife/s/sucar/20151115/20151115183011.png

*/

Esgrsdnl と名付けた自作DSLで戦略(ルール)を記述し、コンパイルすることでバックテスト及びシグナル出しが実行できるシステムが動いているので、その概要をこちらに纏めていこうと思います

興味のある方の役に立てば幸いです

株式市場(業者:システムに改名)ロジックとやらはインチキ(グラフ改ざん)

追記:株式市場かたシステムに改名しました

本家ブログで詐欺業者と戦ってますが、こっちにもリンク張ります

supercar.hatenablog.com

今は書き換えて証拠隠滅されています

google yahoo のキャッシュに残っていますが、それもいずれ消えるのでスクショ貼ってます

 

まずはDSLなしでゴリゴリ構築してみる

一つ前の記事

esgrsdnl.hatenablog.com

https://cdn-ak.f.st-hatena.com/images/fotolife/s/sucar/20191229/20191229072850.png

外部DSL部分を上部として抜き出しましたが・・・

ではその外部DSLなしで下部だけ抜き出すと・・・

ソース

digraph graphname {
	graph [rankdir = TB];

     subgraph cluster2 {
         label="Run";
         h [label="exe file" shape="Msquare"]
         j [label="結果 data"]
         h -> j ;
     }
     subgraph cluster3 {
         label="Run";
         e1 [label="awk src2" shape="box3d"]
         j0 [label="car_bet(awk)" shape="rectangle"]
         l [label="graph data"]
         l0 [label="car_bet(gnuplot)" shape="rectangle"]
         e1 -> j0 -> l ->l0
         {rank = same; e1;j0;}
     }

     f0 [label="C src"]
     f1 [label="template C src" shape="box3d"]
     g [label="car_mt(gcc)" shape="rectangle"]
     i [label="bet file"]
     g0 [label="株 data" shape="folder"]
     i [label="bet file"]
     l1 [label="baktest graph" shape="octagon"]
    
     f1 -> g;
	 f0 -> g;
     g -> h;
     j -> j0;
     i-> j0;
     g0 -> h;
     l0 -> l1;
     
                             
 }

f:id:sucar:20191229094906p:plain

下部抜き出し

 こうなるわけで・・・

普通にC言語で開発してコンパイルして実行するという・・・

しかし、シストレ戦略(ルール)がいくつもある中、システムの方もバグを直したり、機能を追加したり・・・

ちょっとやはりシストレ戦略(ルール)記述は別にやって、それをシステムに取り込むようにしないと運用管理が大変! となります

再び

logmi.jp

こちらのサイトから引用しますが・・・

素直に書くと記述が多い。でも、関数にまとめようと思ってもバリエーションがあってまとめられない。そういったときにDSLを使うのが一番ちょうどいい解決策なんじゃないかと思っています。

とあるように・・・

C言語で自作ライブラリのような感じで関数に纏めて・・・

ってこと考えたわけですが、シストレ戦略(ルール)の記述はいろいろ絡むので纏められないのです

そこでDSLの登場

いや、実際はDSLの概念は作ってから知ったので・・

あ、自分がやってるのって外部DSLだな!

と気づいた次第なんです

まあ、とにかく、シストレツール自作の一例として、どうやっているのか? の記事をこのブログに書いて行くので、何かの参考にでもなれば・・・

シストレが儲かるのかどうか? はその人次第だと思います

私の場合は本家ブログに成績ありますので・・・

読んでいただきたい本家ブログ記事リンク張ります

supercar.hatenablog.com

 

 

 

Esgrsdnl エスグルスドゥヌルはC言語へのトランスパイルDSL

一つ前の記事に

esgrsdnl.hatenablog.com

 Esgrsdnlはコンパイル型の外部DSLと書いた

ソース

digraph graphname {
	graph [rankdir = TB];
    subgraph cluster0 {
        label="Compile";
         b [label="car_m4(sed (here doc))" shape="rectangle"]
         c0 [label="m4 macro set" shape="box3d"]
         c [label="tmp.m4"]
         d [label="car_m4(m4)" shape="rectangle"]
         e [label="mtASM src"]
         b -> c -> d;
         c0 -> d -> e;
         {rank = same;c0;d;}
     }
    subgraph cluster1 {
         label="Assemble";
         e0 [label="awk src1" shape="box3d"]
         f [label="car_mt(awk)" shape="rectangle"]
         f0 [label="C src"]
         f1 [label="template C src" shape="box3d"]
         g [label="car_mt(gcc)" shape="rectangle"]
         i [label="bet file"]
         f1 -> g;
         e0 -> f;
         f ->i;
         f -> f0 -> g;
         {rank = same; e0;f;} 
     }

     a [label="Esgrsdnl src" shape="note"];
     h [label="exe file" shape="Msquare"]

     i [label="bet file"]

     a -> b;
     e -> f;
     g -> h;
 }

f:id:sucar:20191229072850p:plain

上部のみ(1)

処理の流れ図の上部のみを取り出してみると・・・

確かに

Compile ⇒ Assemble

と処理して exe file を生成している なので確かにコンパイル型の外部DSLである

しかし・・・・

システムの中に(gcc)があり・・・・

実際にバイナリ(exe file)を吐いているのはgccであります

なぁーんだ・・・

では、正しく自作の外部DSLの処理部分だけ抜き出してみると・・・

ソース

digraph graphname {
	graph [rankdir = TB];
    subgraph cluster0 {
        label="Compile";
         b [label="car_m4(sed (here doc))" shape="rectangle"]
         c0 [label="m4 macro set" shape="box3d"]
         c [label="tmp.m4"]
         d [label="car_m4(m4)" shape="rectangle"]
         e [label="mtASM src"]
         b -> c -> d;
         c0 -> d -> e;
         {rank = same;c0;d;}
     }
    subgraph cluster1 {
         label="Assemble";
         e0 [label="awk src1" shape="box3d"]
         f [label="car_mt(awk)" shape="rectangle"]

         e0 -> f;
         {rank = same; e0;f;} 
     }

     a [label="Esgrsdnl src" shape="note"];
    f0 [label="C src"]
     i [label="bet file"]

     a -> b;
     e -> f;
     f ->i;
     f -> f0;
 }
    
    

f:id:sucar:20191229074211p:plain

上部のみ(2)

こうなる

そうなるとCompileとかAssembleとか何なの? ってなるけど・・

まあ、そこはナンチャッテDSLなので・・・

しかし・・・

ufcpp.net

↑のサイトから引用しますが・・・

コード変換
で、コンパイラを作るよりは多少簡単に作れそうなのが、 図3に示すような、 DSL → 汎用言語へのコード変換です。

https://ufcpp.net/media/ufcpp2000/dsl/fig/mixed03.png


これが一番、かかる労力と得られる成果のバランスがいいと思います。

とありますし、汎用言語(ここではC言語)へのコード変換という手法は労力小さく成果は大きいということになります

DSLでなく汎用言語にもnimなんてトランスパイラがありますし、労力小さく言語自作するのにトランスパイル形式を採用するのはお勧めです

なぜなら、シストレ運用をやりやすくするのが一番の目的で、言語を自作するのは2番目の目的ですので・・・・

 

Esgrsdnlはコンパイル型の外部DSL

再度、この図をUP

https://cdn-ak.f.st-hatena.com/images/fotolife/s/sucar/20191121/20191121151712.png

戦略(ルール)を記述したソースファイルをコンパイルアセンブルすると実行可能なexeファイルが得られ、それに株データを食わせるとバックテストグラフが得られる

ということで

Esgrsdnlはコンパイル型の外部DSL

ということになります

なんだが凄そうですが、実はたいしたことありません

外部DSLググるとこんなサイトがありました

logmi.jp

外部DSLというのはなんでも欲しいものが手に入ります。ただ、これは最後の手段です。パーサを書かなければいけませんシンタックスハイライトありません。互換がありません。エラー出ません。なので、これは最後の手段です。

とか書いてあります

Rustも使ってないし、こんな難しいことは私にはよくわかりませんが、赤字の部分はなるほどそのとおりです

最後の手段にしろ何にしろ、とにかくシステムとトレードルールが完全に別記述になってるのはシストレ運用的には非常に助かります

シストレツール自作の人も何らかの方法でDSLにしてみるのはお勧めかと思います

 

シストレにおける戦略(ルール)記述はまさに特化ドメイン

DSLとはドメイン特化言語とかドメイン固有言語とか言われているもの

ja.wikipedia.org

なので、戦略(ルール)記述にDSLを自作しようとするのは当然の帰着

とは言いながら・・・

最近になって DSLという概念があることを知りました

Esgrsdnl エスグルスドゥヌルという自作DSL(笑) - SU/CAR-ST-APplication-cells

 とDSLという概念を知ったのは2018/11で、それ以前に独自言語とかの意識はあった

ただ、この2018/11時点ではまだ単なるm4によるマクロ言語というだけでしたので、DSLという概念を知って、より言語っぽくしたのは確か・・・

とはいえ、なんちゃって言語ですけど・・・

しかし改めて考えてみれば、シストレにおける戦略(ルール)記述はまさに特化ドメインといえそう

ドメインとは領域とかいう意味で、シストレの戦略(ルール)記述はまさにDSLとなる思う

実際、戦略(ルール)以外記述してもしょうがない

まあ、最低限「やあ世界」くらいできた方がいいかもしれないけど・・・w

Wikipediaから

DSLには次のような利点がある とのことで

  1. DSL は問題領域に適した抽象レベルと慣用句でソリューションを表現する。そのため、その領域の専門家が DSL で書かれたプログラムを理解でき、検証でき、修正でき、さらには開発できる。ただし、実際にそうなっている実例は少ない。
  2. コード自体がドキュメントの役割を果たす。

とある

1はなるほどである なので、このブログは実際にそうなってる例を示せたらと思って解説したのである(失敗するかもしれないw)

2はまさにそう思う 作ったDSLを熟知してれば、特にコメントやドキュメントは要らない ルールそのものを記述してるのだから・・・

ということでシストレツール自作するならDSLまで考えてみるものお勧めです

シストレにおける戦略(ルール)記述はまさに特化ドメインなので

 

 

 

おことわり・・・

今後、このブログで自作DSLによるシステムトレード、略してシストレ日本株です)のシステムについていろいろ書いていこうと思ってます

ただ、ここに書かれていることが、本当に正しいのか? 自信もって勧められるのか? は不明です

もっとよいシステムはあるでしょうし、自分も(スキル不足もあって)「ああすればよかった」とか「なんか無駄なことしてるよね」とか思うことは多々あります

ですが、一応、少しずつ改良しながら、5年以上育ててきたシステムで、実際に運用しているシステムでもあるので、それについてある程度詳しく書いてみるのは、誰かの役に立つかもしれません

なんか面白そうだな、自分も自作でシストレやってみようかな?

と思う人がいればうれしいです

勿論、実践は自己責任でお願いします

このブログに書かれていることはあくまで戯言にすぎません、と断っておきます

 

株のシストレツール自作にはpythonが最適・・・とはいうものの

株のシストレツール自作にはpythonが最適・・・とはいうものの

という記事を本家ブログに書きました

supercar.hatenablog.com

自作システムの基幹エンジン部分はC言語で書いてます

やはりコンパイル言語なので早いし、あとプリプロセッサメタプログラミングには便利に活用できます

今後、このブログで私の自作シストレツールはこんな感じになってます

という記事を書いていく予定です

ですが、結構グダグダかも・・・・

supercar.hatenablog.com

supercar.hatenablog.com

DSLという概念が存在することを知ったのが1年前で、このころはただのマクロ言語(m4を使用)だったのですが・・・

supercar.hatenablog.com

sedをうまく使って、マクロを卒業したような形になってます

まあ、もっとエレガントに設計できたようには思いますが・・・

現在これで動いているし、実際にトレードしてある程度利益は出せているのでこのままの形で行くつもりです

何かの参考になれば幸いです