第5章 株価分析を実践し反省する#
株価分析のために使われるポピュラーな手法を解説します。
株価予測の難しさ
株価が変動する要因は実に様々です。例えば以下のような要因をあげることができます。
-
企業の業績: 企業の収益や成長率、財務状況などが株価に直接的な影響を与えます。好業績を示す企業は投資家の信頼を得やすく、株価が上昇する傾向があります。 特に市場コンセンサスと呼ばれる投資家サイドの業績予測値と企業がアナウンスする業績結果のずれに注目することが重要です。
-
経済指標: GDP成長率、失業率、インフレ率などの経済指標、あるいはそれらに影響を与える先行性指標は株価に影響を与えます。日本の株式市場は米国の株式市場の影響を敏感に反映することが知られています。そのため定期的に発表される米国の主要な経済指標に注目することは非常に重要です。 例えば重要指標の公開間近になると大口投資家がリスクを回避するために利益確定売りする結果株価が下がる、というケースはよく目にする事象です。
-
政治情勢: 政治的な不安定さや政策の変化は、投資家のリスク許容度や市場の信頼度に影響を与えます。特に、地政学的リスクや国際関係の緊張が高まると、エネルギー価格や食料品価格の変動を通じて株価に不安定性が生じることがあります。
-
市場心理: 投資家の感情や期待、市場の心理状況が株価の変動に大きな影響を与えます。特に、恐怖や 陶酔 などの感情が市場に広がると、株価の急激な変動が生じることがあります。 同じ事象を株価に対して上昇要因ととらえる人がいれば 逆に下落要因ととらえる人もいます。
これらが複雑に絡み合う結果、物理学が達成したような精緻な予測は株価(あるいはそれに類する経済活動)に対しては困難です。その一方で株価変動は完全なランダム事象ではないとも思われます。これを背景として理解したうえで、数学を活用することによって株式投資をうまく遂行することが見込めそうな課題領域が大別して2つあります。
-
パターンの発見と予測: 数学的手法を使用して、過去の株価を分析することでパターンを発見し、将来の株価動向を予測すること。
-
ポートフォリオ最適化: 数学的手法を使用して、投資リスクを評価しポートフォリオ(投資対象の組み合わせ)を最適化すること。
本章ではテクニカル分析と呼ばれる、これらの課題に対して実際の応用場面で効果を発揮している数理的手法を紹介していこうと思います。テクニカル分析だけで投資を進めることも困難であろうことは上述の各種要因が示唆しています。そこで非テクニカルな分析を行ううえでの基礎となる重要な経済・金融情報をまとめておきます。このような情報をもとに経済・金融系アナリストが定期的に情報分析レポートを発表していますので、信頼のおけるアナリストのレポートを注意深く参照することは有益であろうと考えます。
1. テクニカル指標#
この節では最も重要な統計量である平均、分散を利用したテクニカル指標とその使用例をあげます。
最初に少し断り書き的な補足をしておきます。 第 4 章 5 節 3 項のなかで回帰や移動平均に基づく時系列モデルを使った株価の予測はリスクがあると書きました。一方でそういった時系列分析の考え方をベースにしたテクニカル指標が実際の取引で無益であるとも考えていません。それは市場の多くの参加者が、テクニカル指標に対しておおむね共通した解釈を行い取引に活用するならば、結果的に株価の動きに影響を与える可能性があると考えるからです。証券会社のサイトや日経新聞の記事にはしばしば「一目均衡表の...雲を突き抜け...」といった記述が現れます。このような表現が何かしら個々の利用者の取引行動において参考にされていることは、ありそうに思えます。
1.1. 移動平均線#
移動平均線は、一定期間の価格データの平均値を計算し、チャート上に表示される線です。特に、短期移動平均線と長期移動平均線のクロスオーバーをトレンドの転換点として活用することがあります。たとえば、短期移動平均線が長期移動平均線を上回った場合は買いシグナルとして解釈され、逆に短期移動平均線が長期移動平均線を下回った場合は売りシグナルとして解釈されます。
コード例は第 1 章 1 節 3 項に記載しましたのでここでは割愛します。
1.2. ボリンジャーバンド#
第 2 章 2 節 4 項で観測値の散らばりを示す指標として標準偏差を定義しその応用としてボリンジャーバンド、ヒストリカルボラタリティに言及しました。そこで実際にこれらの指標を株価データに適用して可視化してみます。ボリンジャーバンド(Bollinger bands)は移動平均線を中心に、一定の標準偏差(以下のコードでは)上限下限に挟まれた領域を塗りつぶしたバンドとして表現します。株価がバンドの上限や下限を超えた場合、買われ過ぎ(チャート上の S の赤点)または売られ過ぎ(チャート上の B の緑点)の状況と見なされ、価格の反転の可能性が高まると考えられます。従ってこの反転のポイントを売り買いのシグナルとします。
データの分散傾向を使う指標としてはこの他にヒストリカルボラタリティ(Historical volatility)>を掲げることができます。この指標は収益率(近似的には対数収益率)の平均からの乖離を可視化するものです。値動きが小さいとき下降し、値動きが激しくなると上昇するため相場の大きな変化タイミングを知るために活用されます。を日時tでの株価、 を収益率 としたとき、ヒストリカルボラタリティは以下のように、収益率の標準偏差を(年間営業日数の平方根を掛けることで)年率換算しパーセントで表したものです。
以下のコードではボリンジャーバンドとヒストリカルボラタリティをプロットします。
# predi_technical_bollinger.py
# ボリンジャーバンドを描く
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import japanize_matplotlib
code = '6227'
name = 'AIメカテック'
#code = '^N225'
#name = '日経平均株価'
data = pd.read_csv(f'{code}.T.csv')
# 'Date'列をdatetime64型に変換する
data['Date'] = pd.to_datetime(data['Date'])
# 'Date'列をindexに設定する
data.set_index('Date', inplace=True)
# 表示区間のdfを切り出す
df = data[(data.index >= datetime.datetime(2023,4,1)) & (data.index <= datetime.datetime(2024,1,31))]
# ボリンジャーバンドの計算
window = 20
std_multiplier = 2
rolling_mean = df['Close'].rolling(window=window).mean()
rolling_std = df['Close'].rolling(window=window).std()
upper_band = rolling_mean + std_multiplier * rolling_std
lower_band = rolling_mean - std_multiplier * rolling_std
# 収益率の計算
returns = df['Close'].pct_change()
# ヒストリカルボラタリティの計算。収益率の平均値の標準偏差を年率換算します。
market_days = 250 # 年により多少変動します
window = 20 # 観測期間
historical_volatility = returns.rolling(window=window).std() * np.sqrt(market_days) *100 # 年率換算
# ボリンジャーバンドによるエントリポイントの特定
entry_points = []
for i in range(len(df)):
if df['Close'].iloc[i] >= upper_band.iloc[i]:
entry_points.append((df.index[i], df['Close'].iloc[i], 'S'))
elif df['Close'].iloc[i] <= lower_band.iloc[i]:
entry_points.append((df.index[i], df['Close'].iloc[i], 'B'))
# ヒストリカルボラタリティの平均と標準偏差
hv_mean = historical_volatility.mean()
hv_std = historical_volatility.std()
# 水平線の値
line1 = hv_mean
line2 = hv_mean + hv_std
line3 = hv_mean + 2*hv_std
# プロット
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True, gridspec_kw={'height_ratios': [3, 1]})
# ボリンジャーバンドのプロット
ax1.plot(df.index, df['Close'], label='終値', color='black')
ax1.plot(df.index, rolling_mean, label='20日移動平均', color='blue')
ax1.fill_between(df.index, upper_band, lower_band, color='gray', alpha=0.3)
for entry_point in entry_points:
ax1.scatter(entry_point[0], entry_point[1], color='red' if entry_point[2] == 'S' else 'green', s=50)
ax1.text(entry_point[0], entry_point[1], entry_point[2], ha='left' if entry_point[2] == 'S' else 'right', fontsize=10)
ax1.set_title('ボリンジャーバンド: %s' % name)
ax1.set_ylabel('価格')
ax1.legend()
ax1.grid(True)
# ヒストリカルボラタリティのプロット
ax2.plot(df.index, historical_volatility, label='ヒストリカルボラタリティ: %s' % name, color='black')
ax2.axhline(y=line1, color='blue', linestyle='--', label='平均ライン')
ax2.axhline(y=line2, color='green', linestyle='--', label='1*sigmaライン')
ax2.axhline(y=line3, color='red', linestyle='--', label='2*sigmaライン')
ax2.set_xlabel('日付')
ax2.set_ylabel('ボラタリティ(%)')
ax2.legend()
ax2.grid(True)
plt.tight_layout()
plt.show()
1.3. RSI#
RSI(Relative Strength Index)は、過去一定期間の上昇幅と下降幅の比率を計算し、0から100の範囲で示した指標です。70以上の値は「買われ過ぎ」を示し、30以下の値は「売られ過ぎ」を示します。RSIがいずれかの超過領域に入った場合、価格の反転が起こる可能性が高まるとされ、取引のタイミングを示す手がかりとして活用されます。
# predi_rsi_6227.py
#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import japanize_matplotlib
code = '6227'
name = 'AIメカテック'
data = pd.read_csv(f'{code}.T.csv')
# 'Date'列をdatetime64型に変換する
data['Date'] = pd.to_datetime(data['Date'])
# 'Date'列をindexに設定する
data.set_index('Date', inplace=True)
# 表示区間のdfを切り出す
df = data[(data.index >= datetime.datetime(2023,4,1)) & (data.index <= datetime.datetime(2024,1,31))]
# RSIの計算
window = 14
# 上昇幅と下落幅の計算
delta = df['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
# RSIの計算
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
# エントリーポイントの特定
entry_points = []
for i in range(len(df)):
if rsi.iloc[i] <= 30:
entry_points.append((df.index[i], df['Close'].iloc[i], 'B'))
elif rsi.iloc[i] >= 70:
entry_points.append((df.index[i], df['Close'].iloc[i], 'S'))
# プロット
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 9), gridspec_kw={'height_ratios': [3, 1]})
# 株価とエントリーポイントのプロット
ax1.plot(df.index, df['Close'], label='日次終値', color='black')
for entry_point in entry_points:
ax1.scatter(entry_point[0], entry_point[1], color='red' if entry_point[2] == 'S' else 'green', s=50)
ax1.text(entry_point[0], entry_point[1], entry_point[2], ha='left' if entry_point[2] == 'S' else 'right', fontsize=10)
ax1.set_title('株価とRSIによる取引タイミング: %s' % name)
ax1.set_ylabel('価格')
ax1.legend()
ax1.grid(True)
# RSIのプロット
ax2.plot(rsi.index, rsi, label='RSI', color='blue')
ax2.axhline(y=30, color='green', linestyle='--', label='RSI 売られ過ぎ')
ax2.axhline(y=70, color='red', linestyle='--', label='RSI 買われ過ぎ')
ax2.set_title('Relative Strength Index (RSI)')
ax2.set_xlabel('日付')
ax2.set_ylabel('RSI')
ax2.legend()
ax2.grid(True)
plt.tight_layout()
plt.show()
1.4. MACD#
シンプルな移動平均線は、一定のウィンドウ期間の価格の算術平均値を計算し、チャート上にプロットします。 これに対して、移動平均収束拡散(Moving Average Convergence Divergence,MACD)では、ウィンドウ期間のなかで観測日に近い日付のデータほど重みをつける「指数平滑移動平均」を利用します。MACDはテクニカル分析において広く使用される指標の一つであり、を売り買いの判断指標として使うために、以下のコードで書かれているように移動平均線の収束と拡散を示す2つの指数平滑移動平均線の差を計算します。 以下は指数平滑移動平均線の計算式です。
MACDは以下の3つの要素から構成されます。
MACD Line(MACD線)
MACD線は、短期間(一般的に12日間)の指数平滑移動平均線から長期間(一般的に26日間)の指数平滑移動平均線を引いたものです。つまり、MACD線 = 12日EMA - 26日EMA です。MACD線は、短期間の価格変動に対する感度が高く、急速な価格変化(大きなダイバージェンス)を反映します。
Signal Line(シグナル線)
シグナル線は、MACD線の9日間の指数平滑移動平均です。つまり、9日EMA(MACD) です。シグナル線は、MACD線の変化のスムージングを行います。MACDがシグナル線と乖離を評価することで売り買いの判断を行います。例えば乖離がマイナスからプラスへ転ずるポイントを買いタイミングとし、逆に乖離がプラスからマイナスへ転ずるポイントを売りタイミングとする方法が考えられます。これをうまく可視化するのが次のMACDヒストグラムです。
MACD Histogram(MACDヒストグラム)
MACDヒストグラムは、MACD線とシグナル線の差(MACDヒストグラム = MACD線 - シグナル線)として定義します。MACDヒストグラムは、MACD線がシグナル線を上回るとプラスの値を取り、MACD線がシグナル線を下回るとマイナスの値を取ります。
コード例のなかでこれら三種類のプロットを記述しています。チャート画像の下段が対応するプロットです。
MACDの使い方
トレンドの確認
MACD線とシグナル線の交差やMACDヒストグラムの動きを観察することで、トレンドの転換点や変化を検出します。 MACDヒストグラムは、ダイバージェンス縮小(MACD線とシグナル線の差が小さくなる)とダイバージェンス拡大(MACD線とシグナル線の差が大きくなる)の状態を示します。
オーバーボート/オーバーソールドの警告
MACD線やMACDヒストグラムの極端な値(大きなプラスまたはマイナス)は、相場が買われ過ぎまたは売られ過ぎ状態にあることを示す可能性があります。
ダイバージェンスの警告
ダイバージェンスは、価格とテクニカル指標の間での相対的な動きを観察することで検出されます。価格が上昇しているにもかかわらず、テクニカル指標が下降している(ダイバージェンス弱気)、または価格が下落しているにもかかわらず、テクニカル指標が上昇している(ダイバージェンス強気)場合、ダイバージェンスが生じていると言えます。これはトレンドの転換を示唆する重要なシグナルの一つです。
-
ダイバージェンス弱気(Bearish Divergence)
「ダイバージェンス弱気」は、価格が上昇している一方で、テクニカル指標(例えば、MACDヒストグラム)が下降する場合に発生します。これは上昇トレンドの弱さを示すサインと見なされます。価格が上昇しているにもかかわらず、買い手の力が衰えていることを示唆しています。このような状況では、価格が下落する可能性が高いと考えられます。保有株を売却する兆候と見ることができます。 -
ダイバージェンス強気(Bullish Divergence)
「ダイバージェンス強気」は、価格が下落している一方で、テクニカル指標が上昇している場合に発生します。これは下降トレンドの弱さを示すサインと見なされます。価格が下落しているにもかかわらず、買い手の力が強まっていることを示唆しています。このような状況では、価格が上昇する可能性が高いと考えられます。新たに株を購入すべき兆候と見ることができます。
取引タイミングの判断
MACDヒストグラムがマイナス→プラス、あるいはプラス→マイナス、という変化を検出して取引タイミングを判断する指標とします。 チャート画像の上段の垂直線が対応するダイバージェンスを示しています。
以下に第 1 章で紹介しましたAIメカテックに対するMACDの事例に対応するコードを以下に示します。
#
# predi_technical_macd_6227.py
#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import japanize_matplotlib
# csvファイルは第1章で説明したコード(pre_yfapi2.py)などを使って準備しておきます。
code = '6227'
name = 'AIメカテック'
data = pd.read_csv(f'{code}.T.csv')
# 'Date'列をdatetime64型に変換する
data['Date'] = pd.to_datetime(data['Date'])
# 'Date'列をindexに設定する
data.set_index('Date', inplace=True)
# 表示区間のdfを切り出す
df = data[(data.index >= datetime.datetime(2023,10,1)) & (data.index <= datetime.datetime(2024,1,31))]
# MACDを計算する
short_ema = df['Close'].ewm(span=12, adjust=False).mean()
long_ema = df['Close'].ewm(span=26, adjust=False).mean()
macd = short_ema - long_ema
signal_line = macd.ewm(span=9, adjust=False).mean()
macd_histogram = macd - signal_line
# axesを準備する
fig = plt.figure(figsize=(12, 8))
gs = fig.add_gridspec(2,1, height_ratios=[3, 1])
ax1 = fig.add_subplot(gs[0, 0]) #price data
ax2 = fig.add_subplot(gs[1, 0],sharex=ax1) #volume data
# hspaceを0にセットすることでax1とax2の隙間を無くする
plt.subplots_adjust(hspace=.0)
# axes1にプロット
plt1 = ax1.plot(df.index, df['Close'], label='日足終値', color='black')
plt2 = ax1.plot(df.index, short_ema, label='12日EMA', color='blue')
plt3 = ax1.plot(df.index, long_ema, label='26日EMA', color='red')
# トレンドの確認(MACDとシグナル線の乖離)
plt4 = ax1.fill_between(df.index, macd - signal_line, 0, where=(macd > signal_line), alpha=0.3, color='green', label='上昇トレンド')
plt5 = ax1.fill_between(df.index, macd - signal_line, 0, where=(macd < signal_line), alpha=0.3, color='red', label='下降トレンド')
# ダイバージェンス(ベアとブル)の検出(価格とMACDの逆行)
# 日足終値が上昇、MACDヒストグラムがプラスからマイナスへ転換 ー> ダイバージェンスベア発生
# 日足終値が下降、MACDヒストグラムがマイナスからプラスへ転換 ー> ダイバージェンスブル発生
divergence_bear_points = []
divergence_bull_points = []
for i in range(1, len(df)):
if (macd_histogram[i] * macd_histogram[i - 1] <= 0 and macd_histogram[i] <= macd_histogram[i - 1] ):
divergence_bear_points.append(df.index[i])
print(f"日付={df.index[i]} 弱気シグナル検出")
elif (macd_histogram[i] * macd_histogram[i - 1] <= 0 and macd_histogram[i] >= macd_histogram[i - 1]):
print(f"日付={df.index[i]} 強気シグナル検出")
divergence_bull_points.append(df.index[i])
for date in divergence_bear_points:
plt6 = ax1.axvline(x=date, color='purple', linestyle='-.', label='Divergence bear')
ax1.annotate(date.strftime('%Y-%m-%d'),
xy=(date, df.loc[df.index==date,:].values.flatten()[0]-2000),
xytext=(10, 10),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='purple'))
for date in divergence_bull_points:
plt7 = ax1.axvline(x=date, color='red', linestyle='-.', label='Divergence bull')
ax1.annotate(date.strftime('%Y-%m-%d'),
xy=(date, df.loc[df.index==date,:].values.flatten()[0]-2000),
xytext=(10, 10),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='red'))
#print("len df =",len(df))
memo1 = "3,905円で現物買い"
print("pos = ",df.index[25])
ax1.annotate(memo1, xy=(df.index[25], 3905), xytext=(df.index[22], 3905-700),
arrowprops=dict(arrowstyle="->"), color='b')
memo1 = "4,267円で売り"
print("pos = ",df.index[26])
ax1.annotate(memo1, xy=(df.index[26], 4267), xytext=(df.index[24], 3905+700),
arrowprops=dict(arrowstyle="->"), color='b')
ax1.legend([plt1[0],plt2[0],plt3[0],plt4,plt5,plt6,plt7],
['日足終値','12日EMA','26日EMA','上昇トレンド','下降トレンド','ダイバージェンス弱気','ダイバージェンス強気'],
loc=3)
ax1.set_ylabel('株価')
# タイトルを追加
fig.suptitle('{}({})のMACDを可視化'.format(name,code), fontsize=16)
# axes2にプロット
ax2.plot(df.index, macd, label='MACD', color='green')
ax2.plot(df.index, signal_line, label='シグナルライン', color='orange')
ax2.bar(df.index, macd_histogram, label='MACDヒストグラム', color='gray')
ax2.set_xlabel('日付')
ax2.set_ylabel('MACD')
ax2.legend(loc=2)
plt.show()
同じく第 1 章で取り上げたAIメカテックに対するMACDに基づく取引シミュレーションのコードを以下に示します。上記コードと比べて株価データを24年4月まで先に延ばしています。ダイバージェンス強気シグナル発生で100株購入、ダイバージェンス弱気シグナル発生、あるいは評価損が -5% を超えるときは全株売却を繰り返した結果を表示しています。
4月までの株価推移は以下のようになります。
取引シミュレーションのためのコードを示します。
# prde_tech_macd_6227_trade.py
# MACDダイバージェンスに従って売り買いした場合の成績シミュレーション
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import japanize_matplotlib
code = '6227'
name = 'AIメカテック'
code = code = '6227'
name = 'AIメカテック'
# CSVを読み込みデータフレームを返す
df = pd.read_csv(f'{code}.T.csv')
# 'Date'列をdatetime64型に変換する
df['Date'] = pd.to_datetime(df['Date'])
# 'Date'列をindexに設定する
df.set_index('Date', inplace=True)
# 表示区間のdfを切り出す
df = df[(df.index >= datetime.datetime(2023,10,1)) & (df.index <= datetime.datetime(2024,4,8))]
# MACDを計算する
short_ema = df['Close'].ewm(span=12, adjust=False).mean()
long_ema = df['Close'].ewm(span=26, adjust=False).mean()
macd = short_ema - long_ema
signal_line = macd.ewm(span=9, adjust=False).mean()
macd_histogram = macd - signal_line
# ダイバージェンス(ベアとブル)の検出(価格とMACDの逆行)
divergence_bear_points = [] # ダイバージェンスベア検出日記録
divergence_bull_points = [] # ダイバージェンスブル検出日記録
owned_stock = 0 # 保有株数
acc_profit = 0 # 累積利益
masp = 0 # 平均取得単価
history_profit = [] # 累積利益推移
for i in range(1, len(df)):
if df.index[i] < datetime.datetime(2024,1,1):
continue
if (macd_histogram[i] * macd_histogram[i - 1] <= 0 and macd_histogram[i] <= macd_histogram[i - 1]):
divergence_bear_points.append(df.index[i])
print(f"日付={df.index[i]} 弱気シグナル検出")
if owned_stock != 0 :
# 全株売却。累積利益計算
print(f"日付={df.index[i]} 弱気シグナル検出のため全数売却。取引損益 {owned_stock*(df['Close'][i] - masp)}")
acc_profit += (df['Close'][i] - masp)*owned_stock
owned_stock = 0
history_profit.append({"date":df.index[i],"acc_profit":acc_profit,"sign":"売却サイン"})
else:
# 保有株無しのため何もしない
print(f"日付={df.index[i]} 保有株無しのため何もしない")
elif (macd_histogram[i] * macd_histogram[i - 1] <= 0 and macd_histogram[i] >= macd_histogram[i - 1]):
divergence_bull_points.append(df.index[i])
# 100株購入。平均取得価格更新
masp = (masp*owned_stock + df['Close'][i] * 100) / (owned_stock + 100)
owned_stock += 100
print(f"日付={df.index[i]} 強気シグナル検出のため購入。保有株数 {owned_stock}。 平均取得価格 {masp}")
# ロスカットルールを入れたいときは以下のコメント化をはずす。
# 強気・弱気に関わらず平均取得価格を5%下回る株価のときは強制売却
#if owned_stock != 0 and ((df['Close'][i] - masp))/masp <= -0.05:
# acc_profit += (df['Close'][i] - masp)*owned_stock
# history_profit.append({"date":df.index[i],"acc_profit":acc_profit,"sign":"ロスカットサイン"})
# owned_stock = 0
# print(f"日付={df.index[i]} 評価損5%超のため全株強制売却")
# 成績表示
print("売却回数=",len(history_profit))
for rec in history_profit:
print(f'日付= {rec["date"]} 累積利益= {rec["acc_profit"]} サイン= {rec["sign"]}')
シミュレーション結果は以下の通りで損失が出たまま終了となります。AIメカテックの株価は24年1月ころをピークとして大きく株価を下げています。1月までを期限としてシミュレーションした場合は利益が出るのですが、この結果が示すように株価の下降局面では良い結果になりません。残念ですがMACDの使い方を知る役には立つのではないかと思います。
1.5. 一目均衡表#
一目均衡表は、1930年代から1960年代にかけて細田悟一を中心とする人たちが整備した日本発のテクニカル分析手法です。細田は長年にわたり日本の米市場のデータを収集・分析した結果、単一の指標では市場の全体像を捉えるのに不十分であるという結論に達しました。
その研究結果をもとに、複数のラインを組み合わせて市場のバランスを示す一目均衡表が開発されました。これは現在広く世界で活用される最も人気のあるテクニカル分析手法のひとつといわれています。
一目均衡表は5つの主要なラインから構成されます。それぞれのラインは、特定の期間の最高値(日足高値の最大値)と最安値(日足安値の最小値)、日足終値を使用して計算されます。視覚的に市場のトレンドを表現することで市場のトレンド、上下抵抗線、モメンタムを一目で(「一目」)把握できるようになっています。 それぞれのラインの定義と意味は以下の通りです。
- 転換線 (Tenkan-sen)
過去9日間の最高値(High9D)と最安値(Low9D)の平均値
短期的な価格の動向を示します。短期間のサポートライン(下値抵抗線)やレジスタンスライン(上値抵抗線)として機能します。
- 基準線 (Kijun-sen)
過去26日間の最高値(High26D)と最安値(Low26D)の平均値
中期的な価格の動向を示します。基準線は、価格がこのラインより上にある場合は上昇トレンド、下にある場合は下降トレンドを示唆します。
- 先行スパン1 (Senkou-Span-1)
転換線と基準線の平均値を26日間先にシフトしたもの。d日先へ値をシフトする関数をと書くことにすると、
一目均衡表の雲の一部を形成します。市場のバランスやサポート・レジスタンスのゾーンを示します。
- 先行スパン2 (Senkou-Span-2) 過去52日間の最高値(High52D)と最安値(Low52D)の平均値を26日間先にシフトしたもの
先行スパン1と先行スパン2で挟まれた領域を薄緑色(スパン1 > スパン2の場合)あるいは薄赤色(スパン1 < スパン2の場合)で塗りつぶした雲として描画します。先行スパン2は、より長期の市場の動向を示します。
- 遅行スパン (Chikou-Span)
現在の終値(Close)を26日間前にシフトしたもの
市場のモメンタムを示します。遅行スパンが価格の上にある場合は上昇モメンタム、下にある場合は下降モメンタムを示唆します。
一目均衡表の読み方
一目均衡表はこれら5つのラインを組み合わせて、価格のトレンド、モメンタム、サポート・レジスタンスレベルを視覚的に分析するツールです。各ラインが交差するポイントや、価格が雲の上下にあるかどうかで、売買シグナルを判断します。
- 転換線と基準線の交差
転換線が基準線よりも上にあれば上昇相場、下にあれば下降相場にあることを示唆します。
- ローソク足と雲の位置関係
先行スパン1と2に挟まれた雲はローソク足に対するサポートラインあるいはレジスタンスラインとして機能します。つまりローソク足が雲よりも上に位置する時は上昇相場、逆にローソク足が雲よりも下に位置する時は下降相場を示唆します。ローソク足が雲を突き抜ける時トレンドが転換したこと示唆します。
- 遅行スパン
遅行スパンがローソク足を下からへ上へ抜くタイミングは買いサインを示唆します。逆に、遅行スパンがローソク足を上から下へ抜くタイミングは売りサインを示唆します。
上記の3つの条件が揃って上昇相場を示唆する場合を三役好転とよび強い買いシグナルが発生していると判断します。そして上記の3つの条件が揃って下降相場を示唆する場合を三役逆転とよび強い売りシグナルが発生していると判断します。
以下は銘柄例(AIメカテック)の一目均衡表を作成し売買シグナルを検出するコードサンプルです。
#
# predi_technical_ichimoku.py
#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import japanize_matplotlib
import mplfinance as mpf
import matplotlib.dates as mdates
from mplfinance.original_flavor import candlestick_ohlc
def ichimoku_cloud(data):
# High, Low, Closeのデータを使用
high_prices = data['High']
low_prices = data['Low']
close_prices = data['Close']
# 転換線(9日間の高値と安値の平均)
high9d = high_prices.rolling(window=9).max()
low9d = low_prices.rolling(window=9).min()
data['Tenkan-sen'] = (high9d + low9d) / 2
# 基準線(26日間の高値と安値の平均)
high26d = high_prices.rolling(window=26).max()
low26d = low_prices.rolling(window=26).min()
data['Kijun-sen'] = (high26d + low26d) / 2
# 先行スパン1(転換線と基準線の平均を26日先行)
data['Senkou-Span-1'] = ((data['Tenkan-sen'] + data['Kijun-sen']) / 2).shift(26)
# 先行スパン2(52日間の高値と安値の平均を26日先行)
high52d = high_prices.rolling(window=52).max()
low52d = low_prices.rolling(window=52).min()
data['Senkou-Span-2'] = ((high52d + low52d) / 2).shift(26)
# 遅行スパン(終値を26日遅行)
data['Chikou-Span'] = close_prices.shift(-26)
return data
def identify_signals(data):
data['Buy Signal'] = (
(data['Tenkan-sen'] > data['Kijun-sen']) &
(data['Tenkan-sen'].shift(1) <= data['Kijun-sen'].shift(1)) &
(data['Chikou-Span'] > data['Close']) &
(data['Close'] > data[['Senkou-Span-1', 'Senkou-Span-2']].max(axis=1))
)
data['Sell Signal'] = (
(data['Tenkan-sen'] < data['Kijun-sen']) &
(data['Tenkan-sen'].shift(1) >= data['Kijun-sen'].shift(1)) &
(data['Chikou-Span'] < data['Close']) &
(data['Close'] < data[['Senkou-Span-1', 'Senkou-Span-2']].min(axis=1))
)
return data
code = '6227'
name = 'AIメカテック'
data = pd.read_csv(f'{code}.T.csv')
# 'Date'列をdatetime64型に変換する
data['Date'] = pd.to_datetime(data['Date'])
# 'Date'列をindexに設定する
data.set_index('Date', inplace=True)
# 表示区間のdfを切り出す
data = data[(data.index >= datetime.datetime(2023,5,1)) & (data.index <= datetime.datetime(2024,5,31))]
# ローソク足データの準備
ohlc = data[['Open', 'High', 'Low', 'Close']].reset_index()
ohlc['Date'] = ohlc['Date'].map(mdates.date2num)
# 一目均衡表の計算
ichimoku_data = ichimoku_cloud(data)
# シグナルの判定
ichimoku_data = identify_signals(ichimoku_data)
# プロット
fig, ax = plt.subplots(figsize=(14, 7))
ax.plot(data.index, ichimoku_data['Tenkan-sen'], label='転換線', linestyle='--')
ax.plot(data.index, ichimoku_data['Kijun-sen'], label='基準線', linestyle='--')
ax.plot(data.index, ichimoku_data['Senkou-Span-1'], label='先行スパン1')
ax.plot(data.index, ichimoku_data['Senkou-Span-2'], label='先行スパン2')
ax.fill_between(data.index, ichimoku_data['Senkou-Span-1'], ichimoku_data['Senkou-Span-2'], where=ichimoku_data['Senkou-Span-1'] >= ichimoku_data['Senkou-Span-2'], facecolor='lightgreen', interpolate=True, alpha=0.5)
ax.fill_between(data.index, ichimoku_data['Senkou-Span-1'], ichimoku_data['Senkou-Span-2'], where=ichimoku_data['Senkou-Span-1'] < ichimoku_data['Senkou-Span-2'], facecolor='lightcoral', interpolate=True, alpha=0.5)
ax.plot(data.index, ichimoku_data['Chikou-Span'], label='遅行スパン', linestyle='--')
#ax.plot(data.index, data['Close'], label='Close')
candlestick_ohlc(ax, ohlc.values, width=0.6, colorup='g', colordown='r', alpha=0.8)
# シグナルのプロットと日付の描画
buy_signals = ichimoku_data[ichimoku_data['Buy Signal']]
sell_signals = ichimoku_data[ichimoku_data['Sell Signal']]
ax.plot(buy_signals.index, data['Close'][buy_signals.index], '^', markersize=10, color='g', lw=0, label='強い買いシグナル')
ax.plot(sell_signals.index, data['Close'][sell_signals.index], 'v', markersize=10, color='r', lw=0, label='強い売りシグナル')
# 日付の描画
for idx in buy_signals.index:
ax.text(idx, data['Close'][idx] + 2, idx.strftime('%Y/%m/%d'), color='green', ha='center')
for idx in sell_signals.index:
ax.text(idx, data['Close'][idx] - 2, idx.strftime('%Y/%m/%d'), color='red', ha='center')
ax.legend(loc='best')
ax.set_title('一目均衡表 : %s(%s)' % (name,code))
plt.show()
上記チャートを見ると、強い買いシグナル(緑色の▲)が2023年3月後半と10月前半に発生し、強い売りシグナル(赤色の▲)が2024年3月中旬に発生していることがわかります。
2. 非テクニカルな指標#
本稿は数理的手法の解説に焦点を当てていますが、実際に株取引を経験してきた感触を率直に言いますと、テクニカル的な手法を活用する前に、本章冒頭「株価予測の難しさ」であげたような指標、イベント、事件を常にウォッチしてマーケットを眺める姿勢が重要ではないかと考えています。例えば決算発表や、経済指標は発表時期が決まっていますので事前に市場予想やアナリストの分析をチェックすることで、丁半博打よりは分の良い(損を出さない)取引が見込めると思います。
2.1. マーケット指数#
1. 米国マーケット指数#
米国の主要な株式、債券、為替指数は日本のマーケット指数に対しても非常に大きな影響力を与えるため常に注視したい対象です。
- ダウ・ジョーンズ工業株平均 (Dow Jones Industrial Average, DJIA)
| 項目 | 説明 |
|---|---|
| 定義 | アメリカの様々な業種の代表的な銘柄30企業の株価を平均した指数です。 |
| 評価 | 株価の加重平均を用いるため、構成する主要企業の動向に大きく影響されます。 |
- S&P 500 (Standard & Poor's 500 Index)
| 項目 | 説明 |
|---|---|
| 定義 | 米国を代表する時価総額158億米ドル以上の約500社で構成され、構成企業の株価を時価総額加重平均で算出した指数です。 |
| 評価 | ダウ平均と比べ広範な市場をカバーしており、アメリカの株式市場全体のパフォーマンスを把握できます。 |
- ナスダック総合指数 (Nasdaq Composite Index)
| 項目 | 説明 |
|---|---|
| 定義 | ナスダック総合指数は、NASDAQ市場に上場する全銘柄の株価を基に算出される指数です。 |
| 評価 | テクノロジー分野の企業が多いため、技術革新や新興企業のパフォーマンスを評価するために利用されます。 |
- ラッセル2000 (Russell 2000 Index)
| 項目 | 説明 |
|---|---|
| 定義 | ラッセル2000は、小型株2000銘柄のパフォーマンスを追跡する指数です。 |
| 評価 | 小型株の動向を示し、新興企業や成長企業のパフォーマンスを評価するために利用されます。 |
- フィラデルフィア半導体指数 (Philadelphia Semiconductor Index, SOX)
| 項目 | 説明 |
|---|---|
| 定義 | SOX指数は、フィラデルフィア証券取引所によって算出される、半導体産業に関連する企業の株価指数です。1993年に設立され、アメリカの主要な半導体企業のパフォーマンスを追跡します。 |
| 評価 | 30の半導体関連企業で構成され、時価総額加重平均で算出されます。この指数は半導体産業全体の健全性を評価するために利用され、特に技術株投資家にとって重要な指標です。 |
- 米国10年国債利回り (U.S. 10-Year Treasury Yield)
| 項目 | 説明 |
|---|---|
| 定義 | 米国財務省が発行する10年満期の国債の利回り |
| 評価 | 代表的な長期金利指標です。景気の拡大・後退、主要株価指標の上昇・下降に対して直接的な影響を与えるため、その変動が注視される重要指数です。セントルイス FRB サイト(DGS10)。 |
- 米国2年国債利回り (U.S. 2-Year Treasury Yield)
| 項目 | 説明 |
|---|---|
| 定義 | 米国財務省が発行する2年満期の国債の利回り |
| 評価 | 短期金利動向を反映し、連邦準備制度理事会(FRB)の政策金利予想に影響を与えます。セントルイス FRB サイト(DGS2)。 |
- USD/JPY (米ドル/日本円)
| 項目 | 説明 |
|---|---|
| 定義 | 米ドルと日本円の為替レートを示す指標です。 |
| 評価 | 日米の金利差や経済政策、貿易動向などの影響を受け、為替相場の主要指標として利用されます。 |
2. 日本マーケット指数#
日本の主要なマーケット指数について、その定義と評価方法を以下にリストアップします。
- 日経平均株価 (Nikkei 225)
| 項目 | 説明 | | :--- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | | 定義 | 日経平均株価は、東京証券取引所一部上場の代表的な225銘柄の株価を平均した指数です。価格加重平均型の株価指数で、日経新聞社が算出・公表しています。 | | 評価 | 投資信託や先物取引などの商品にも利用されているため個人投資家にとって最も重要な指標であると思われます。採用銘柄の株価を単純平均しているため、株価が高い銘柄の影響を受けやすいと言われています。 | |
- TOPIX (東証株価指数)
| 項目 | 説明 |
|---|---|
| 定義 | 東証株価指数は、東京証券取引所一部に上場しているすべての銘柄を対象とする時価総額加重平均型の株価指数です。 |
| 評価 | 指数の定義方法から時価総額の大きい銘柄の影響を受けやすいと言われています。日経平均株価と比べより広範な株を含むため、株式市場全体のパフォーマンスを評価する際に有用です。 |
2.2. 米国の経済金融指数:#
米国の経済金融指標のなかには、その変動が米国のみならず日本政府の政策判断や株式相場にもインパクトを与えるものがいくつかあります。
1. 経済成長関連指数#
- GDP (Gross Domestic Product)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省経済分析局 (BEA) |
| 更新 | 四半期ごと(4E,7E,10E,1E) |
| 評価 | 内訳は、個人消費、設備投資、住宅投資、在庫投資、政府支出、純輸出などです。近年では個人消費(2023年 約68%)と設備投資(2023年 約14%)が大きな比重を占めていることが大きな特徴です。 |
- ISM製造業景況感指数 (ISM Manufacturing Index)
| 項目 | 説明 |
|---|---|
| 定義 | 供給管理協会 (ISM) |
| 更新 | 毎月第1営業日(製造業)、毎月第3営業日(サービス)、毎月第3営業日(病院) |
| 評価 | 購買担当者景気指数(PMI)を製造業、サービス、病院部門の三種類で公開しています。米国の景気先行指標として重要視される指数です。指数はパーセントで表され、50%を上回ると景気拡大、50%を下回ると景気後退と解釈されます。日本では日銀短観の業況判断DIが類似する指数です。 |
2. 雇用関連指標#
物価と雇用の安定化は中央銀行の2大ミッションです。その時々の数値によって、両にらみで対処するか、どちらかに比重をかけて対処する傾向が見られます。例えば、米国では2024年に入り消費者物価指数(CPI)は徐々に低下しています。FRBの注視の対象は夏頃より雇用に傾いているのではないかとコメントが経済誌やアナリストから聞かれるようになっています。
- 非農業部門雇用者数 (Nonfarm Payrolls)
| 項目 | 説明 |
|---|---|
| 定義 | 労働省 (BLS),セントルイスFRB(FRED) |
| 更新 | 毎月第1金曜日 |
| 評価 |
- 失業率 (Unemployment Rate)
| 項目 | 説明 |
|---|---|
| 定義 | 労働省 (BLS),セントルイスFRB(FRED) |
| 更新 | 毎月第1金曜日(非農業部門雇用者数と同時) |
| 評価 |
- 新規失業保険申請件数 (Initial Jobless Claims)
| 項目 | 説明 |
|---|---|
| 定義 | 労働省 (BLS),セントルイスFRB(FRED) |
| 更新 | 毎週木曜日 |
| 評価 | 景気を測る先行指標として利用されています。数値が予想より高い(低い)→ドル売り(買い)材料 |
- 雇用コスト指数 (Employment Cost Index)
| 項目 | 説明 |
|---|---|
| 定義 | 労働省 (BLS) |
| 更新 | 四半期ごと(4E,7E,10E,1E) |
| 評価 |
- 求人件数 (Job Openings and Labor Turnover Survey,JOLTS)
| 項目 | 説明 |
|---|---|
| 定義 | 労働省 (BLS) |
| 更新 | 毎月上旬 |
| 評価 |
3. 消費関連指標#
- 個人消費支出 (PCE: Personal Consumption Expenditures)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省経済分析局 (BEA) |
| 更新 | 毎月末 |
| 評価 | PCE、食品とエネルギー支出を除外したコアPCE 、サービス支出は連邦準備制度理事会 (FRB)がインフレ監視の指標として注視しています。このためによく参照される指標が PCEデフレーター = (実質PCE/名目PCE)×100 です。セントルイス FRB サイト(PCE)。 |
- 小売売上高 (Retail Sales)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月中旬 |
| 評価 | 小売売上高は大部分、財の購入を反映しており、消費支出全体から見ればその割合は比較的小さい |
- ミシガン大学消費者信頼感指数 (University of Michigan Consumer Sentiment Index)
| 項目 | 説明 |
|---|---|
| 定義 | ミシガン大学 |
| 更新 | 毎月2回(予備報告と最終報告) |
| 評価 | 予想より強い(弱い)→ 経済好調(不調) |
4. インフレ関連指標#
- 消費者物価指数 (CPI: Consumer Price Index)
| 項目 | 説明 |
|---|---|
| 定義 | 消費者物価指数 (CPI) は、都市部の消費者が消費財とサービスに対して支払う価格の経時的な平均変化を測定するものです。米国労働省労働統計局 (U.S. Bureau of Labor Statistics) |
| 更新 | 毎月中旬 |
| 評価 | 景気を測る重要指標とされています。 |
- 生産者物価指数 (PPI: Producer Price Index)
| 項目 | 説明 |
|---|---|
| 定義 | 生産者物価指数 (PPI)は、国内生産者が生産物に対して受け取る販売価格の経時的な平均変化を測定します。米国労働省労働統計局 (U.S. Bureau of Labor Statistics) |
| 更新 | 毎月中旬 |
| 評価 | 景気を測る重要指標指標とされています。 |
5. 金融政策関連指標#
- フェデラルファンド金利 (Federal Funds Rate)
| 項目 | 説明 |
|---|---|
| 定義 | 連邦準備制度理事会 (FRB) |
| 更新 | 連邦公開市場委員会(FOMC)会合後(年8回程度) |
| 評価 | 米国の銀行間の短期貸出金利を指す米国の経済金融における重要指数です。日本においては日本銀行(日銀)が決定する政策金利のうち、無担保コールレート(オーバーナイト物)がこれに対応する指数です。 |
6. 住宅関連指標#
- 新築住宅販売件数 (New Home Sales)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月末 |
| 評価 |
- 中古住宅販売件数 (Existing Home Sales)
| 項目 | 説明 |
|---|---|
| 定義 | |
| 更新 | 毎月中旬 |
| 評価 | 全米不動産業者協会 (NAR) |
- 住宅着工件数 (Housing Starts)
| 項目 | 説明 |
|---|---|
| 定義 | |
| 更新 | 毎月中旬 |
| 評価 | 商務省国勢調査局 (Census Bureau) |
- 住宅建設許可件数 (Building Permits)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月中旬(住宅着工件数と同時) |
| 評価 |
7. その他の重要指標#
- 貿易収支 (Trade Balance)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月第1週 |
| 評価 |
- 企業在庫 (Business Inventories)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月中旬 |
| 評価 |
- 耐久財受注 (Durable Goods Orders)
| 項目 | 説明 |
|---|---|
| 定義 | 商務省国勢調査局 (Census Bureau) |
| 更新 | 毎月末 |
| 評価 |
8. コンセンサス#
米国では、Bloomberg、Refinitiv、FactSetなどの市場データプロバイダーは、定期的に発表される金融・経済指標、企業業績に対する各アナリストの予想を集計し、平均値や中央値を算出します。これをマーケットコンセンサスと呼びます。日本では金融情報サービス会社のQUICKが算出する「QUICKコンセンサス」があります。最新指標値や業績発表値がマーケットコンセンサスとギャップが生じた株価が大きく上下動する事象が頻繁に発生します。これは指標ではありませんが株価の騰落を招くショック要因として非常に重要視されています。
2.3. ファンダメンタル情報#
個別企業の株価に影響を与える業績指標や財務指標をリストアップします。市場予想が衆知になっているものはそれと決算発表値のギャップが売り買いの趨勢に影響を与えます。従って好業績のように見えても市場予想よりも下回ったものであれば大きく株価を下げることが普通に発生します。
1. 業績指標#
- 売上高 (Revenue/Sales)
| 項目 | 説明 |
|---|---|
| 定義 | 企業が商品やサービスの販売で得た総収入 |
| 評価 | 増加傾向が好ましい。前年同期比や市場予想と比較して評価 |
- 営業利益 (Operating Profit)
| 項目 | 説明 |
|---|---|
| 定義 | 企業の本業による利益。売上総利益から営業費用を差し引いたもの。 |
| 評価 | 増加傾向が好ましい。営業利益率(営業利益/売上高)が高いほど効率的な経営を示す。 |
- 純利益 (Net Income)
| 項目 | 説明 |
|---|---|
| 定義 | 最終的な利益。すべての費用や税金を差し引いた後の利益。 |
| 評価 | 増加傾向が好ましい。市場予想と比較して評価。 |
- 一株当たり利益 (EPS: Earnings Per Share)
| 項目 | 説明 |
|---|---|
| 定義 | 純利益を発行済み株式数で割ったもの。 |
| 評価 | 高いほど株主に対する利益還元が大きい。前年同期比や市場予想と比較して評価。 |
2. 財務指標#
- 株主資本利益率 (ROE: Return on Equity)
| 項目 | 説明 |
|---|---|
| 定義 | 株主の資本に対する純利益の割合。 |
| 評価 | ROE(自己資本利益率)の定義は「当期純利益÷自己資本×100」です。投入された資本に対し企業が計上した利益を表す数字であるため、ROEが高いほど、経営効率の高い会社と評価されます。国内企業のROEは最近徐々に向上しており24年3月には9.7%となっています。しかしながら米国企業のROEは製造業で、15%前後を維持しており、投資家が日本企業の価値を厳しく評価するひとつの論拠となっています。 |
- 総資産利益率 (ROA: Return on Assets)
| 項目 | 説明 |
|---|---|
| 定義 | 企業の総資産に対する純利益の割合。 |
| 評価 | 一般に5%以上が優良とされる。高いほど資産を有効に活用していることを示す。 |
- 売上総利益率 (Gross Profit Margin)
| 項目 | 説明 |
|---|---|
| 定義 | 売上高に対する売上総利益の割合。 |
| 評価 | 高いほど製品やサービスの付加価値が高いことを示す。業種によるが、20%以上が目安。 |
- 営業利益率 (Operating Margin)
| 項目 | 説明 |
|---|---|
| 定義 | 売上高に対する営業利益の割合。 |
| 評価 | 一般に10%以上が優良とされる。高いほど効率的な経営を示す。 |
- 流動比率 (Current Ratio)
| 項目 | 説明 |
|---|---|
| 定義 | 流動資産を流動負債で割ったもの。 |
| 評価 | 一般に1.5以上が健全とされる。2以上であればなお良い。 |
- 自己資本比率 (Equity Ratio)
| 項目 | 説明 |
|---|---|
| 定義 | 総資産に対する自己資本の割合。 |
| 評価 | 40%以上が目安。高いほど財務的に安定しているとされる。 |
- 価格収益率 (PER: Price-Earnings Ratio)
| 項目 | 説明 |
|---|---|
| 定義 | 株価をEPSで割ったもの。 |
| 評価 | 業種によるが、15〜25が一般的な範囲。低すぎると割安、高すぎると割高とされる。 |
- 価格純資産倍率 (PBR: Price-to-Book Ratio)
| 項目 | 説明 |
|---|---|
| 定義 | 株価を一株当たり純資産で割ったもの。 |
| 評価 | 1倍が基準。1倍以下は割安、1倍以上は割高とされることが多い。海外投資家はPBRを重視すると言われています。東証が上場企業に対してPBR改善要請を出した経緯もあり、企業のPBR向上への取り組みが厳しくチェックされるようになっています。 |
- 配当利回り (Dividend Yield)
| 項目 | 説明 |
|---|---|
| 定義 | 配当金を株価で割ったもの。 |
| 評価 | 一般に3%以上が高配当とされる。安定した配当を続けている企業が好まれる。 |
3. キャッシュフロー指標#
- 営業キャッシュフロー (Operating Cash Flow)
| 項目 | 説明 |
|---|---|
| 定義 | 企業の営業活動による現金収支。 |
| 評価 | プラスであることが望ましい。増加傾向にあると健全とされる。 |
- フリーキャッシュフロー (Free Cash Flow)
| 項目 | 説明 |
|---|---|
| 定義 | 営業キャッシュフローから設備投資を差し引いたもの。 |
| 評価 | プラスであることが望ましい。企業の成長余力や株主還元能力を示す。 |
2.4. 株式・債券・金の関係#
投資家は保有する資産価値を常に極大化するための行動をとります。例えば株式を保有する企業の業績指標がそこそこ好調だとしても、金への投資がより魅力があれば資金を金保有へ移します。そのように志向する投資家が多ければその結果、好業績企業の株価が案に相違して下落へ向かう、といった事象が発生するわけです。 金(ゴールド)の価格、債券相場、株式市場はそれぞれが異なる経済状況や投資家心理に応じて相互に影響を及ぼし合います。現実の動きは必ずしもセオリー通りにはならないとは思いますが、一般論としてそれぞれの関係性をまとめておきます。
金と債券相場の関係
金と債券の関係は一般的に逆相関にあります。
【安全資産としての役割】
- 金は「安全資産」として認識されています。経済不安や市場の混乱があるとき、投資家はリスク回避のために金を購入する傾向があります。このような状況では、債券の価格も上昇することが多くなりますが、特に米国債(Treasuries)の価格が上昇します。
- しかし、金利が低い時期には、債券の魅力が減少し、投資家は金に資金を移すことがあり、これが金価格の上昇につながります。
【インフレ対策】
- 債券の利回り(特に名目利回り)が上昇すると、金価格は下落する傾向があります。なぜなら、高い利回りが投資家にとってより魅力的となり、金から資金が流出するためです。
- 反対に、インフレが高まると、金は価値保存の手段として需要が増えるため、価格が上昇することがあります。一方、インフレ上昇期待が高まると、債券の価格は下落する傾向にあります(利回りが上昇)。
金と株式相場の関係
金と株式市場の関係はしばしば逆相関にあります。
【リスク回避とリスクオンの動き】
- 株式市場が不安定な時期や下落する時期には、投資家はリスク回避のために金を購入することがあります。これにより、金価格は上昇します。
- 株式市場が好調でリスクオンの動きが強まると、投資家はリスク資産である株式に資金を移し、金の需要が減少し、価格が下落する傾向があります。
【金利とインフレの影響】
- 低金利環境では、株式市場は資金調達コストが低くなるため、企業収益が向上し、株価が上昇しやすくなります。一方、金は保有していても利息を生まないため、低金利環境では相対的に金の魅力が増し、価格が上昇することがあります。
- 高インフレ環境では、金はインフレヘッジとしての役割を果たし、価格が上昇します。同時に、インフレが企業収益を圧迫し、株価が下落することもあります。
債券と株式相場の関係
債券相場と株式市場の関係は複雑で、相関は状況により異なることがあります。
【金利の影響】
- 債券の利回りが上昇すると(債券価格の下落)、株式市場にはマイナスの影響があります。高い利回りは企業の借入コストを増加させ、企業収益を圧迫し、株価を下落させる可能性があります。
- 逆に、債券利回りが低下すると(債券価格の上昇)、株式市場にはプラスの影響があります。低金利は企業の借入コストを減少させ、投資や拡大のための資金調達を促進し、株価を上昇させることがあります。
【投資家のリスク許容度】
- 投資家のリスク許容度が高まると、投資家は株式に資金を移し、債券から資金を引き上げることがあります。これにより、債券価格が下落し、利回りが上昇する可能性があります。
- 反対に、投資家のリスク許容度が低下すると、投資家は安全資産である債券に資金を移し、株式から資金を引き上げます。これにより、債券価格が上昇し、利回りが低下することがあります。
3. 実践と気づき#
個人の投資スタイルは、おおざっぱに言って「長期保有指向」と「短期利益指向」に分けることができます。有名な世界的な投資家のウォーレンバフェット氏は、個人が投資を行うのであれば、「S&P500に連動する低コストのインデックスファンドを長期保有する」という非常にシンプルな方針を勧めています。これは分類でいえば前者のスタイルです。筆者はといえば、後者のスタイルで投資活動を行っています。これは好みの問題でそうしているとしか言いようがありません。このため以下の気づきはもっぱら短期的な投資スタイルを指向する人を意識しています。なおかつ実質1年ちょっとの経験知による所感であることは頭に入れていただければと思います。
【押し目買いを狙ったのに下がり続けて困った】
株価が上昇トレンドにある相場において、一時的に株価が下がったときに買い注文をすることを俗に「押し目買い」と呼びます。筆者は移動平均線を見て押し目買いにトライすることがよくあります。2023年は成功することが多く、2024年は失敗が多かったように思います。結局「今株価が上昇傾向にあるのか」という判断の成否がポイントであるように思われます。しかし、それをトレンドの早期に見極めることは容易ではありません。2023年の1年間は日経平均が一年を通じて急上昇していたため適当な見極めでも失敗しませんでした。ところが2024年も中盤以降全体市場はボックス圏をうろついておりトレンドの見極めは難しくなっているように見えます。
【信用取引きの追証におびえた】
短期利益指向で投資を行う場合、保証金の3倍強のレバレッジを利かせることができる信用取引は非常に有難い仕組みです。半面信用取引は支払い金利が取引完了時に発生しますので、長期間信用銘柄を保有するとばかにならないコストになり注意が必要です。そして特に怖いのは、期限内に大きな評価損が発生すると潤沢な口座残高を保持していなければ、「追証」と呼ばれる追加の保証金を口座に入れる事態が発生することです。最近の例でいえば2024年8月の日経平均大暴落により、信用取引で巨額の追証が発生して生活が破綻した有名人がいました。危険なレベルの評価損が発生する前に取引をクローズさせる決断力は非常に重要であると感じます。
【高値掴みの恐ろしさ】
今のところで筆者の手痛い失敗は、値がさの半導体株の高値掴みです。市場では24年春先からアナリストによる警戒サインがいくつも出ていたにも関わらず、半導体株の熱狂の波に飲み込まれてしまいました。AIをはじめとする先端半導体への需要は政治的な懸念要因はありますがAI技術の重要性は変わらず今後とも成長を続けるとは思います。しかしながら株価に関して特に日本の半導体メーカの株価が再浮上できるのかどうかについては不安を感じています。高値掴みの問題は、注目した銘柄が今、高値(天井)なのかそうでないのか、なかなか判断がつかないことです。 3月中旬に日経平均が高値を付けた後、7月初旬に再び高値をつけたタイミングで「2番天井の可能性がある」という識者の指摘が日経新聞に掲載されていました。そして実際その通りになりました。筆者が失敗した銘柄の過去の値動きを見てみると、やはり2番天井(ダブルトップ)と見える状態が発生していて、まさに2番目のトップのところで買いを入れてしまったのです。こういう経験もあり、今のところ便宜的ではありますがこの「2番天井になりそう」という識者の意見が現れたときは警戒しようと考えています。
【決算発表はネガティブショック要因?】
業績が好調に見えても決算発表の後株価が急落するケースはよくあります。数字を拾っておけばよかったと思いますが、感覚的には決算発表は東証上場銘柄については下落ショック要因になることが多いように感じています。これは本章 2 節 2 項の 8 で述べたマーケットコンセンサスを下回る業績のときに顕著な事象です。すごい成長を続けているNVIDIAですら、マーケットコンセンサスを上回る2024年8〜10月期業績であったにもかかわらず、決算発表後株価は一時急落しました。これは業績を嫌気する要素を見いだした一部の相場関係者の声が下落につながったと言われています。 多くの日本企業はファンダメンタルの弱さを抱えているという海外投資家の声を見かけます。そのような企業から満点ではない業績発表が出たとしましょう。すると、「誰かがこれを嫌気材料と判断する可能性があるから、自分もリスクを見て売り材料と考えることにしよう」が雪崩現象になって株価急落につながることは十分ありそうな展開と思えます。
【指標発表前に株価は下がりやすい】
上記と関連していますが、月次で最新値が発表される米国の主要金融・経済指標が近づくと、株価は下がる傾向があります。これは特に不思議な理由ではなく、重要指標のマーケットコンセンサスに対する実績値がネガティブショックになる場合を想定して、いたん取引をクローズさせる投資家が多いためです。指標の発表カレンダーは常に確認できるようにしたほうがよいですね。
【NYダウが下がったら下がり、上がったときでも下がる日経平均】
日経平均株価とNYダウの相関性については第 4 章 5 節 3 項「予測を実践する」のなかで少し言及しました。気になったので今どうなっているのかを調べてみたのが以下のコードとプロットです。
# predi_plot_r2_nikkei225.py
# 線形回帰モデルを使ってnikkei225の値動きをNYダウから推定する。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import yfinance as yf
def get_data(code, index_as_date=True, start_date=None, end_date=None, interval="1d"):
df = yf.download(code, start=start_date, end=end_date, interval=interval)
# MultiIndex対策
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
df.index = pd.to_datetime(df.index)
df = df.rename(columns={
"Open": "open",
"High": "high",
"Low": "low",
"Close": "close",
"Adj Close": "adjclose",
"Volume": "volume",
})
if not index_as_date:
df = df.reset_index().rename(columns={"Date": "date"})
df["ticker"] = code
return df
# データ取得期間を設定
start_date = "2010-01-01"
end_date = "2024-11-30"
# 日経平均株価(円建て)とドル円為替レート、NYダウ株価をダウンロード
nikkei = get_data("^N225", start_date=start_date, end_date=end_date)
usd_jpy = get_data("JPY=X", start_date=start_date, end_date=end_date) # ドル円
dow = get_data("^DJI", start_date=start_date, end_date=end_date)
# 必要な列を取得し、日付をインデックスとして揃える
nikkei = nikkei["close"]
usd_jpy = usd_jpy["close"]
dow = dow["close"]
# データをマージして日経平均株価をドル換算
df = pd.DataFrame({
"日経平均株価": nikkei,
"ドル円レート": usd_jpy,
"ダウ平均株価": dow
}).dropna()
df["日経平均株価(ドル換算)"] = df["日経平均株価"] / df["ドル円レート"]
# 市場の時差を考慮してNYダウの株価を1日後ろにシフト
df["ダウ平均(シフト)"] = df["ダウ平均株価"].shift(1)
# シフト後のデータで欠損値を除去
df = df.dropna()
# 株価を標準化
df["日経平均ドル換算(標準化)"] = (df["日経平均株価(ドル換算)"] - df["日経平均株価(ドル換算)"].mean()) / df["日経平均株価(ドル換算)"].std()
df["ダウ平均(標準化)"] = (df["ダウ平均株価"] - df["ダウ平均株価"].mean()) / df["ダウ平均株価"].std()
df["ダウ平均(標準化・シフト)"] = (df["ダウ平均(シフト)"] - df["ダウ平均(シフト)"].mean()) / df["ダウ平均(シフト)"].std()
# 移動ウィンドウでR²を計算
window_size = 252*5 # 252営業日=約1年
r2_values = []
for i in range(len(df) - window_size + 1):
# ウィンドウ内のデータを取得
window_data = df.iloc[i:i + window_size]
x = window_data["ダウ平均(標準化・シフト)"].values.reshape(-1, 1)
y = window_data["日経平均ドル換算(標準化)"].values
# 一次回帰モデルの適合
model = LinearRegression()
model.fit(x, y)
# 決定係数を計算
y_pred = model.predict(x)
r2 = r2_score(y, y_pred)
r2_values.append(r2)
# R²を結果のデータフレームに追加
r2_series = pd.Series(r2_values, index=df.index[window_size - 1:])
# サブプロットを設定
fig, ax = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
# 上段:株価のプロット
ax[0].plot(df.index, df["日経平均ドル換算(標準化)"], label="日経平均株価(ドル換算・標準化)", color="blue")
ax[0].plot(df.index, df["ダウ平均(標準化)"], label="ダウ平均(標準化)", color="orange")
ax[0].set_title("日経平均(ドル換算)とダウ平均の比較")
ax[0].set_ylabel("標準化された株価")
ax[0].legend()
ax[0].grid()
# 下段:R²値のプロット
ax[1].plot(r2_series, label=f"{window_size}日間移動決定係数 (R²)", color="green")
ax[1].axhline(0, color="gray", linestyle="--", linewidth=0.8)
ax[1].set_title("日経平均(ドル換算)とダウ平均の一次回帰R²値")
ax[1].set_xlabel("日付")
ax[1].set_ylabel("決定係数 (R²)")
ax[1].legend()
ax[1].grid()
# レイアウトを調整して表示
plt.tight_layout()
plt.show()
新型コロナに伴う経済不況の後で、相関の様相が大きく変わっていることがわかります。不況以前は確かに二つの株価には高い相関がみられ、NYダウの株価から作った線形回帰モデルはドル換算日経平均株価の動きをよく説明できているといえます。しかし2022年以降相関は急速に弱まっていることがわかります。過去の正の相関については参考資料(Financial Trend、2010年、第一生命発行)のなかで次のように、海外投資家の動向が日経平均株価を動かすことの背景説明があります。
「海外投資家は運用ポートフォリオの構成比率を一定に保ちたい」
→ 「NYダウの上下降に合わせてドル建ての日本株の持ち分を調整する」
→ 「NYダウとドル換算日経平均株価は正の相関を示す」
→ 「NYダウが変化しない場合、円高になるとポートフォリオの配分比を保つために日本株を売って減らす傾向」
→ 「なので輸出銘柄でなくても円高になると国内企業の株価は下がりやすい」
この様相が何故2022年以降変わってきたのか筆者には調べがついていません。しかしわかりやすい北米株と日本株との相関が無い今、快調に走り続ける北米市場と連動して日本株も上昇する、というハッピーな期待感は持ちにくいです。
ある著名アナリストは、現在日経平均への影響力はNYダウよりドル・円為替レートの方が強い。円高は株安を招く。ドル・円為替レートを注視せよ、と主張していました。そしてこの項を執筆している2024年11月時点では第二期トランプ政権の動向から、円高を予想する向きが多いように見えます。不穏感増し増しです。
ただし、この株価への影響力云々、という言葉は相関係数のような容易に計算できる数字からは即座には見えてこないので注意が必要です。実際、上記のコードで示した内容を、日経平均株価とドル・円為替レートに置き換えてみると以下のような結果になります。最近の数値を見る限り、ドル・円為替レートの動きが日経平均株価の動きを説明できる、と言って良いような決定係数ではありません。ドル・円為替レート以外の環境因子(米国経済指標など)を考慮した考察が必要と思われます。
北米とは対照的に日本株の市場の弱弱しさは目立ち、昨今投資意欲がなかなか盛り上がらないのは残念です。日本企業の2024年度業績の不透明性、2024年8月暴落のきっかけとなった日銀政策変更の余波継続、といった背景事情が改善され、日本株がボックス圏を抜け出してくる可能性に今後は期待したいと思います。