フィボナッチ・リトレースメントとは?基本の考え方
フィボナッチ・リトレースメントとは、価格の変動幅に対して特定の比率で線を引くことで押し目や戻りの目安となる水準を示すテクニカル分析手法です。
もともとはフィボナッチ数列(1, 1, 2, 3, 5, 8, 13, …)に由来する比率で、代表的な水準として23.6%・38.2%・50%・61.8%・78.6%などがあります。例えばある銘柄が100円から150円に上昇した後に下落するとき、フィボナッチ・リトレースメントを使うと150円(上昇幅の100%)から下方向へ23.6%、38.2%…といった位置に線を引き、どの辺りで下げ止まるかの目安を可視化できます。これは上昇トレンド中の押し目(一時的な下落)や下降トレンド中の戻り(一時的な上昇)の転換点を探るためによく使われます。

なぜ投資で使われるのか?心理的背景と支持・抵抗
フィボナッチ比率の水準が注目されるのは、多くの投資家が意識するポイントになりやすいからです。過去の値動きを分析すると、大勢の投資家が利確や押し目買い・戻り売りを仕掛けやすい水準としてこれらの比率が機能し、結果的に支持線(サポート)や抵抗線(レジスタンス)になりやすい傾向があります。特に半値戻し(50%)は有名で、「半値戻しは全値戻し」といった相場格言があるほど注目されます。50%自体はフィボナッチ数列由来の比率ではありませんが、相場が大きく動いた後に約半値まで戻すケースが頻繁に起こるため、フィボナッチ・リトレースメントでも重要な水準として含められています。こうした背景から、フィボナッチの各水準は投資家心理が表れやすいポイントとして意識され、テクニカル分析に活用されています。
S&P500チャートで見るフィボナッチの実例
図: S&P500指数のチャートに、2020年3月の安値(0%)から2022年1月の高値(100%)までフィボナッチ・リトレースメントを適用した例。オレンジの点線が23.6%・38.2%・50%・61.8%・78.6%の各水準を示している。この期間では、2022年の下落がちょうど50%ライン付近(約3500ポイント)で下げ止まり、その後上昇に転じていることがわかる。
上の図のように、直近の高値と安値を起点にフィボナッチ・リトレースメントを描画すると、自動的に主要な比率の水平線がチャート上に引かれます。S&P500の場合、2020年のコロナ禍で付けた安値から2022年初めの高値まで上昇した後、フィボナッチ比率の50%戻し前後でサポートされて反発しました。このように過去の高値・安値に基づいて線を引くことで、今の価格が過去の上昇(または下落)幅の何割戻し地点にあるのかが一目でわかります。
実例2:エヌビディア
エヌビディアのパイソンプログラムを公開します。
import os
import numpy as np
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
import yfinance as yf
import time
import requests
from alpha_vantage.timeseries import TimeSeries
# Alpha Vantage APIキー
ALPHA_VANTAGE_API_KEY = "your_api_key_here"
def calculate_fibonacci_levels(high, low):
"""フィボナッチ・リトレースメントの水準を計算"""
levels = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0]
retracement_levels = {f"{int(l*100)}%": high - (high - low) * l for l in levels}
return retracement_levels
def get_stock_data_yfinance(ticker, max_retries=3):
"""yfinance を利用して株価データを取得(リトライ付き)"""
for attempt in range(max_retries):
try:
print(f"📡 {ticker} のデータを取得中...(試行 {attempt+1}/{max_retries})")
df = yf.download(ticker, period="6mo", auto_adjust=True, progress=False)
if not df.empty:
df = df[["Open", "High", "Low", "Close"]]
return df
else:
print(f"⚠️ yfinance から {ticker} のデータを取得できませんでした。(試行 {attempt+1})")
except Exception as e:
print(f"⚠️ yfinance エラー: {e}(試行 {attempt+1})")
time.sleep(2) # 次の試行の前に待機
print(f"❌ {ticker} のデータ取得に失敗しました。")
return None
def get_stock_data_alpha_vantage(ticker):
"""Alpha Vantage から株価データを取得"""
try:
print(f"📡 Alpha Vantage から {ticker} のデータを取得中...")
ts = TimeSeries(key=ALPHA_VANTAGE_API_KEY, output_format="pandas")
df, meta_data = ts.get_daily(symbol=ticker, outputsize="compact")
if df.empty:
print(f"⚠️ Alpha Vantage から {ticker} のデータを取得できませんでした。")
return None
df = df.rename(columns={"1. open": "Open", "2. high": "High", "3. low": "Low", "4. close": "Close"})
df = df[["Open", "High", "Low", "Close"]].iloc[::-1] # 最新のデータが最上部にくるように調整
return df
except Exception as e:
print(f"⚠️ Alpha Vantage エラー: {e}")
return None
def get_stock_data(ticker):
"""データを取得"""
df = get_stock_data_alpha_vantage(ticker)
if df is None:
print(f"🔄 Alpha Vantage が制限されたため、yfinance を試します。")
df = get_stock_data_yfinance(ticker)
if df is None:
print(f"⚠️ {ticker} のデータ取得に失敗しました。ダミーデータを作成します。")
df = generate_dummy_data()
return df
def generate_dummy_data():
"""データ取得失敗時にダミーデータを作成"""
dates = pd.date_range(start="2024-01-01", periods=50, freq="D")
prices = np.linspace(100, 200, 50) + np.random.normal(0, 5, 50)
df = pd.DataFrame({"Open": prices*0.98, "High": prices*1.02, "Low": prices*0.97, "Close": prices}, index=dates)
return df
def plot_fibonacci_chart(df, ticker):
"""フィボナッチ・リトレースメントを描画"""
if df is None or df.empty:
print("⚠️ 有効なデータがありません。チャートを表示できません。")
return
high = df["High"].max()
low = df["Low"].min()
retracement_levels = calculate_fibonacci_levels(high, low)
fig, ax = plt.subplots(figsize=(12, 6))
# ローソク足チャートの描画
mpf.plot(df, type="candle", style="charles", ax=ax)
# フィボナッチラインを描画
for label, level in retracement_levels.items():
ax.axhline(level, linestyle="--", color="red", alpha=0.6)
# 右側にフィボナッチラベル
ax.text(df.index[-1], level, label, fontsize=10, verticalalignment="bottom", color="black")
# 左側にもパーセンテージを表示
ax.text(df.index[0], level, label, fontsize=10, verticalalignment="bottom", horizontalalignment="right", color="blue")
# 左側の Y 軸にパーセンテージを表示
ax.set_yticks(list(retracement_levels.values()))
ax.set_yticklabels(retracement_levels.keys(), fontsize=10, color="blue")
ax.set_title(f"Fibonacci Retracement - {ticker}", fontsize=14)
plt.show()
def main():
"""株価コードを環境変数またはデフォルト値で取得"""
ticker = os.environ.get("STOCK_TICKER", "NVDA").strip().upper()
print(f"📈 取得する銘柄: {ticker}")
df = get_stock_data(ticker)
if df is not None:
plot_fibonacci_chart(df, ticker)
else:
print(f"⚠️ {ticker} のデータを取得できませんでした。")
if __name__ == "__main__":
main()

どこで反発しやすい?フィボナッチの効果的な使い方
フィボナッチ・リトレースメントの線が引けたら、実際の売買ではこれらの水準付近での値動きに注目します。一般的に上昇トレンド中の押し目では、23.6%や38.2%程度の浅い押しで再上昇することもありますし、相場によっては50%や61.8%近くまで深く調整してから反発に転じる場合もあります。下降トレンド中の戻りでも同様に、フィボナッチ比率の各ライン付近は戻り高値の目途として意識されやすく、特に**38.2%や61.8%**付近で上値が重くなって再下落に転じるケースが多いとされます。効果的に使うポイントをまとめると:
- エントリーポイントの目安: フィボナッチのライン付近でローソク足の反転シグナル(例:ピンバーや陽転など)が出たら、押し目買い・戻り売りのエントリーを検討できます。
- 利確・損切りの設定: 反発を狙ってエントリーした場合、直近高値や次のフィボナッチライン付近を利確目標に設定したり、ラインを明確に下抜けたら損切りする、といった戦略を立てることができます。
- トレンドの強さ判断: どの比率まで押すか(戻すか)によってトレンドの強さを判断するヒントにもなります。浅い押し(23.6%や38.2%)で再上昇すればトレンド継続の勢いが強く、**深い押し(61.8%近辺)**まで調整すると上昇トレンドが弱まりつつある、といった見方です。
注意点:過信せず他の指標と組み合わせる
フィボナッチ・リトレースメントは便利なツールですが、過信は禁物です。他のテクニカル指標と同様、常にピタリと機能するわけではありません。以下の点に注意しましょう:
- だまし(誤信号)も起こる: フィボナッチのラインできれいに反発せず、そのまま突破してしまうケースも少なくありません。一度反発しそうに見せてから再度割り込む「だまし」の動きもあるため、ライン付近の値動きを慎重に見極める必要があります。
- 他の指標と併用する: フィボナッチ単独では信頼度が十分でない場合、移動平均線やRSI・MACDなどのオシレーター系指標、あるいは出来高やローソク足パターンと併せて分析しましょう。複数の根拠が重なることで、より精度の高い売買判断が可能になります。
- 大局と材料も考慮: テクニカルな水準よりも、相場全体のトレンド転換やファンダメンタルズ要因が優先されて大きく動く場合もあります。例えば重要な経済指標やニュースでマーケット心理が大きく変化すると、フィボナッチの予想を超えてラインを突き抜ける動きも起こり得ます。常に相場の背景を踏まえ、リスク管理を徹底することが大切です。
フィボナッチ・リトレースメントは初心者でも比較的取り入れやすい分析手法ですが、「魔法の予言ツール」ではありません。目安となるポイントを提供するガイドラインとして活用し、他の分析手法やご自身の戦略と組み合わせて総合的に判断するようにしましょう。
こうしたバランスの取れたアプローチで臨めば、フィボナッチ・リトレースメントは心強い相場ナビゲーターになってくれるはずです。