Pyneは、市場データを扱うプログラムを作るためのシステムです。価格から求めた値を計算して表示したり、トレードのストラテジーのルールを記述したりできます。この本では、プログラムの作成から結果の確認までを実際に行います。

Pyne codeとは何か

プログラムはPyne codeで書きます。市場データの処理に合わせて設計された独自のプログラミング言語です。何を計算し、何を表示し、どのような条件で操作を行うかをコードで指定します。

例えば指標は、直近10本のローソク足の平均価格を計算し、価格チャート上に線として描画できます。価格チャート(英語ではchart)は、時間とともに価格がどう変わったかを表すものです。ストラテジーは、エントリーと決済のルールも定めます。例えば、ある条件を満たしたときに買いポジションを開く、といったルールです。過去のデータで実行すれば、指定した約定条件の下でどのような取引が生じたかを調べられます。これをバックテストと呼びます。

まずは簡単な指標を作ります。指標を通じてデータと言語を学んでから、取引ルールの記述に進みます。

Pyne codeはPythonの記述ルールを使います。このルールを構文と呼びます。括弧をどこに置くか、まとまりのある行をどう表すか、といった決まりです。先にPythonを学ぶ必要はありません。必要なルールは、本の例題で身につけていきます。

そのため、ファイルにはPythonで一般的な.pyという拡張子を付けます。PyneCoreをインストールすれば、Pyne codeをPythonの実行環境でも実行できます。実行環境を提供するのはPythonで、Pyne固有の動作と関数ライブラリを提供するのはPyneCoreです。

プログラムはデータをどう処理するか

例題では、市場データをローソク足の列として受け取ります。ローソク足は、ある期間の始値や終値などのデータをまとめたものです。日足データなら、1本が1日を表します。

PyneCoreはローソク足を順番にたどって、プログラムの計算を実行します。平均なら、その時点までに得られた価格を使って、各ローソク足で計算し直します。同時に、過去の計算結果や、次のローソク足まで保持するデータも管理します。

これは通常のPythonプログラムとは異なる動作です。ファイル冒頭の@pyneという印が、PyneCoreにそのような準備と実行を行うよう伝えます。コードを読む章で、正確な書き方と、本の例題で併記するedgeの意味を確認します。

ベクトル処理との違い

Pythonを使うトレード用フレームワークには、ローソク足を1本ずつ処理するものと、ベクトル処理を行うものがあります。ベクトル処理では、数値の列全体に対して演算します。例えば、すべてのローソク足の平均値と買いシグナルを一度に計算します。データは表や配列で扱うことが多くなります。

PyneCoreでは、現在のローソク足で行いたいことを記述します。システムはそれを実行し、次のローソク足へ進みます。計算履歴や保持すべき状態は、Pyne固有の言語ルールに従って管理します。

手順をシンプルな関数に書く

ローソク足単位で動作するフレームワークの中には、自分のストラテジー用のクラスを作るものがあります。クラスは関連するデータと操作をまとめる仕組みで、その中に定義された関数をメソッドと呼びます。その場合、フレームワークで決められたメソッドに設定や取引ルールを書き、クラスのデータを通じて価格やポジションを参照します。

Pyne codeの例題では、計算したいことと、どの条件で行動するかをmain()関数に書きます。各ローソク足を処理するたびに、関数の行を上から順に実行します。値を計算し、条件を確認して、シグナルを描画したり注文したりします。ローソク足を順にたどる処理はPyneCoreが担当します。

そのため、クラスの作成や継承を覚えたり、プログラムをフレームワークの複数のメソッドに分けたりせずに始められます。簡単な例題に必要なのは、変数、関数呼び出し、条件です。これらは続く章で学びます。

ルールを時間順に追える

この動作は、取引の判断を考える順序に近いものです。「今の価格と、ここまでの値動きを確認する。条件を満たしたらエントリーする。ポジションがある間は、決済条件を確認する」。コードでもこの順序で出来事を追えます。デバッガーを使えば、あるローソク足での変数も調べられます。

誤って未来のデータを使いにくい

ベクトル処理では、データ列全体を参照できる場合があります。そのため、ずらす方向や平均の取り方を間違えると、判断した時点ではまだ分からなかった価格が計算に混ざることがあります。例えば、1年全体の平均価格を1月の判断に使えば、後の月の価格も参照してしまいます。それでもプログラムは動き、もっともらしい結果を出すことがあるため、誤りの発見が難しくなります。これを先読みバイアス、英語ではlook-ahead biasと呼びます。

Pyneの時系列から参照できるのは、現在と、すでに処理したローソク足の値です。履歴の参照で次のローソク足の価格を取り出すことはできません。そのため、未来のデータを誤って使う可能性が減り、どの情報から判断したのかも確認しやすくなります。

ただし、データの前処理には注意が必要です。外部データに、後から判明した情報がすでに含まれている場合、ローソク足単位の実行だけでそれを見抜くことはできません。

速度にはトレードオフがある

ローソク足単位の実行は、プログラムによっては適切に書かれたベクトル計算より遅くなります。大きなデータで多数のストラテジーやパラメーターの組み合わせを試す場合には、特に影響します。ベクトル処理のシステムでは、最適化された計算ライブラリで大量の計算を高速化することがよくあります。実際の差は、プログラムとデータ量によって変わります。

この本では、ローソク足単位の動作を学びます。時間順にルールを書き、各判断に至るまでの情報を確認していきます。

他の方式を調べるには、VectorBTのベクトル処理やBacktraderのローソク足単位のストラテジーを参照してください(英語)。

PyneIDEとPyneCoreの役割

PyneIDEはVisual Studio Codeエディターの拡張機能です。プログラムを書き、データを選び、実行を開始します。結果をチャートで確認し、不具合を調べる場所でもあります。

PyneCoreは実行を担当するシステムです。プログラムを読み込んで準備し、ローソク足を処理して、計算や取引の結果を作ります。PyneIDEは内部でPyneCoreを使い、その結果を表示します。

次の章ではPyneIDEを設定し、最初のプロジェクトを作ります。サンプルデータを使うので、同じプログラムを再実行して、自分の変更による結果を比較できます。