点々が教えてくれる!コインの売り買いタイミング作戦
この作戦は「パラボリックSAR」という道具を使います。グラフの上に表示される点々を見て、「XRP」というコインをいつ買ったり売ったりすれば良いかを見つける方法です。点々が値段の線の下に移動したら「買い」、上に移動したら「売り」という簡単なルールなので、初めての人でも分かりやすいですよ。
導入と前提条件
この作戦は「パラボリック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)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでXRP/USDTのOHLCVを取得して前処理
- 『Parabolic SAR』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 550回 |
勝率 | 32% |
平均利益 | 3.32% |
平均損失 | -1.88% |
期待値 | -0.21% |
プロフィットファクター | 0.73 |
最大ドローダウン | 82.2% |
最終リターン | -78.4% |
シャープレシオ | -0.2 |
HODL(Buy&Hold) | 492.14% |
HODL戦略との比較
実装コード(Python)
#!/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この作戦を試した結果、100回やったら32回しか勝てませんでした。全体で見ると損をしてしまう計算になります。これは、点々の動きだけで判断したため、ちょっとした値段の動きにだまされて、間違ったサインで売り買いしてしまったからかもしれません。
- 2この作戦で何回も売り買いするよりも、ただXRPコインをずっと持っていた方が、結果的に良い成績でした。つまり、何もしない方がマシだった、ということです。
- 3一番お金が減ったときには、元のお金の82.2%も減ってしまいました。これはとても大きな数字です。損がふくらむ前に「やめる」というルールがしっかりしていなかったか、やめるタイミングが遅すぎたことが原因だと考えられます。
この結果から学べる3つの教訓
- 1売り買いのタイミングを教えてくれる便利な道具を1つ使うだけでは、必ずうまくいくとは限らない、ということが学べます。
- 2勝つ回数が少なくても、勝つときは大きく勝ち、負けるときは小さく負けるようにすれば、全体でプラスにすることはできます。でも、この作戦ではそれができていなかったようです。
- 3「損は小さく、利益は大きく」というのが投資の大事な基本です。この作戦では、損が大きくなってしまったことが、成績が悪かった一番大きな理由だということがわかります。
リスク管理の具体的手法
取引量の決め方
1回のチャレンジに使うお金を、持っているお金全体の1%や2%のように、少ない割合に決めておきましょう。そうすれば、もし負けてしまっても、全体へのダメージを小さくできます。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が10%のように、決めた割合以上減ってしまったら、一度全部の取引をお休みしましょう。そして、なぜうまくいかないのかを冷静に考えて、作戦を立て直す時間を作ると良いです。
資金管理の方法
投資に使うお金と、普段の生活で使うおこづかいは、きちんと分けて管理することがとても大切です。また、利益が出てもすぐに全部使ってしまわず、一部はちゃんと取っておくなど、賢くお金を管理しましょう。
改良案の具体的提案
- 「移動平均線」や「RSI」といった、ほかの分析ツールも一緒に使って、「これは本物のサインだ!」と確信できるときだけ売り買いするようにルールを増やすと、もっと良くなるかもしれません。
- 「ここまで値段が下がったら必ずやめる」という損切りのルールを、もっとハッキリと決めておくことが大切です。
- 点々の動きの速さを変える設定をいろいろ試してみて、このコインや時間の区切りに一番合っている設定を探してみるのも良い方法です。
実用性の向上(運用上の注意)
- この作戦の成績は、あくまで昔のデータで試した結果です。未来でも同じようにうまくいくとは限りません。もし自分で試すなら、なくなっても困らない少額のお金で始めることが大切です。
- 点々のサインだけを見るのではなく、グラフ全体の大きな流れを見ながら判断するようにしましょう。特に、値段がはっきりと上がり続けたり、下がり続けたりしているときに、この作戦は力を発揮しやすいです。
- XRPのようなコインは、値段がとても大きく動くことがあります。だからこそ、「ここまで損したらやめる」という損切りの設定は必ずしておき、自分が許せる範囲以上の損をしないように注意しましょう。
検証の透明性と信頼性
- データの出所: この説明は、提供された作戦のプログラムと、その成績データをもとに作られています。
- 検証のやり方: 作戦の成績(何回売り買いして、どれくらい勝って、最終的にどうなったか)と、プログラムの計算の仕組みを見比べて、内容を確認しました。
- コード: この作戦は、Pythonというプログラミング言語で書かれたお手本コードがあります。
- 注意事項: この説明は、投資をオススメするものではありません。投資には、お金が減ってしまう危険もあります。最後は、必ず自分自身で考えて判断してくださいね。