シェア:

値段の勢いを見てチャレンジ!SOL/USDTで試す「VMA作戦」のしくみ

この作戦は、「SOL」と「USDT」という2つのインターネット上のお金の値段が、どれくらい元気よく動いているかを見て、いつ買って、いつ売るかを決める方法です。4時間ごとに値段をチェックして、2024年11月10日から2025年8月25日までのデータで試してみました。

取引数
81
勝率
33.33%
最終リターン
-25.83%
最大DD
57.86%

導入と前提条件

この作戦は、「SOL」と「USDT」という2つのインターネット上のお金の値段が、どれくらい元気よく動いているかを見て、いつ買って、いつ売るかを決める方法です。4時間ごとに値段をチェックして、2024年11月10日から2025年8月25日までのデータで試してみました。

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

  • 戦略名: Variable Moving Average を使用したトレンド追従戦略
  • 対象銘柄: SOL/USDT
  • 時間足: 4h
  • 期間: 2024-11-10〜2025-08-25(287日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: kucoin

Variable Moving Average の理論的背景

この作戦は、値段が「どれだけ元気に動いているか」を一番大切にしています。値段がグングン上がろうとしている時は、VMAの線も一緒に上がっていきます。そして、値段がVMAの線を上に突き抜けた時が、「買ってみようかな?」と考えるチャンスです。逆に、値段がどんどん下がっている時は、VMAの線も下がっていきます。そして、値段がVMAの線を下に突き抜けた時が、「売ってみようかな?」と考えるチャンスです。値段とVMAの線の関係を見ながら、より良いタイミングを探すんです。

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

エントリー条件

  • 値段がVMAの線を下から上に追い越して、そのVMAの線自体も上を向いているとき。
  • 値段がVMAの線よりも上にあって、そのVMAの線が上を向いているとき。

エグジット条件

  • 値段がVMAの線を上から下に割り込んで、そのVMAの線自体も下を向いているとき。
  • 値段がVMAの線よりも下にあって、そのVMAの線が下を向いているとき。

リスク管理

この作戦では、損が大きくなりすぎないように、あらかじめ「これ以上損したらストップする」というルールを決めておきます。もし思ったよりも損が出そうになったら、無理に続けずに、一旦お休みして作戦を考え直すことがとても大事です。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数81回
勝率33.33%
平均利益5.45%
平均損失-3.01%
期待値-0.19%
プロフィットファクター0.81
最大ドローダウン57.86%
最終リターン-25.83%
シャープレシオ-0.13
HODL(Buy&Hold)-1.52%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Variable Moving Average Trading Signal Generator
ボラティリティに応じて動的に調整される移動平均
"""
import pandas as pd
import numpy as np


def calculate_vma_signals(df: pd.DataFrame,
                         period: int = 20,
                         sensitivity: float = 0.5) -> pd.DataFrame:
    """
    Variable Moving Average戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        基本期間(デフォルト: 20)
    sensitivity : float
        感度係数(デフォルト: 0.5)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # 変動率(ボラティリティ)計算
    df['price_change'] = np.abs(df['close'] - df['close'].shift(1))
    
    # 方向性指標
    df['direction'] = df['close'] - df['close'].shift(1)
    df['positive_change'] = np.where(df['direction'] > 0, df['price_change'], 0)
    df['negative_change'] = np.where(df['direction'] < 0, df['price_change'], 0)
    
    # Volatility Index(VI)
    df['pos_sum'] = df['positive_change'].rolling(window=period).sum()
    df['neg_sum'] = df['negative_change'].rolling(window=period).sum()
    df['vi'] = df['pos_sum'] / (df['pos_sum'] + df['neg_sum'] + 0.0001)
    
    # Variable Ratio(VR)
    df['vr'] = 2 * np.abs(df['vi'] - 0.5) * sensitivity
    
    # Alpha(平滑化係数)
    df['alpha'] = 2 / (period * df['vr'] + 1)
    
    # Variable Moving Average
    df['vma'] = df['close'].copy()
    for i in range(1, len(df)):
        if i >= period:
            alpha = df.iloc[i]['alpha']
            if not np.isnan(alpha):
                df.loc[df.index[i], 'vma'] = alpha * df.iloc[i]['close'] + (1 - alpha) * df.iloc[i-1]['vma']
    
    # VMA傾き(トレンド方向)
    df['vma_slope'] = df['vma'] - df['vma'].shift(1)
    df['vma_trend'] = df['vma_slope'].rolling(window=3).mean()
    
    # 価格とVMAの位置関係
    df['price_above_vma'] = df['close'] > df['vma']
    df['price_below_vma'] = df['close'] < df['vma']
    
    # シグナル生成
    df['price_above_prev'] = df['price_above_vma'].shift(1)
    df['price_below_prev'] = df['price_below_vma'].shift(1)
    df['is_buy'] = (
        (df['price_above_vma'] & (df['price_above_prev'] == False)) &  # VMAを上抜け
        (df['vma_trend'] > 0)  # VMAが上昇トレンド
    ) & df['vma'].notna()
    df['is_sell'] = (
        (df['price_below_vma'] & (df['price_below_prev'] == False)) &  # VMAを下抜け
        (df['vma_trend'] < 0)  # VMAが下降トレンド
    ) & df['vma'].notna()
    
    # 不要カラム削除
    df.drop(['price_change', 'direction', 'positive_change', 'negative_change',
             'pos_sum', 'neg_sum', 'vi', 'vr', 'alpha', 'vma_slope', 'vma_trend',
             'price_above_vma', 'price_below_vma', 'price_above_prev', 'price_below_prev'], 
            axis=1, inplace=True, errors='ignore')
    
    return df

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

  1. 1勝てたのが3回に1回くらいと少なかったのは、ちょっとした値段の動きにすぐ反応しすぎて、本当はチャンスじゃないのに「行けるかも!」と勘違いしてしまう「ニセモノのサイン」に、だまされちゃったからかもしれません。
  2. 2トータルで損をしてしまったのは、勝ったときの「もうけ」が小さくて、負けたときの「損」が大きかったからだと考えられます。だから、全部合わせるとマイナスになってしまったんですね。
  3. 3一番お金が減ってしまった時に、もっていたお金の半分以上がなくなってしまうくらい大きな損が出たのは、「損が大きくなりすぎないようにする」という守りのルールが、うまく働いていなかったからかもしれません。

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

  1. 1値段の勢いも大事だけど、その勢いが本物で、ちゃんと続くかどうかをしっかり見極めることが大切だとわかりました。
  2. 2たとえ勝つ回数が少なくても、一回勝ったときに大きな「もうけ」を出せれば、全部合わせるとプラスにできる可能性がある、ということも学びました。
  3. 3どんなにすごい作戦でも、「損を小さくする工夫」をちゃんとしておかないと、一度の失敗で大損してしまうことがある、ということがよくわかりました。

リスク管理の具体的手法

取引量の決め方

1回のチャレンジで使うお金は、持っているお金全体の2%まで、と決めておきます。こうすれば、もし負けてしまっても、全体へのダメージを小さくできます。

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

もしお金が一番増えた時から10%以上減ってしまったら、一度全部の取引をお休みします。そして、作戦をもう一度見直す、というルールです。これで、これ以上損が広がるのを防ぎます。

資金管理の方法

もうかったお金の一部は、安全な場所に移しておくなど、お金を上手に管理します。負けたからといって、次で取り返そうと焦って大金を使わないようにすることも大事です。

改良案の具体的提案

  • VMAの線の反応の速さを変えてみて、ちょっとした動きに反応しすぎないように調整し、「ニセモノのサイン」を減らせるか試してみます。
  • この作戦に加えて、別の道具(例えば、他の種類の線が交差するのを見る、など)も一緒に使って、もっと確かなタイミングで売ったり買ったりできるようにします。
  • 「この金額まで損したら、潔くあきらめる」という損切りのルールを、もっとハッキリ決めて、大きな損をしないように工夫します。

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

  • 今回は「SOL/USDT」という組み合わせと「4時間ごと」というルールで試しましたが、他のインターネット上のお金の組み合わせや、もっと短い時間(例えば1時間ごと)で試してみるのも面白いかもしれません。
  • 作戦の中の細かい設定(線の動きの速さなど)を色々と変えてみて、どれが一番良い成績になるか、自分で試してみることが上達の近道です。
  • この作戦は、あくまで昔のデータで試した結果です。未来も同じようになるとは限りません。試すときは、必ず自分の判断と責任で、なくなっても困らない少額から始めましょう。

検証の透明性と信頼性

  • データの出所: 使った値段のデータ(始めの値段、高い値段、安い値段、終わりの値段など)は、Binanceのような、みんなが見られる取引所のサイトから持ってきました。
  • 検証のやり方: Pythonというプログラミング言語を使って、「もしこの作戦を昔からやっていたら、どれくらいうまくいったかな?」というシミュレーション(バックテスト)をして、結果を確かめました。
  • コード: この作戦を動かすためのコンピュータープログラムは、インターネット上で見られるようになっています。
  • 注意事項: このお話は、投資をおすすめするものではありません。インターネット上のお金の取引は、値段が大きく変わることがあり、大きな損をしてしまう可能性もあります。投資をする時は、必ず自分の判断と責任で行ってください。

よくある質問

Q.VMAって何ですか?

A.値段の動きの激しさに合わせて、ゴムみたいに伸びたり縮んだりする「特別な線」のことです。値段が元気よく動いている時は素早く、静かな時はゆっくり動いて、今の状況を教えてくれます。

Q.勝つ回数が少ないのに、どうしてこの作戦を使う意味があるんですか?

A.たとえ勝つ回数が少なくても、1回勝ったときにものすごく大きな「もうけ」が出せれば、負けた分を取り返して、全部合わせるとプラスになる可能性があるからです。ただ、今回の結果では、まだそこまでうまくはいきませんでした。

Q.SOL/USDTって何のことですか?

A.「SOL(ソラナ)」という名前のインターネット上のお金と、「USDT(テザー)」というアメリカのドルとだいたい同じ価値になるように作られたインターネット上のお金の、2つの組み合わせのことです。

Q.「4h」ってどういう意味ですか?

A.「4 hours」のことで、「4時間」という意味です。グラフの1本の棒が4時間ぶんの値段の動きを表していて、4時間ごとに値段をチェックして作戦を考える、ということです。

Q.最大DDって、そんなに悪い数字なんですか?

A.「最大DD」は、作戦の途中で、お金が一番減ってしまった時の割合のことです。57.86%というのは、持っていたお金が半分以上なくなってしまった瞬間があった、ということです。これは、とても危険な状態だったと言えます。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

A.期間中はレンジ・下落優勢と推測されます。

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報