Ta-Libをrequirements.txtに書いて、 sls deploy をコマンドラインで実行すると、 numpyがないよ!! と怒られてしまいます。 なので、Dockerfileから自作して、それを直接AWS Lambdaにアップロードすることでこの問題を解決します。

では、まずは、Ta-Libを使った関数を実装します。


Ta-Libを使って定期実行したい処理を実装

ohlcのデータ取得方法はこちらを参考にしてください。

handler.py

import pandas as pd
import talib
from oandapyV20 import API
from oandapyV20.endpoints import instruments


def get_ohlc_from_now_by(access_token: str, trade_mode, count: int, chart_term: str, instrument: str) -> pd.DataFrame:
    params = {
        "alignmentTimezone": "Japan",
        "count": count,
        "granularity": chart_term
    }

    ic = instruments.InstrumentsCandles(instrument=instrument, params=params)
    api = API(access_token=access_token, environment=trade_mode)
    api.request(ic)

    data = []
    for raw in ic.response['candles']:
        data.append([raw['time'], raw['mid']['o'], raw['mid']['l'], raw['mid']['h'], raw['mid']['c'], raw['complete']])

    df = pd.DataFrame(data)
    df.columns = ['time', 'open', 'low', 'high', 'close', 'complete']

    return df


def calc_RSI():
    access_token = '自分のpersonal access token'  # 環境変数にすると良いでしょう

    df = get_ohlc_from_now_by(
        access_token=access_token,
        trade_mode='practice',
        count=30,
        chart_term='M15',
        instrument='GBP_JPY'
    )

    df["RSI"] = talib.RSI(df['close'], timeperiod=7)

    print(df)


if __name__ == '__main__':
    calc_RSI()

serverless.yml

関数情報を定義してきます。 また、15分ごとに関数が実行されるように指定しておきます。

service: matsu
provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

functions:
  matsu_lambda:
    handler: handler.calc_RSI
    events:
      - schedule:
          rate: cron(0/15 * ? * MON-SUN *)
          description: '15分ごとにRSIを計算する'

custom:
  pythonRequirements:
    dockerizePip: non-linux
    slim: true
    zip: true

package:
  include:
    - handler.py
  exclude:
    - '**'

plugins:
  - serverless-python-requirements

requirements.txt

必要なライブラリを書いておきます。

oandapyV20
pandas
requests
ta-lib

Dockerfileを作成

FROM lambci/lambda:build-python3.7
ENV AWS_DEFAULT_REGION ap-northeast-1

RUN yum -y install wget

# install Ta-Lib
RUN pip install numpy==1.17.3
RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \
  tar -xvzf ta-lib-0.4.0-src.tar.gz && \
  cd ta-lib/ && \
  ./configure --prefix=/usr && \
  make && \
  make install

RUN rm -R ta-lib ta-lib-0.4.0-src.tar.gz

ADD . .

CMD pip3 install -r requirements.txt -t /var/task && \
  zip -9 deploy_package.zip lambda_function.py && \
  zip -r9 deploy_package.zip *

該当ファイルをDockerを使って圧縮

下記のコマンドを実行してください。

$ docker build -t mylambda .
$ docker run -v "$PWD":/var/task mylambda

実行したディレクトリの直下に、 deploy_package.zip が作成されます。


S3に圧縮したファイルを保存

まず、S3に適当なバケットを作成します。 その中に先ほど圧縮したファイルをアップロードします。

アップロードが終了したら、 オブジェクト URL をコピーしておいてください。


AWS lambdaでファイルをアップロード

AWS Lambdaで、対象の関数を選択(まだ作成してない場合は、先に関数を作成)して、「関数コード」に先ほどコピーした オブジェクト URL をペースとします。

その後、画面一番右上の「 保存 」を押下すると、関数の更新が始まります。


テスト

実際に正しく実装されて、ファイルをアップロードされているかを確認するために、AWS Lambda上で「テスト」をします。


これで、Ta-LibをAWS Lambdaで使えるようになりました。Ta-Libは、チャート分析に使いたいテクニカル指標の計算を簡易化してくれます。

ぜひ、自分なりにテクニカル指標を組み合わせて、オリジナルな取引アルゴリズムで自動取引をしてみてください。

MT4スプレッド2