LoginSignup
2
3

More than 3 years have passed since last update.

QuantXで移動平均線のアルゴリズムをとりあえず書く

Last updated at Posted at 2019-02-19

自己紹介

5ヶ月ほど前から趣味でPythonを触っている、プログラミング初心者です。
そんな初心者の僕がSmartTrade社でインターンをさせていただくことになったので、プログラミングも投資も分からなくても理解出来るように、学んだ内容を随時更新していきたいと思います。

この記事について

QuantXでアルゴリズムを書き始めた人でもすぐに移動平均線のアルゴリズムを書くことができるように、コードのどこをいじればアルゴリズムが作れるかの記事を書いてみました。

使用するデータを指定する部分

def initialize(ctx):
    ctx.configure(
      target="jp.stock.daily",
      channels={"jp.stock": {
                "symbols": ["使用したい銘柄"],
                "columns": ["close_price_adj"]}})

この部分では"使用したい銘柄""シグナルを計算するために必要なデータ種"の部分に自分の好きなようにデータを入れてみてください。例えばトヨタ自動車と日産自動車の終値を使用したい場合は

"symbols": ["jp.stock.7203","jp.stock.7201"],

とします

シグナルを生成する部分

    def _mavg_signal(data):

        def _mavg_signal(data):
        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()

        #売りシグナル、買いシグナルのルールを決める
        ratio = m25 / m75
        buy_sig = ratio[(ratio > 1.02) & (ratio < 1.05)]
        sell_sig = ratio[ratio < 0.95]

        return {
            "mavg_25:price": m25,
            "mavg_75:price": m75,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
        }

        # シグナル登録
        ctx.regist_signal("mavg_signal", _mavg_signal)

この部分ではratio=m25/m75の値がどうなった時に売りシグナル、または買いシグナルを出すかを自分で決めて値を変更してみてください。例えば上の例ではratio<0.95つまりm25<0.95×m75の時に売りシグナルを出すようなルールになっています。

実際に売買のルールを指定する部分

def handle_signals(ctx, date, current):
    done_syms = set([])
    for (sym,val) in ctx.portfolio.positions.items():
        returns = val["returns"]
        if returns < -0.03:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="損切り(%f)" % returns)
          done_syms.add(sym)
        elif returns > 0.05:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="利益確定売(%f)" % returns)
          done_syms.add(sym)


    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * 1, comment="SIGNAL BUY")
        pass

    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * -1, comment="SIGNAL SELL")
        pass

ここは一見複雑に見えますが、自分で変更すればいいのは
1.どのような時に利益確定売・損切りをするか
2.どれだけ売る・買うか
だけです。
1.どのような時に利益確定売・損切りをするか
例えば上のコードではif returns<-0.03(利益が-0.03未満)なら損切り、elif returns > 0.05(利益が0.05より大きい)なら利益確定売りと指定しています。
2.どれだけ売る・買うか
どれだけ売買するかはsec.order()の中の第一引数で指定できます。sec.order("どれだけ売買するか", comment="コメント")という形になっています。

最後に

以上で簡単に自分だけの移動平均線のアルゴリズムを書くことができました。(多分)
コードのより詳しい説明は移動平均を使ったサンプルで書いているので、こちらを参照してみてください。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3