SOL/USDTの投資チャレンジ:「Schaff Trend Cycle」で流れに乗れるかな?
この作戦は、「SOL」というインターネット上のお金で利益を出すための方法です。1時間ごとの値段の動きを見て、いつ買っていつ売るかを考えます。この作戦を過去のデータで試してみた結果も紹介しますね。
取引数
234
勝率
39.74%
最終リターン
-44.49%
最大DD
62.14%
導入と前提条件
この作戦は、「SOL」というインターネット上のお金で利益を出すための方法です。1時間ごとの値段の動きを見て、いつ買っていつ売るかを考えます。この作戦を過去のデータで試してみた結果も紹介しますね。
【検証】戦略のバックテスト概要
- 戦略名: Schaff Trend Cycle を使用したトレンド追従戦略
- 対象銘柄: SOL/USDT
- 時間足: 1h
- 期間: 2024-10-04〜2025-08-25(324日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: bybit
Schaff Trend Cycle の理論的背景
この作戦は「流れに乗る」のが基本です。値段が上がっているときに買い、下がっているときに売る、というシンプルな考え方ですね。値段の勢いをはかる道具で「今どっちに向かっているの?」を確認し、買われすぎ・売られすぎをはかる道具で「そろそろ向きが変わるかも?」というサインを探します。この2つを組み合わせて、流れの変わり目を見つけようとします。
具体的な売買ルール(今回の検証)
エントリー条件
- 特別な道具の線が、「25」という数字を下から上に突き抜けたときが「買い」のサインです。
エグジット条件
- 特別な道具の線が、「75」という数字を上から下に突き抜けたときが「売り」のサインです。
リスク管理
投資には、損をする可能性が必ずあります。だから、「この取引で損してもいいのは、ここまで」とあらかじめ決めておくことが大切です。大きな損を防ぐための大事なルールです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでSOL/USDTのOHLCVを取得して前処理
- 『Schaff Trend Cycle』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 234回 |
勝率 | 39.74% |
平均利益 | 3.37% |
平均損失 | -2.51% |
期待値 | -0.18% |
プロフィットファクター | 0.84 |
最大ドローダウン | 62.14% |
最終リターン | -44.49% |
シャープレシオ | -0.12 |
HODL(Buy&Hold) | 46.13% |
HODL戦略との比較
実装コード(Python)
strategy.py
"""
Schaff Trend Cycle Trading Signal Generator
MACDとストキャスティクスを組み合わせたトレンドサイクル指標
"""
import pandas as pd
import numpy as np
def calculate_schaff_signals(df: pd.DataFrame,
fast_period: int = 23,
slow_period: int = 50,
cycle_period: int = 10,
smooth_period: int = 3) -> pd.DataFrame:
"""
Schaff Trend Cycle戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
fast_period : int
短期EMA期間(デフォルト: 23)
slow_period : int
長期EMA期間(デフォルト: 50)
cycle_period : int
サイクル期間(デフォルト: 10)
smooth_period : int
平滑化期間(デフォルト: 3)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# MACD計算
df['ema_fast'] = df['close'].ewm(span=fast_period, adjust=False).mean()
df['ema_slow'] = df['close'].ewm(span=slow_period, adjust=False).mean()
df['macd'] = df['ema_fast'] - df['ema_slow']
# 第1ストキャスティクス(MACDベース)
df['macd_min'] = df['macd'].rolling(window=cycle_period).min()
df['macd_max'] = df['macd'].rolling(window=cycle_period).max()
df['stoch1'] = 100 * (df['macd'] - df['macd_min']) / (df['macd_max'] - df['macd_min'] + 0.0001)
df['stoch1_smooth'] = df['stoch1'].ewm(span=smooth_period, adjust=False).mean()
# 第2ストキャスティクス(第1ストキャスティクスベース)
df['stoch1_min'] = df['stoch1_smooth'].rolling(window=cycle_period).min()
df['stoch1_max'] = df['stoch1_smooth'].rolling(window=cycle_period).max()
df['stc'] = 100 * (df['stoch1_smooth'] - df['stoch1_min']) / (df['stoch1_max'] - df['stoch1_min'] + 0.0001)
df['stc'] = df['stc'].ewm(span=smooth_period, adjust=False).mean()
# シグナル生成
df['stc_prev'] = df['stc'].shift(1)
df['is_buy'] = (df['stc'] > 25) & (df['stc_prev'] <= 25) & df['stc'].notna()
df['is_sell'] = (df['stc'] < 75) & (df['stc_prev'] >= 75) & df['stc'].notna()
# 不要カラム削除
df.drop(['ema_fast', 'ema_slow', 'macd_min', 'macd_max', 'stoch1', 'stoch1_smooth',
'stoch1_min', 'stoch1_max', 'stc_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦を324日間で234回試してみたところ、勝ったのは約40%でした。これは、勝つよりも負ける回数の方が多かったということです。
- 21回の取引あたりの平均は、少しだけ損をしてしまう、という結果でした。
- 3もうかった金額の合計よりも、損した金額の合計の方が大きかったです。その結果、最終的には持っていたお金が約44%も減ってしまいました。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、1回で大きく勝てば、全体ではプラスになることもあります。でも、今回の作戦ではそうはなりませんでした。
- 2値段の大きな流れに乗る作戦でも、うまくいかない時があることを知りました。特に、値段があまり動かない時は、まちがったサインが出やすいみたいです。
- 3勝った割合やもうけのバランス、一番大きく損した時の金額など、数字で冷静に作戦をチェックすることが大事だとわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引に使うお金は、持っているお金全体の1%や2%のように、少しだけにします。こうすれば、もし負けても大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もし、持っているお金が一番多かった時から20%みたいに大きく減ってしまったら、一度全部の取引をやめて作戦を考え直します。
資金管理の方法
「損は小さく、もうけは大きく」を目指します。1回の取引で失うお金の上限を決めるなど、大切なお金全体を守るためのルールを作りましょう。
改良案の具体的提案
- 「買い」や「売り」のサインが出たときに、もう一つ別の条件もクリアした場合だけ取引するようにすれば、まちがいのサインを減らせるかもしれません。
- もしかしたら、この作戦は別のお金や、もっと長い時間(例えば4時間ごとなど)で見たほうがうまくいくかもしれません。
- 損がふくらむ前に売る「損切り」のルールを見直すことも大切です。例えば、損した金額ではなく、「何%損したら売る」というルールに変えるのも一つの手です。
実用性の向上(運用上の注意)
- 機械が出すサインをそのまま信じるだけでなく、実際の値段のグラフも見ながら、最後は自分で判断することが大切です。
- 作戦で使う数字(23とか50とか)を変えると、結果も変わることがあります。色々な数字で試して、自分に合う設定を見つけるのも良い方法です。
- 実際に自分のお金で試す前に、過去のデータでこの作戦が本当にもうかるのかをしっかりテストしてみましょう。
検証の透明性と信頼性
- データの出所: この説明は、もらったデータをもとにしています。
- 検証のやり方: 2024年10月から約1年間のデータでテストした結果を参考にしています。
- コード: この作戦を動かすためのプログラム(Pythonコード)があります。
- 注意事項: これは「こうすればもうかるよ」とおすすめするものではありません。投資は、自分のお金が減ってしまう可能性もあります。必ず自分でよく考えて、自分の責任で行ってくださいね。
よくある質問
Q.この「Schaff Trend Cycle」って、どういう意味ですか?
A.「Schaff(シャフ)」というのは、この道具を作った人の名前です。「Trend Cycle」は、値段の大きな流れ(トレンド)には周期(サイクル)がある、という考え方のことです。つまり、「シャフさんが考えた、トレンドの周期を見るための道具」という意味ですよ。
Q.MACDとかストキャスティクスって、何が違うの?
A.MACDは値段の「勢い」や「向かう方向」を見るのが得意です。ストキャスティクスは「買われすぎかな?」「売られすぎかな?」と、細かい動きを見るのが得意です。この作戦では、両方の良いところを使って、より正確なタイミングをはかろうとしているんです。
Q.勝った回数が少ないけど、大丈夫?
A.勝つ回数が少なくても、一回で大きく勝てば大丈夫なこともあります。でも、この作戦は勝つ回数が少ない上に、一回のもうけも小さかったので、うまくいきませんでした。
Q.「最大DD:62.14%」って、すごくこわくない?
A.「最大DD(ドローダウン)」は、お金が一番多かった時から、一時的にどれだけ減っちゃったか、という割合です。62.14%というのは、もし100万円あったら、一時期は38万円くらいまで減ってしまった可能性がある、ということです。これはとても大きな数字なので、かなり注意が必要ですね。
Q.この作戦で、どうやったら勝てるようになりますか?
A.今回のテスト結果のままでは、勝つのは難しそうです。勝てるようになるには、例えば「買い」のサインが出ても、もっと良い条件がそろうまで待つとか、損が大きくならないうちに売るルールを厳しくするなど、作戦を改良する必要があります。
Q.検証に使用した期間と時間足は?
A.1h足で検証しました。期間は記事内の概要をご確認ください。
Q.最終リターンと最大ドローダウンは?
A.最終リターンは-44.49%、最大DDは62.14%です。
Q.勝率やPFはどの程度?
A.勝率は39.74%、プロフィットファクターは0.84です。
Q.HODLとの比較結果は?
A.HODLは46.13%でした。記事内の比較表をご覧ください。
Q.手数料やスリッページは考慮済み?
A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。
Q.市場環境はトレンド/レンジどちらに近かった?
A.期間中はトレンド優勢と推測されます。
Q.この戦略は初心者でも扱える?
A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。
Q.推奨のリスク管理は?
A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。
Q.将来の結果は期待できる?
A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。
Q.改良の方向性は?
A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。