「Python を使用した簡単な株式トレーディングアルゴリズムの構築と検証」

「Pythonを使った簡単な株式トレーディングアルゴリズムの作成と検証」

イントロダクション

アルゴリズムトレーディングは広く受け入れられているトレーディング戦略であり、株式取引の方法を革新しました。ますます多くの人々が株式に投資し、トレーディング戦略を自動化して副収入を得ています。このチュートリアルでは、MACD、SMA、EMAなどの基本的なテクニカルインジケータを使用して株式取引アルゴリズムを構築し、実際のパフォーマンス/リターンに基づいて最適な戦略を選択する方法をPythonを使用して完全に学習します。

学習目標

  • アルゴリズムトレーディングとは何かを知る。
  • テクニカルインジケータを使用してPythonで簡単な株式取引アルゴリズムを構築し、買い注文と売り注文のシグナルを生成する方法を学ぶ。
  • 取引戦略を実装し、Pythonで自動化する方法を学ぶ。
  • 平均リターンに基づいて最適な取引戦略を比較・選択する方法を学ぶ。

この記事はデータサイエンスブログマラソンの一環として公開されました。

免責事項 – これは金融アドバイスではありません。このプロジェクトで行われるすべての作業は教育目的であります。

アルゴリズムトレーディングとは何ですか?

アルゴリズムトレーディングは、予め定義されたルールと戦略に基づいて自動化されたコンピュータプログラムを使用して金融資産を取引する方法です。これには、統計的アービトラージ、トレンドフォロー、平均回帰など、さまざまな取引戦略が含まれます。

アルゴリズムトレーディングにはさまざまなタイプがあります。その一つがハイフリクエンシートレーディングであり、小さな価格変動を利用するためのほとんど遅延のない高速取引を行います。もう一つがニュースベースのトレーディングであり、ニュースや他の市場イベントに基づいて取引を行います。

この記事では、テクニカルインジケータとローソク足パターン検出を使用してPythonを使用して株式取引を行います。

Pythonアルゴリズムを使用した株式取引の分析方法

Pythonを使用して株価を分析し、トレンドを把握し、取引戦略を開発し、シグナルを設定して株式取引を自動化することができます!Pythonを使用したアルゴリズムトレーディングのプロセスには、データベースの選択、特定のライブラリのインストール、歴史的データの抽出など、いくつかのステップがあります。それぞれのステップを詳しく説明し、簡単な株式取引アルゴリズムを構築する方法を学びましょう。

データセットの選択

公開されている株式は何千もあり、アルゴリズムを構築するために任意の株式セットを考慮できます。ただし、基本的な要素やテクニカルが比較可能である類似の株式を考慮することは常に良い選択肢です。

この記事では、Nifty 50株を考慮します。Nifty 50指数には、時価総額、流動性、セクターの代表性、財務パフォーマンスなどのさまざまな要素に基づいて選ばれたインドのトップ50の企業が含まれています。この指数はインド株式市場のパフォーマンスを測定するためのベンチマークとして広く使用されており、小型株や中型株に投資する場合と比較して、これらの企業に投資する際のリスクは少なくなります。この記事では、分析のためにWIPROを考慮します。この記事で説明される分析アプローチは、forループ内で各株の関数を呼び出すことによって、類似の株式セットで実行できます。

必要なライブラリのインストール

パンダ、ナンパイ、マットプロットリブと共にyfinanceとpandas_taなどのデフォルトのライブラリを使用します。 yfinanceライブラリは、株価の履歴を抽出するために使用されます。 pandas_taライブラリは、SMAおよびMACDインジケータの実装と取引アルゴリズムの構築に使用されます。これらのモジュールは、他のPythonライブラリと同様に、pipを使用して直接インストールすることができます。インストールした後、モジュールをインポートしましょう。

!pip install yfinance !pip install pandas-ta

import yfinance as yfimport pandas as pdimport pandas_ta as taimport numpy as npfrom datetime import datetime as dtimport matplotlib.pyplot as pltfrom datetime import timedelta as deltaimport numpy as npimport osimport seaborn as sb

必要なライブラリがすべてインストールされ、インポートされたので、戦略の構築を始めましょう。

yfinanceを使用して歴史的な株価を抽出する

yfinanceモジュールの「download()」関数を使用して、株価の履歴を抽出します。この関数は、株式のピッカー、開始日、終了日を受け入れます。単純化のために、開始日に「2000-01-01」を、終了日には現在の日付を取ることにします。歴史的な株価を抽出し、データフレームとして返す簡単な関数を書き、それをCSVファイルとしてディスクに保存します。

def get_stock_info(stock, save_to_disk=False):    start_date = '2000-01-01'    end_date = (dt.now() + delta(1)).strftime('%Y-%m-%d')    df = yf.download(f"{stock}.NS", period='1d', start=start_date, end=end_date, progress=False)    if(save_to_disk == True):        path = './csv'        try: os.mkdir(path)        except OSError as error: pass        df.to_csv(f'{path}/{stock}.csv')    return dfdf = get_stock_info('WIPRO'、 save_to_disk = True)

テクニカル指標を使用して株式取引アルゴリズムを構築する

株式取引のための多くの指標がありますが、われわれは最も単純で非常に人気のある2つの指標、SMAとMACDを使用します。SMAは単純移動平均を意味し、MACDは移動平均収束拡散を意味します。これらの用語に馴染みがない場合は、こちらの記事でさらに学ぶことができます。簡単に言えば、取引シグナルとしてSMAクロスオーバーとMACDクロスオーバーを見つけ、利益を最大化するための最良の組み合わせを見つけようとします。

SMAクロスオーバーの場合、10日間、30日間、50日間、200日間の移動平均を考慮に入れます。MACDクロスオーバーの場合、12日間、26日間、9日間の指数移動平均を考慮に入れます。これらの値をpandas_taライブラリを使用して計算しましょう。

SMAの計算には、株価の調整後終値と日数を指定して「sma()」関数を使用します。MACDの計算には、株価の調整後終値を渡すときに、fast、slow、signalパラメータをそれぞれ12、26、9に設定した「macd()」関数を使用します。SMAとMACDの値自体にはあまり意味がありません。そこで、それらがクロスオーバーがあるかどうかを理解するために、それらをエンコードしてみましょう。

SMAの場合、以下の3つの条件を考慮します:

  • 10日間のSMAは30日間のSMAより上になる必要があります。
  • 10日間と30日間のSMAは50日間のSMAよりも上になる必要があります。
  • 10日間、30日間、50日間は200日間のSMAよりも上になる必要があります。

MACDの場合、以下の2つの条件を考慮します:

  • MACDはMACDシグナルより上になる必要があります。
  • MACDは0より大きい必要があります。

以下のPythonコードは、上記の条件を実装するための関数を作成します。

def add_signal_indicators(df):    df['SMA_10'] = ta.sma(df['Adj Close'],length=10)    df['SMA_30'] = ta.sma(df['Adj Close'],length=30)    df['SMA_50'] = ta.sma(df['Adj Close'],length=50)    df['SMA_200'] = ta.sma(df['Adj Close'],length=200)        macd = ta.macd(df['Adj Close'], fast=12, slow=26, signal=9)    df['MACD'] = macd['MACD_12_26_9']    df['MACD_signal'] = macd['MACDs_12_26_9']    df['MACD_hist'] = macd['MACDh_12_26_9']        df['10_cross_30'] = np.where(df['SMA_10'] > df['SMA_30'], 1, 0)        df['MACD_Signal_MACD'] = np.where(df['MACD_signal'] < df['MACD'], 1, 0)        df['MACD_lim'] = np.where(df['MACD']>0, 1, 0)        df['abv_50'] = np.where((df['SMA_30']>df['SMA_50'])            &(df['SMA_10']>df['SMA_50']), 1, 0)        df['abv_200'] = np.where((df['SMA_30']>df['SMA_200'])            &(df['SMA_10']>df['SMA_200'])&(df['SMA_50']>df['SMA_200']), 1, 0)        return dfdf =  add_signal_indicators(df)

データに全てのシグナルが追加されたので、リターンを計算する時が来ました。リターンは、ロットの中から最も優れた取引戦略を選択するための最も重要な要素となります。株の5日間および10日間のリターンを計算します。また、リターンを0と1にラベルエンコードし、0は負のリターンを示し、1は正のリターンを示します。それでは、同じ機能を実装するための関数を作成しましょう。

def calculate_returns(df):    df['5D_returns'] = (df['Adj Close'].shift(-5)-df['Adj Close'])/df['Close']*100    df['10D_returns'] = (df['Adj Close'].shift(-10)-df['Adj Close'])/df['Close']*100    df['5D_positive'] = np.where(df['5D_returns']>0, 1, 0)    df['10D_positive'] = np.where(df['10D_returns']>0, 1, 0)        return df.dropna()df = calculate_returns(df)    

シグナルのパフォーマンスの理解

上記に述べられた条件をすべて取り入れ、シグナルに基づいて取引する際に期待できる平均および中央値リターンを計算するために、単純な集計を実行することができます。また、過去に各シグナルが生成した最小および最大リターンを抽出することもできます。これにより、シグナルの良さだけでなく、これらのシグナルを使用して取引する際に期待できるリターンの範囲を大まかに把握することができます。以下のPythonコードを使用して、同じことを行うための簡単なコードを作成しましょう。

def get_eda_and_deepdive(df):    eda = df.dropna().groupby(['10_cross_30', 'MACD_Signal_MACD',     'MACD_lim', 'abv_50', 'abv_200'])[['5D_returns', '10D_returns']]\    .agg(['count', 'mean','median', 'min', 'max'])        deepdive = df.dropna().groupby(['10_cross_30', 'MACD_Signal_MACD',     'MACD_lim', 'abv_50', 'abv_200','5D_positive', '10D_positive'])[['5D_returns', '10D_returns']]\    .agg(['count', 'mean','median', 'min', 'max'])    return eda, deepdive        eda, deepdive = get_eda_and_deepdive(df)

5日間および10日間のリターンに基づいてソートされたトップ10のシグナルの組み合わせの箱ひげ図を可視化しましょう。

x = df.copy()def _fun(x):    code = ''    for i in x.keys(): code += str(x[i])    return codex['signal'] = x[['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200',                     '5D_positive', '10D_positive']].apply(_fun, axis=1)x = x.dropna()lim = x.groupby(['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200', '5D_positive', '10D_positive'])['5D_returns'].agg(['mean']).reset_index()lim = lim.sort_values(by='mean', ascending=False).head(10)x = x.merge(lim, on=['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200', '5D_positive', '10D_positive'], how='inner')

ax = sb.boxplot(x='signal', y='5D_returns', data=x)ax.set_xticklabels(ax.get_xticklabels(), rotation=45)plt.show()

ax = sb.boxplot(x='signal', y='10D_returns', data=x)ax.set_xticklabels(ax.get_xticklabels(), rotation=45)plt.show()

最良のシグナルを選択するために5日間および10日間のリターンのみを取り上げるのは最善のアプローチではありません。なぜなら、シグナルがどれだけの回数で正のリターンを示し、負のリターンに対してどれだけの回数で正のリターンを示しているかわからないからです。このアプローチは、最良の戦略を選択する際に考慮されるかもしれませんが、戦略のパフォーマンスを向上させる可能性があります。この記事をシンプルで初心者向けに保つため、このアプローチは取り上げません。

結論

アルゴリズムトレーディングの概念は、非常に魅力的であるため、多くの人々にとって非常に利益が大きいですが、同時に、株のトレードアルゴリズムをゼロから構築することは非常に複雑で手間のかかる作業となります。ライブトレード環境に展開された際に、すべてのアルゴリズムが失敗する可能性があることを理解することは非常に重要です。この記事の目的は、Pythonを使用して単純な取引アルゴリズムを構築し、検証する方法を探ることでした。このプロジェクトをさらに進めるためには、他のテクニカル指標やローソク足パターンを考慮し、それらを相互に使用してより複雑なアルゴリズムと戦略を構築することができます。

要点

  • この記事では、yfinanceを使用して過去の株価を抽出する方法を学びました。
  • 株価に基づいてMACDとSMAの値を計算し、これらの値を使用してシグナル/ストラテジーを作成するPythonアルゴリズムを構築する方法も学びました。
  • また、ストラテジーの5日間および10日間のリターンを計算し、可視化する方法も学びました。

注:これは金融アドバイスではありません。このプロジェクトで行われるすべての作業は教育目的でのみ行われます。これで記事は終了です。この記事をお楽しみいただき、新しいことを学んでいただけたことを願っています。読んでいただきありがとうございました。幸せな学びを!

よくある質問

この記事に表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量によって使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more