FX Python システムトレード

FXのヒストリカルデータを元にPythonのpandasとmatplotlibを使用して移動平均線を描写する

スポンサードリンク

前回の記事「FXのヒストリカルデータを元にPythonのpandasとmatplotlibを使用してローソク足を描写する」で
ローソク足を描写できたので、次は移動平均線の描写にチャレンジします。

最初は、ネット上でもサンプルが多いpandasのrolling_meanを使用しようとしたのですが、
非推奨で使えないということが判明し、メッセージの中で表示されている
「Series.rolling」を使用することにしました。

FutureWarning: pd.rolling_mean is deprecated for Series and will be removed in a future version, replace with 
        Series.rolling(center=False,window=5).mean()
  sma25.plot(label='SMA25')

以下のプログラムは、前回のローソク足の描写のプログラムに移動平均線の表示を追加しています。

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 10 16:44:16 2017

@author: ichizo
"""
import datetime
import sqlite3
import pandas as pd

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc

DB = 'usd_jpy_prices.db'
FROMDATE = '20161201000000'
TODATE = '20161201010000'
DTYPE = '1min'

def get_datas():
    conn = sqlite3.connect(DB)
    sql = "SELECT datetime, open, high, low, close FROM onemin WHERE datetime >= '%s' AND datetime <= '%s';" % (FROMDATE, TODATE)
    datas = pd.io.sql.read_sql_query(sql, conn)
    conn.close()

    return datas

def convert_datas(datas):
    datas['open'] = datas['open'].astype(float)
    datas['high'] = datas['high'].astype(float)
    datas['low'] = datas['low'].astype(float)
    datas['close'] = datas['close'].astype(float)

    if DTYPE == '1min':
        tmp = datas['datetime'].values.astype('datetime64[D]')
        datas['datetime'] = tmp.astype(float)
        return datas

    quotes_arr = []
    tmp_open_price = 0
    tmp_high_price = []
    tmp_low_price = []
    tmp_close_price = 0
    count = 0

    for loop, cDate in enumerate(datas['datetime']):
        isNext = False
        cDatetime = datetime.datetime.strptime(cDate, "%Y%m%d%H%M%S")

        if DTYPE == '5min' and cDatetime.minute % 5 == 0:
            isNext = True
        if DTYPE == '10min' and cDatetime.minute % 10 == 0:
            isNext = True
        if DTYPE == '30min' and cDatetime.minute % 30 == 0:
            isNext = True
        if DTYPE == '1hour' and cDatetime.minute == 0:
            isNext = True
        if DTYPE == '1day' and cDatetime.hour == 0:
            isNext = True
        
        if tmp_open_price == 0:
            tmp_open_price = datas['open'][loop]

        if isNext == True and loop != 0:
            data = []
            data.append(cDate)
            data.append(tmp_open_price)
            data.append(max(tmp_high_price))
            data.append(min(tmp_low_price))
            data.append(tmp_close_price)
            
            pddata = pd.DataFrame([data])
            pddata.columns = ["datetime", "open", "high", "low", "close"]
            pddata.index = [count]
            quotes_arr.append(pddata)

            tmp_open_price = datas['open'][loop]
            tmp_high_price = []
            tmp_low_price = []
            count += 1

        tmp_high_price.append(datas['high'][loop])
        tmp_low_price.append(datas['low'][loop])
        tmp_close_price = datas['close'][loop]

    for idx, value in enumerate(quotes_arr):
        if idx == 0:
            quotes = quotes_arr[idx]
        else:
            quotes = pd.concat([quotes, value],axis=0)

    quotes['datetime'] = quotes['datetime'].astype(float)
    quotes['open'] = quotes['open'].astype(float)
    quotes['high'] = quotes['high'].astype(float)
    quotes['low'] = quotes['low'].astype(float)
    quotes['close'] = quotes['close'].astype(float)

    return quotes

if __name__ == '__main__':
    datas = get_datas()
    datas = convert_datas(datas)

    plt.grid()
    ax = plt.subplot()
    candlestick_ohlc(ax, datas.values, width=200.0, colorup='#77d879', colordown='#db3f3f')
    
    #移動平均線
    s = pd.Series(datas['close'])
    sma25 = s.rolling(window=25).mean()
    sma5 = s.rolling(window=5).mean()
    plt.plot(datas['datetime'], sma5)
    plt.plot(datas['datetime'], sma25)

    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title('USD-JPY')
    plt.show()

今回追加したのは、以下の部分です。

    #移動平均線
    s = pd.Series(datas['close'])
    sma25 = s.rolling(window=25).mean()
    sma5 = s.rolling(window=5).mean()
    plt.plot(datas['datetime'], sma5)
    plt.plot(datas['datetime'], sma25)

終値の移動平均を算出するので、pd.Series(datas['close'])とします。

移動平均の値は、以下で算出します。

Series.rolling(center=False,window=5).mean()

rollingの引数で、window=5は5分の移動平均を出します(データが1分足なので)。
window=25は、25分の移動平均になります。

plt.plotでは、X軸の値、Y軸の値を引数に渡します。

描写すると下記のようになりました。

スポンサードリンク

-FX, Python, システムトレード
-, , ,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5