見出し画像

【自動売買】【PHP】テクニカル分析 を独自実装してみる【スパンモデル】

今回は今までのテクニカルの実装で使用していたphp traderを使用せず、

テクニカルな指標(スパンモデル)の実装を行う方法について書いていきます。

php traderはCライブラリのため、処理速度が速く、MACDやボリンジャーバンド等の一般的な指標は関数で用意されていますが、

比較的新しい指標等は独自に実装していかなければならないため、

今回は元ディーラーの柾木利彦氏が考えた人気の指標「スパンモデル」を例として実装方法を記載していきます。

また、今回の記事と「【自動売買】【PHP】テクニカル分析 を簡単に実装する方法 【ボリンジャーバンド】」を組み合わせることで「スーパーボリンジャー」も実装が可能になるはずです。

今回の記事では最後におまけとして

実際にチャートやテクニカル分析した結果(配列)をCSV形式で表示する方法も載せておきます。

1 . スパンモデルの計算式

まず、スパンモデルの計算式を理解しておきましょう。

【スパンモデルの計算式】

転換線 : (過去9日間の高値+安値)÷2

基準線 : (過去26日間の高値+安値)÷2

スパンA : (転換線+基準線)÷2

スパンB : (過去52日間の高値+安値)÷2

上記の通りとなります。計算式はとても単純ですが、これを実際にロジックに落とし込むとなると悩む人は多いのではないでしょうか。

それではこの計算式を実際にスパンモデル関数として実装していきます。

2 . スパンモデル関数の実装

まず、スパンモデルの計算に必要な情報をパラメータとして、以下の通り関数を作成しましょう

function getSpanModel($high, $low){
}

呼び出す際に高値、安値の配列を渡すように作成しますが、これらの情報は過去のテクニカル実装記事にある

ロウソク足の情報を取得する処理(getChart)にて高値、安値も取得できます。

今回はgetChartをすでに実装していたとして、高値、安値の取得方法及び作成後のスパンモデル関数の呼び出し方のロジックを先に記載しておきます。

// チャートの取得処理
// [ 0:CloseTime, 1:OpenPrice, 2:HighPrice, 3:LowPrice, 4:ClosePrice, 5:Volume ]
$chart = getChart();
// 高値の配列の取得
$high  = array_column($chart, 2);
// 安値の配列の取得
$low   = array_column($chart, 3);
$ret = getSpanModel($high, $low);

チャートの取得ではロウソク足の日時、ロウソクのオープン時の価格、高値、安値、ロウソクのクローズ時の価格、取引ボリュームの順で

データが返却されてきます。そこから高値、安値を取り出す場合はarray_columnで取得したい情報の添字を値てやることで、

該当のデータのみを取得することができます。

続いてスパンモデル関数の中身を作成していきましょう。

getSpanModel関数の中に以下のコードを書きます。

    // 計算結果を入れる配列
    // 転換線:当日を含む(過去9日間の高値+安値)÷2
    $conv_line = array();
    // 基準線:当日を含む(過去26日間の高値+安値)÷2
    $base_line = array();
    // 先行スパンA:(転換線+基準線)÷2
    $precedence_lineA = array();
    // 先行スパンB:(過去52日間の高値+安値)÷2
    $precedence_lineB = array();
    // 計算に必要な情報を入れる配列
    $conv_tmp = array();
    $base_tmp = array();
    $precedence_tmp = array();

計算の結果を格納する配列と各計算に使用する情報を格納しておくための配列を作成しています。

次に実際に計算を行っていく処理を作成していきます。

foreach ($high as $k => $v) {
    $t = ($v + $low[$k])/2;
}

まず、高値のループを作成します。こちらは安値に変えてループしても同じ結果が得られるので、

foreachの$highを$lowにしても同様の結果が得られます。

$t = ($v + $low[$k])/2;

こちらではまず高値と安値を2で割った処理を$tに格納しています。

今回の計算式では9日(転換線)26日(基準線)52日(先行スパンB)で$tを使用しますので、

このループの中で

転換線 : $conv_tmpに情報が9個溜まったら計算して $conv_lineに結果を入れる

基準線 : $base_tmpに情報が26個溜まったら計算して $base_lineに結果を入れる

先行スパンB : $base_tmpに情報が26個溜まったら計算して $base_lineに結果を入れる

ということをすればよさそうです。

また、先行スパンAは同じ時系列の転換線と基準線が必要なので、ループ中に転換線と基準線のデータがあったら計算するようにすれば良いです。

すると以下のようになります。

ここから先は

9,434字

¥ 300

プログラムのことに関しては言語問わず対応できます。主にこれからプログラムを覚えていきたい+仮想通貨で自動売買をしたい人向けに記事を書いていきます。