Python株の定量的取引(6)--- TA-Libを使用してテクニカル指標を計算する

毎日何が悪いのかを知って、毎日変えてください。毎日何が悪いのかわからなければ、毎日自分自身に満足するでしょう。一日を変えなければ、毎日進歩することはできません。日;世界には賢くてハンサムな人がたくさんいるので、道徳は変わりません。カルマを広げない人は、言葉に従うために人生を遅らせるだけです。

TA-Libとは

TA-Lib(テクニカル分析ライブラリ)は、Pythonが提供するオープンソースのテクニカル分析ライブラリです。リリース以来、20年以上の歴史があります。約200のテクニカル指標の計算機能とKラインパターン認識機能が含まれています。 MACD、RSI、KDJ、モメンタムインジケーターなど。

以前のブログ投稿の分析から、このライブラリを理解しておらず、株式を直接分析する場合は、すべての指標の計算式を覚えておく必要があります。数学があまり得意でない人にとっては本当に不親切です。しかし、TA-Libライブラリを入手した後は、インジケーター図面のいくつかのパラメーターを簡単に取得できるため、分析時間を大幅に節約できます。

したがって、このブログ投稿では、TA-Libライブラリを介して計算された以前のすべての技術指標について説明します。したがって、まず、このライブラリをPythonファイルにインポートする必要があります。具体的なコードは次のとおりです。

import talib

SMA指標の計算

SMAは、前回のブログ投稿で説明した移動平均であり、単純移動平均の略です。TA-Libライブラリは、SMAを計算するためのtalib.SMA()を直接提供します。

SMA()関数を使用するための2つのパラメーターがあります。

(1)期間:移動平均を計算する時間。たとえば、5日間の移動平均の場合は5を書き込み、10日間の移動平均の場合は10を書き込みます。

(2)終値:終値。パンダを介して終値の列を直接インポートできます。

次に、SMA()関数を使用して、10日、20日、および30日の移動平均を計算しましょう。具体的なコードは次のとおりです。

import pandas as pd
import talib
df = pd.read_excel("牧原股份.xlsx")
df["SMA10"]=talib.SMA(df['close'],timeperiod=10)
df["SMA20"]=talib.SMA(df['close'],timeperiod=20)
df["SMA30"]=talib.SMA(df['close'],timeperiod=30)

ただし、ここでは、移動平均を計算するときに、移動平均のn日前がnullである必要があることに注意する必要があります。たとえば、ここで10日間の移動平均を計算すると、最初の9日間は無意味になります。値がない場合は、デフォルトでNaNが入力されます。描画時にデータを美しくするには、前のN日間の空白値を、初日の移動平均の実効値に割り当てる必要があります。空白の曲線になります。具体的なコードは次のとおりです。

df['SMA10'].fillna(method="bfill",inplace=True)
df['SMA20'].fillna(method="bfill",inplace=True)
df['SMA30'].fillna(method="bfill",inplace=True)

現在、移動平均の計算方法はさまざまです。たとえば、指数移動平均の計算にはEMA法を使用し、加重移動平均の計算にはWMA法を使用します。ただし、これらの計算には一般的な方法MAがあり、最後のパラメーターmatypeを使用してEMA、WMA、またはSMAのいずれを計算するかを区別します。例えば:

df['ma10']=talib.MA(df['close'],timeperiod=10,matype=0)
df['ma20']=talib.MA(df['close'],timeperiod=20,matype=1)
df['ma30']=talib.MA(df['close'],timeperiod=30,matype=2)

0はSMA、1はEMA、2はWMA、その他のパラメータ値を表します。後で他の指標について説明するときに紹介します。これら3つは最も一般的に使用される方法であり、覚えておく必要があります。

移動平均を描画するコードは次のとおりです。

import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
df["SMA10"]=talib.SMA(df['close'],timeperiod=10)
df["SMA20"]=talib.SMA(df['close'],timeperiod=20)
df["SMA30"]=talib.SMA(df['close'],timeperiod=30)
df['SMA10'].fillna(method="bfill",inplace=True)
df['SMA20'].fillna(method="bfill",inplace=True)
df['SMA30'].fillna(method="bfill",inplace=True)
ax.plot(np.arange(0, len(df)), df['SMA10'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA20'])  # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30'])  # 绘制30日均线
ax.xaxis.set_major_locator(ticker.MaxNLocator(20))


def format_date(x, pos=None):
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

実行後の表示効果は次の図のようになります。
ここに画像の説明を挿入

MACDインジケーターの計算

TA-Libライブラリは移動平均を計算するためのSMA()メソッドを直接提供するため、MACDを計算するためのパラメーターを提供するMACDメソッドが確実に存在します。具体的な使用方法は次のとおりです。

dif, dea, bar = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)

MACDパラメータを計算する際に、上記の12、26に対応するEMA1(12日の終値の移動平均)とEMA2(26の終値の移動平均)を計算することがわかります。同様に、DEAを計算するための式スパンも9であり、これは最後の値に代入されます。

ただし、その内部実装は実際には式による独自の操作と同じステップですが、TA-Libライブラリは直接ステップを省略し、メソッドを直接提供するため、分析にのみ使用される場合、ほとんどの開発者は原則を理解する必要があります。

計算メソッドMACD()を直接提供しますが、前の式に従って計算しますが、null値はなく、ここで直接コードを実行するとnull値が発生します。したがって、null値を置き換えるための追加の手順が必要です。具体的なコードは、次のとおりです。

dif[np.isnan(dif)],dea[np.isnan(dea)],bar[np.isnan(bar)]=0,0,0

完全な描画コードは次のとおりです。

import pandas as pd
import talib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
dif, dea, bar = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
dif[np.isnan(dif)], dea[np.isnan(dea)], bar[np.isnan(bar)] = 0, 0, 0
ax.plot(np.arange(0, len(df)), dif)
ax.plot(np.arange(0, len(df)), dea)
red_bar = np.where(bar > 0, 2 * bar, 0)
blue_bar = np.where(bar < 0, 2 * bar, 0)
ax.bar(np.arange(0, len(df)), red_bar, color="red")
ax.bar(np.arange(0, len(df)), blue_bar, color="blue")

ax.xaxis.set_major_locator(ticker.MaxNLocator(20))


def format_date(x, pos=None):
    # 由于前面股票数据在 date 这个位置传入的都是int
    # 因此 x=0,1,2,...
    # date_tickers 是所有日期的字符串形式列表
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

実行後の表示効果は次のとおりです。
ここに画像の説明を挿入

KDJ指標の計算

TA-LibライブラリではSMAとMACDを計算するためのメソッド名は同じですが、今回は実際にはKDJ関数ではありません。TA-LibライブラリでKDJを計算する方法は、talib.STOCH関数です。まず、この関数を使用してKとDの値を計算し、次にJからKとDの値を計算できます。具体的な計算方法は次のとおりです。

df['K'], df['D'] = talib.STOCH(df['high'].values, df['low'].values, df['close'].values, fastk_period=9, slowk_period=3,
                               slowk_matype=0, slowd_period=3, slowd_matype=0)
df['K'].fillna(0,inplace=True)
df['D'].fillna(0,inplace=True)
df['J']=3*df['K']-2*df['D']

ここで、fastk_period = 9、slowk_period = 3、slowd_period = 3ですが、計算方法は異なりますが、基本的な考え方は同じです。同様に、TA-Libライブラリを使用して計算されたKD値にも無効な値があり、0に置き換える必要があります。

KDJ曲線を描画するための完全なコードは次のとおりです。

import pandas as pd
import talib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
df = pd.read_excel("牧原股份.xlsx")
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
df['K'], df['D'] = talib.STOCH(df['high'].values, df['low'].values, df['close'].values, fastk_period=9, slowk_period=3,
                               slowk_matype=0, slowd_period=3, slowd_matype=0)
df['K'].fillna(0,inplace=True)
df['D'].fillna(0,inplace=True)
df['J']=3*df['K']-2*df['D']
ax.plot(df["date"], df["K"], label ="K")
ax.plot(df["date"], df["D"], label ="D")
ax.plot(df["date"], df["J"], label ="J")
plt.legend()
ax.xaxis.set_major_locator(ticker.MaxNLocator(20))
def format_date(x, pos=None):
    # 由于前面股票数据在 date 这个位置传入的都是int
    # 因此 x=0,1,2,...
    # date_tickers 是所有日期的字符串形式列表
    if x < 0 or x > len(df['date']) - 1:
        return ''
    return df['date'][int(x)]


ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()

実行後の表示効果は次のとおりです。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/liyuanjinglyj/article/details/113401385
おすすめ