こんにちは、エンジェル投資家のびずぷらです。
「QuantXで始めるシステムトレード講座」の第二回目です。
人工知能のプログラミング言語で有名なPythonとシステムトレードを行うためのテクニカル指標を勉強する講座です!
今回の講座で学べることは、
- Smart Trade社のQuantXの基本的なプログラム構造を理解する
- 移動平均線を理解する
ちなみにQuantXはクオンテックスと読みます。

目次
移動平均線を書いてみる(前回の復習)
前回の講座「QuantXで始めるシステムトレード講座」では、Smart Trade(スマートトレード)社のQuantXを使って「移動平均線」を表示するプログラムを動かすことに成功しました。
前回動かしたプログラムはこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | ############################################################################ # 移動平均の表示サンプル def initialize(ctx): # 設定 ctx.logger.debug("initialize() called") ctx.configure( channels={ # 利用チャンネル "jp.stock": { "symbols": [ "jp.stock.1321", #日経平均連動 "jp.stock.8267", #イオン "jp.stock.7203", #トヨタ ], "columns": [ "close_price", # 終値 "close_price_adj", # 終値(株式分割調整後) ] } } ) def _my_signal(data): m05 = data["close_price_adj"].fillna(method='ffill').rolling(window=5, center=False).mean() m25 = data["close_price_adj"].fillna(method='ffill').rolling(window=25, center=False).mean() m75 = data["close_price_adj"].fillna(method='ffill').rolling(window=75, center=False).mean() return { "移動平均05:price": m05, "移動平均25:price": m25, "移動平均75:price": m75, } # シグナル登録 ctx.regist_signal("my_signal", _my_signal) def handle_signals(ctx, date, current): '' |
この記事では、このプログラムと移動平均線の解説をします!
プログラムはイヤって人は、移動平均線までスキップしてください。
移動平均線のプログラムを理解しよう!
プログラムが苦手な人、Pythonははじめてなんだけどという方は、10秒で始められる講座「Aidemy」でPythonの無料講座を受けるのがオススメです。無料です。
Aidemy 「プログラミング初心者でも大丈夫『Python入門』コース」
本気で勉強するなら有料コースもあります。

QuantXの大きな構造に着目
まず最初に細かいプログラムに入る前に、構造を理解しましょう。
QuantXのプログラムは大きな2つの構造に分かれます。
1. 初期化の領域
1-1. 銘柄選択、利用データ定義
1-2. 売買シグナル生成
2. 売買取引アクション

この図は前回とは違います。気がついた方もいるでしょうが、前回は、2の売買取引アクションについては記載を省略しています。
正確には1-2の売買シグナルも作ってはいません。また後で解説します。
初期化の領域
初期化はプログラム実行で一度だけ呼ばれます。
ここで対象の銘柄の過去データを抽出して、売買シグナル(どの銘柄を売るか・買うか)を生成するロジックを書きます。
頑張れば人口知能プログラムで売り買いを判断する、なんてことが書けるようになるはずです。
つまり売買シグナル生成が、QuantXのアルゴリズムの最重要部分になります!
銘柄選択、利用データ定義
最初に銘柄選択や利用データの定義をします。
前回のサンプルでは、日経平均連動ETF、イオン、トヨタの3つの銘柄を選択しています。また利用データとして終値と終値(株式分割調整後) の2つを利用できるよう定義しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def initialize(ctx): # 設定 ctx.logger.debug("initialize() called") ctx.configure( channels={ # 利用チャンネル "jp.stock": { "symbols": [ "jp.stock.1321", #日経平均連動 "jp.stock.8267", #イオン "jp.stock.7203", #トヨタ ], "columns": [ "close_price", # 終値 "close_price_adj", # 終値(株式分割調整後) ] } } ) |
ここは、なんとなくわかりますよね。試しにお好きな銘柄に変えて見るのも面白いと思います。
プログラムの初心者はわからない記載がたくさん出て戸惑うかもしれません。でもそこは「おまじない」と思って、わからないなりに進むのがよいです。
プログラムなんて最初はそんなものです。
売買シグナル生成
一番の重要ポイントの売買シグナル生成。
ですが、前回のサンプルではチョー手抜きをして、実際はシグナル作ってません。
ごめんなさい。
移動平均線を3本。5日、25日、75日の3つを作っています。
1 2 3 4 5 6 7 8 9 10 | def _my_signal(data): m05 = data["close_price_adj"].fillna(method='ffill').rolling(window=5, center=False).mean() m25 = data["close_price_adj"].fillna(method='ffill').rolling(window=25, center=False).mean() m75 = data["close_price_adj"].fillna(method='ffill').rolling(window=75, center=False).mean() return { "移動平均05:price": m05, "移動平均25:price": m25, "移動平均75:price": m75, } |
def mysignalのところは関数の定義です。
dataは3次元の配列になっています。今回のdataには下記がセットされます。
- データ項目:終値、終値(株式分割調整後)
- 日付:2017.1.1〜2017.4.22(テスト実行時の条件)
- 銘柄(日経平均連動ETF、イオン、トヨタ)
データ格納イメージとしては
2017.1.4
終値 | 終値(調整後) | |
日経平均連動ETF | 20080.0 | 20080.0 |
トヨタ | 7097.0 | 7097.0 |
イオン | 1684.0 | 1684.0 |
2017.1.5
終値 | 終値(調整後) | |
日経平均連動ETF | 20020.0 | 20020.0 |
トヨタ | 7049.0 | 7049.0 |
イオン | 1698.5 | 1698.5 |
ちなみにdataはpandas.Panelオブジェクトです。
pandas(パンダス)とは、Python用のデータ解析支援ライブラリです。
2次元・3次元配列のデータ解析が楽になります。pandasでは、下記のようなオブジェクトがあります。2次元のデータフレームは今後よく出てきます。
- 1次元: Series
- 2次元:DataFrame
- 3次元:Panel
1 | m05 = data["close_price_adj"].fillna(method='ffill').rolling(window=5, center=False).mean() |
この部分では以下のイメージで移動平均線のデータを計算しています。
- dataから終値を抽出
- fillnaで欠損データを補完(おまじない)
- rollingで5日分をさかのぼりながら、
- meanで平均をとる
これだけの計算が一行でできるというのが画期的ですね。pandasを使ったことないと、ループを回して・・・とか考えそうなところです
m05の値は2次元配列(DataFrame)になりますので、結果のデータセットは下記のイメージです。
5日分をさかのぼって平均をとるため、1月11日からデータが取れます。それ以前のデータはNanとなります。
ETF | トヨタ | イオン | |
2017-01-04 | NaN | NaN | NaN |
2017-01-05 | NaN | NaN | NaN |
2017-01-06 | NaN | NaN | NaN |
2017-01-10 | NaN | NaN | NaN |
2017-01-11 | 19946.0 | 7039.6 | 1693.8 |
2017-01-12 | 19858.0 | 7022.2 | 1700.8 |
1 2 3 4 5 | return { "移動平均05:price": m05, "移動平均25:price": m25, "移動平均75:price": m75, } |
最後にリターンで移動平均を返すことで、グラフに表示されるようになります。
今回のプログラム的な解説は以上です。お疲れ様でした。

移動平均線とゴールデンクロス・デッドクロス

プログラムと一緒に今回のテクニカル指標についても学びましょう!
ある一定期間の終値の平均値をグラフにしたもの
移動平均線はトレンドを見るのに使われます。特に長期の移動平均線の動きで、株価の長期トレンド(上昇傾向、下降傾向)がつかめます。
移動平均の期間は、5日・25日・75日の平均をとるのが一般的です
買いのゴールデンクロスと売りのデッドクロス
異なる期間の移動平均線がクロスする箇所を見ることで、売り・買いのタイミングがわかります。
短期の移動平均線が、長期の移動平均線を、下から上に突き抜ける
短期の移動平均線が、長期の移動平均線を、上から下に突き抜ける
一般的な移動平均線は5・25・75日と説明しました。この一般的な流れに乗るのが良いのか、違う期間がよいかは、様々な議論があります。
参考にする人が多いメジャーな指標を選ぶ方が、その通りに株価が動く可能性が高いという発想、それに先んじで投資するため別の指標が必要という発想の二つです。
まとめ

今回は、Smart Tradeを使って以下のことを学びました。
- QuantXの基本構造
- pandasのデータ型
- 移動平均線
- ゴールデンクロスとデッドクロス
まだ初歩の初歩でシステムトレードにはかなり遠い道のりです。が、初めての人にはお腹いっぱいな内容かもしれません。
ですが、一歩一歩進むしかないので、頑張りましょう!
