Python、株式投資、一目均衡法

2024年4月29日

■はじめに
2024年4月から新NISAも始まり、世の中、投資機運は高まっています。
そんなこの頃、ご自身の投資知識を蓄えて将来に備えるというのはどうでしょうか。
(私自身も社会人になった20代から初めて経験だけではもう20年以上になります、、まだまだ勉強中です。)
昔とは異なり、プロではなくても十分に判断に使える情報がIT、インターネットにより得られるようになりました。
今回は私自身が投資の自己判断に補助的に利用しているPythonによるしくみを紹介します。

■適用範囲
株式投資判断の補助ツール

Python TA-Libライブラリを使った株式投資判断ツールになります。
matplotlib、seabornライブラリを使い、4つの指標を可視化しています。
(これは抑えましょう。)

  1. 株価
  2. MACD
    ・0以上なら上昇トレンド
    ・0以下なら下降トレンド
  3. RSI
    ・RSIが30%以下に下がると売られすぎの買い場
    ・RSIが70%以上まで上昇すると買われすぎの売り場
  4. 出来高
  5. 一目均衡法
    赤:基準線青:転換線橙:遅行線
    ローソク足が雲の上にあるときは上昇トレンド
    ローソク足が雲の下にあるときは下降トレンド
    先行スパンが交差する点はトレンドの転換が予想される(雲のねじれ)
    ローソク足が遅行線を上回ると売りのタイミング
    (遅行線がローソク足を下回ると売りのタイミング)
    ローソク足が遅行線を下回ると買いのタイミング
    (遅行線がローソク足を上回ると売りのタイミング) 

■サンプルプログラム

#!/usr/bin/env python
# coding: utf-8

import pandas as pd
import numpy as np
import talib as ta
from pandas_datareader import data as pdr #修正
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter('ignore’)
import seaborn as sns
sns.set(context="poster",font="Noto Serif CJK JP")
import japanize_matplotlib
import mplfinance as mpf
import yfinance as yf #追加
yf.pdr_override() #追加

from datetime import datetime
y_symbols = ['7203.T’]
startdate = datetime(2023,10,1)
enddate = datetime(2024,12,31)
data = pdr.get_data_yahoo(y_symbols, start=startdate, end=enddate)
df = data

#ボリンジャーバンドを追加
#0:単純移動平均線(SMA:Simple Moving Average)
#1:指数関数移動平均線(EMA:Exponential Moving Average)
#2:加重移動平均線(WMA:Weighted Moving Average)
#3:二重指数関数移動平均線(DEMA:Double Exponential Moving Average)
#4:三重指数移動平均(TEMA:Triple Exponential Moving Average)
#5:三角移動平均線(TRIMA:Triangular Moving Average)
#6:カウフマン適応移動平均線(KAMA:Kaufman’s Adaptative Moving Average)
#7:MESA適応型移動平均線(MAMA:MESA Adaptive Moving Average)
#8:T3移動平均線(T3:T3 Moving Average)
#9:ハル移動平均線(HMA:Hull Moving Average))
#10:線形加重移動平均(LWMA:Linear Weighted Moving Average)
#11:平滑移動平均線(SMMA:Smoothed Moving Average)

import talib as ta
df[“upper"], df[“middle"], df[“lower"] = ta.BBANDS(df['Adj Close’], timeperiod=25, nbdevup=2, nbdevdn=2, matype=0)

apds = [mpf.make_addplot(df['upper’],color=’g’),
mpf.make_addplot(df['middle’],color=’b’),
mpf.make_addplot(df['lower’],color=’r’)
]

#MACD 0以上は上昇トレンド、 0以下は下降トレンド
df['macd’], df['macdsignal’], df['macdhist’] = ta.MACD(df['Adj Close’], fastperiod=12, slowperiod=26, signalperiod=9)

apds = [mpf.make_addplot(df['upper’],color=’g’),
mpf.make_addplot(df['middle’],color=’b’),
mpf.make_addplot(df['lower’],color=’r’),
mpf.make_addplot(df['macdhist’], type=’bar’,
width=1.0, panel=1, color=’gray’, alpha=0.5, ylabel=’MACD’)
]

#RSI 20%〜30%を下回る:売られすぎ、70%〜80%を上回る:買われすぎ
df[“RSI"] = ta.RSI(df[“Adj Close"], timeperiod=25)

apds = [mpf.make_addplot(df['upper’],color=’g’),
mpf.make_addplot(df['middle’],color=’b’),
mpf.make_addplot(df['lower’],color=’r’),
mpf.make_addplot(df['macdhist’], type=’bar’,
width=1.0, panel=1, color=’gray’, alpha=0.5, ylabel=’MACD’),
mpf.make_addplot(df['RSI’], panel=2, type=’line’, ylabel=’RSI’)
]

#一目均衡表
high = df['High’]
low = df['Low’]
max26 = high.rolling(window=26).max()
min26 = low.rolling(window=26).min()
df['basic_line’] = ( max26 + min26 ) / 2
high9 = high.rolling(window=9).max()
low9 = low.rolling(window=9).min()
df['turn_line’] = ( high9 + low9 ) / 2
df['span1’] = (df['basic_line’] + df['turn_line’]) / 2
high52 = high.rolling(window=52).max()
low52 = low.rolling(window=52).min()
df['span2’] = ( high52 + low52 ) / 2
df['slow_line’] = df['Adj Close’].shift(-25)
lines = [mpf.make_addplot(df['basic_line’]), #基準線
mpf.make_addplot(df['turn_line’]), #転換線
mpf.make_addplot(df['slow_line’]), #遅行線
]
apds = [mpf.make_addplot(df['upper’], color=’g’),
mpf.make_addplot(df['middle’], color=’b’),
mpf.make_addplot(df['lower’], color=’r’),
mpf.make_addplot(df['macdhist’], type=’bar’, width=1.0, panel=1, color=’gray’, alpha=0.5, ylabel=’MACD’),
mpf.make_addplot(df['RSI’], panel=2, type=’line’, ylabel=’RSI’) ,
mpf.make_addplot(df, panel=3, type=’candle’),
mpf.make_addplot(df['basic_line’], panel=3, type=’line’, color=’red’, ylabel=’Price’, fill_between=dict(y1=df['span1’].values, y2=df['span2′].values, alpha=0.5, color=’gray’)),
mpf.make_addplot(df['turn_line’], panel=3, type=’line’, color=’blue’, ylabel=’Price’),
mpf.make_addplot(df['slow_line’], panel=3, type=’line’, color=’orange’, ylabel=’Price’),
mpf.make_addplot(df['span1′], panel=3, color=’black’, width=0.5),
mpf.make_addplot(df['span2′], panel=3, color=’black’, width=0.5)
]
mpf.plot(df, type=’candle’, figsize=(20,20), style=’yahoo’, volume=True, addplot=apds,
volume_panel=4, panel_ratios=(5,3,3,5,1), title=’SAPPORO_HD’)
mpf.plot(df, type=’candle’, figsize=(20,20), style=’yahoo’, volume=True, addplot=apds,
volume_panel=4,panel_ratios=(5,3,3,5,1), title=’SAPPORO_HD’, savefig=’2501.png’)

●チャートの見方例

LINE APIを使うことで、希望の時間にグラフ作成し、スマートデバイスへ定期配信もすることができます。

 

■参考URL
https://teratail.com/questions/9q8zc5eccp9796

 

\ 最新情報をチェック /