シェア:

点々が教えてくれる!コインの売り買いタイミング作戦

この作戦は「パラボリックSAR」という道具を使います。グラフの上に表示される点々を見て、「XRP」というコインをいつ買ったり売ったりすれば良いかを見つける方法です。点々が値段の線の下に移動したら「買い」、上に移動したら「売り」という簡単なルールなので、初めての人でも分かりやすいですよ。

取引数
550
勝率
32.00%
最終リターン
-78.40%
最大DD
82.20%

導入と前提条件

この作戦は「パラボリックSAR」という道具を使います。グラフの上に表示される点々を見て、「XRP」というコインをいつ買ったり売ったりすれば良いかを見つける方法です。点々が値段の線の下に移動したら「買い」、上に移動したら「売り」という簡単なルールなので、初めての人でも分かりやすいですよ。

【検証】戦略のバックテスト概要

  • 戦略名: Parabolic SAR を使用したトレンド追従戦略
  • 対象銘柄: XRP/USDT
  • 時間足: 1h
  • 期間: 2024-02-05〜2025-08-25(566日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: okx

Parabolic SAR の理論的背景

この作戦は、「流れに乗る」という考え方が元になっています。値段の動きに大きな流れがあるとき、その流れに乗って利益をねらう方法です。パラボリックSARは、この流れが変わる瞬間を見つけやすくしてくれます。値段が上がり調子から下がり調子に変わるタイミングで売り買いすることで、流れに乗って利益を目指します。ちなみに、この点々の動きの速さは「加速係数」という設定で変えることができます。

具体的な売買ルール(今回の検証)

エントリー条件

  • 点々が、値段のグラフの上側から下側に移動し始めたときが、買うタイミングです。
  • 点々が、値段のグラフの下側から上側に移動し始めたときが、売るタイミングです。

エグジット条件

  • コインを買っているときに、点々が値段の上側に移動し始めたら、売り買いを終わらせるタイミングです。
  • コインを売っているときに、点々が値段の下側に移動し始めたら、売り買いを終わらせるタイミングです。

リスク管理

もし予想と反対に値段が動いて損をしてしまったとき、大損しないようにすることがとても大切です。そのために、「ここまで損したらやめる」という上限をあらかじめ決めておきましょう。例えば、「1回のチャレンジで失っていいお金は、持っているお金の100分の2まで」のように決めておくのが良い方法です。

再現手順(HowTo)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでXRP/USDTのOHLCVを取得して前処理
  3. 『Parabolic SAR』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数550回
勝率32%
平均利益3.32%
平均損失-1.88%
期待値-0.21%
プロフィットファクター0.73
最大ドローダウン82.2%
最終リターン-78.4%
シャープレシオ-0.2
HODL(Buy&Hold)492.14%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
#!/usr/bin/env python3
"""
パラボリックSAR戦略
SARが価格の上下に転換したらエントリー
"""
import pandas as pd
import numpy as np


def calculate_sar_signals(df: pd.DataFrame, af_start: float = 0.02, af_max: float = 0.2) -> pd.DataFrame:
    """
    パラボリックSARシグナルを生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    af_start : float
        加速係数の初期値(デフォルト: 0.02)
    af_max : float
        加速係数の最大値(デフォルト: 0.2)
    
    Returns:
    --------
    pd.DataFrame
        シグナル列が追加されたDataFrame
    """
    df = df.copy()
    
    # パラボリックSAR計算
    df['sar'] = df['close'].copy()
    df['ep'] = df['high'].copy()  # Extreme Point
    df['af'] = af_start
    df['trend'] = 1  # 1: 上昇トレンド, -1: 下降トレンド
    
    for i in range(1, len(df)):
        prev_sar = df.loc[df.index[i-1], 'sar']
        prev_ep = df.loc[df.index[i-1], 'ep']
        prev_af = df.loc[df.index[i-1], 'af']
        prev_trend = df.loc[df.index[i-1], 'trend']
        
        # SARの更新
        if prev_trend == 1:  # 上昇トレンド
            sar = prev_sar + prev_af * (prev_ep - prev_sar)
            sar = min(sar, df.loc[df.index[i-1], 'low'], df.loc[df.index[i-2], 'low'] if i > 1 else sar)
            
            if df.loc[df.index[i], 'low'] <= sar:  # トレンド転換
                df.loc[df.index[i], 'trend'] = -1
                df.loc[df.index[i], 'sar'] = prev_ep
                df.loc[df.index[i], 'ep'] = df.loc[df.index[i], 'low']
                df.loc[df.index[i], 'af'] = af_start
            else:
                df.loc[df.index[i], 'trend'] = 1
                df.loc[df.index[i], 'sar'] = sar
                if df.loc[df.index[i], 'high'] > prev_ep:
                    df.loc[df.index[i], 'ep'] = df.loc[df.index[i], 'high']
                    df.loc[df.index[i], 'af'] = min(prev_af + af_start, af_max)
                else:
                    df.loc[df.index[i], 'ep'] = prev_ep
                    df.loc[df.index[i], 'af'] = prev_af
        else:  # 下降トレンド
            sar = prev_sar - prev_af * (prev_sar - prev_ep)
            sar = max(sar, df.loc[df.index[i-1], 'high'], df.loc[df.index[i-2], 'high'] if i > 1 else sar)
            
            if df.loc[df.index[i], 'high'] >= sar:  # トレンド転換
                df.loc[df.index[i], 'trend'] = 1
                df.loc[df.index[i], 'sar'] = prev_ep
                df.loc[df.index[i], 'ep'] = df.loc[df.index[i], 'high']
                df.loc[df.index[i], 'af'] = af_start
            else:
                df.loc[df.index[i], 'trend'] = -1
                df.loc[df.index[i], 'sar'] = sar
                if df.loc[df.index[i], 'low'] < prev_ep:
                    df.loc[df.index[i], 'ep'] = df.loc[df.index[i], 'low']
                    df.loc[df.index[i], 'af'] = min(prev_af + af_start, af_max)
                else:
                    df.loc[df.index[i], 'ep'] = prev_ep
                    df.loc[df.index[i], 'af'] = prev_af
    
    # シグナル生成
    df['is_buy'] = (df['trend'] == 1) & (df['trend'].shift(1) == -1)
    df['is_sell'] = (df['trend'] == -1) & (df['trend'].shift(1) == 1)
    
    # NaN値をFalseに置換
    df['is_buy'] = df['is_buy'].fillna(False)
    df['is_sell'] = df['is_sell'].fillna(False)
    
    print(f"パラボリックSAR: AF開始={af_start}, AF最大={af_max}")
    print(f"買いシグナル数: {df['is_buy'].sum()}")
    print(f"売りシグナル数: {df['is_sell'].sum()}")
    
    return df

なぜこの結果になったのか(3つの理由)

  1. 1この作戦を試した結果、100回やったら32回しか勝てませんでした。全体で見ると損をしてしまう計算になります。これは、点々の動きだけで判断したため、ちょっとした値段の動きにだまされて、間違ったサインで売り買いしてしまったからかもしれません。
  2. 2この作戦で何回も売り買いするよりも、ただXRPコインをずっと持っていた方が、結果的に良い成績でした。つまり、何もしない方がマシだった、ということです。
  3. 3一番お金が減ったときには、元のお金の82.2%も減ってしまいました。これはとても大きな数字です。損がふくらむ前に「やめる」というルールがしっかりしていなかったか、やめるタイミングが遅すぎたことが原因だと考えられます。

この結果から学べる3つの教訓

  1. 1売り買いのタイミングを教えてくれる便利な道具を1つ使うだけでは、必ずうまくいくとは限らない、ということが学べます。
  2. 2勝つ回数が少なくても、勝つときは大きく勝ち、負けるときは小さく負けるようにすれば、全体でプラスにすることはできます。でも、この作戦ではそれができていなかったようです。
  3. 3「損は小さく、利益は大きく」というのが投資の大事な基本です。この作戦では、損が大きくなってしまったことが、成績が悪かった一番大きな理由だということがわかります。

リスク管理の具体的手法

取引量の決め方

1回のチャレンジに使うお金を、持っているお金全体の1%や2%のように、少ない割合に決めておきましょう。そうすれば、もし負けてしまっても、全体へのダメージを小さくできます。

損失が大きくなったときの対処法

もし損が続いて、持っているお金が10%のように、決めた割合以上減ってしまったら、一度全部の取引をお休みしましょう。そして、なぜうまくいかないのかを冷静に考えて、作戦を立て直す時間を作ると良いです。

資金管理の方法

投資に使うお金と、普段の生活で使うおこづかいは、きちんと分けて管理することがとても大切です。また、利益が出てもすぐに全部使ってしまわず、一部はちゃんと取っておくなど、賢くお金を管理しましょう。

改良案の具体的提案

  • 「移動平均線」や「RSI」といった、ほかの分析ツールも一緒に使って、「これは本物のサインだ!」と確信できるときだけ売り買いするようにルールを増やすと、もっと良くなるかもしれません。
  • 「ここまで値段が下がったら必ずやめる」という損切りのルールを、もっとハッキリと決めておくことが大切です。
  • 点々の動きの速さを変える設定をいろいろ試してみて、このコインや時間の区切りに一番合っている設定を探してみるのも良い方法です。

実用性の向上(運用上の注意)

  • この作戦の成績は、あくまで昔のデータで試した結果です。未来でも同じようにうまくいくとは限りません。もし自分で試すなら、なくなっても困らない少額のお金で始めることが大切です。
  • 点々のサインだけを見るのではなく、グラフ全体の大きな流れを見ながら判断するようにしましょう。特に、値段がはっきりと上がり続けたり、下がり続けたりしているときに、この作戦は力を発揮しやすいです。
  • XRPのようなコインは、値段がとても大きく動くことがあります。だからこそ、「ここまで損したらやめる」という損切りの設定は必ずしておき、自分が許せる範囲以上の損をしないように注意しましょう。

検証の透明性と信頼性

  • データの出所: この説明は、提供された作戦のプログラムと、その成績データをもとに作られています。
  • 検証のやり方: 作戦の成績(何回売り買いして、どれくらい勝って、最終的にどうなったか)と、プログラムの計算の仕組みを見比べて、内容を確認しました。
  • コード: この作戦は、Pythonというプログラミング言語で書かれたお手本コードがあります。
  • 注意事項: この説明は、投資をオススメするものではありません。投資には、お金が減ってしまう危険もあります。最後は、必ず自分自身で考えて判断してくださいね。

よくある質問

Q.パラボリックSARの点々って、どうやって動くの?

A.値段が上がっているときは点々も値段の下で一緒に上がっていき、値段が下がり始めると、今度は値段の上側に点々が現れて、一緒に下がっていきます。この点々の場所が上下入れ替わる瞬間が、売り買いの合図になります。

Q.この作戦を使えば、絶対もうかるの?

A.いいえ、残念ながら絶対もうかるわけではありません。過去の成績を見ると、むしろ損をしてしまっています。なので、この作戦をそのまま使うのは、とても危険だと言えます。

Q.「HODL(ホドル)」ってどういう意味?

A.「HODL」は、コインなどを「売らないで、ずっと持ち続ける」という意味で使われる言葉です。長期的に持っておく作戦のことだと思ってください。

Q.「最大DD」って何のこと?

A.「最大DD(さいだいドローダウン)」は、投資を始めたときから今までで、お金が一番大きく減ってしまったときの割合のことです。この作戦では、一時的にお金が82.2%も減ってしまったことがあった、という意味です。

Q.もっと良い成績にするには、どうすればいいの?

A.ほかの分析ツールと組み合わせる、損を止めるルールをもっと厳しくする、点々の動きの速さを調整してみる、などの工夫をすると、成績が改善するかもしれません。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-78.40%、最大DDは82.20%です。

Q.勝率やPFはどの程度?

A.勝率は32.00%、プロフィットファクターは0.73です。

Q.HODLとの比較結果は?

A.HODLは492.14%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報