値動きの元気さで予想!SOL/USDTで試した作戦の結果は?
この作戦は、仮想通貨「SOL/USDT」の値動きが、どれだけムダなくまっすぐに進んでいるかを見て、いつ買っていつ売るかを決める方法です。5分ごとの短い時間で、何度も売り買いを試してみました。その結果どうなったか、わかりやすくお話ししますね。
取引数
7581
勝率
16.41%
最終リターン
-100.00%
最大DD
100.00%
導入と前提条件
この作戦は、仮想通貨「SOL/USDT」の値動きが、どれだけムダなくまっすぐに進んでいるかを見て、いつ買っていつ売るかを決める方法です。5分ごとの短い時間で、何度も売り買いを試してみました。その結果どうなったか、わかりやすくお話ししますね。
【検証】戦略のバックテスト概要
- 戦略名: Polarized Fractal Efficiency を使用したトレンド追従戦略
- 対象銘柄: SOL/USDT
- 時間足: 5m
- 期間: 2024-03-13〜2025-08-25(529日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Polarized Fractal Efficiency の理論的背景
この作戦の基本的な考え方は、値動きに「ムダがないか」を調べることです。例えば、たくさんジグザグ動いても、結局元の場所からあまり進んでいなければ「ムダが多い」と考えます。逆に、少しの動きでもまっすぐ進んでいれば「ムダがない」と考えます。この「ムダのなさ」と「勢い」を見ることで、これから値段が上がりそうか、下がりそうかを見つけようとするんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 「PFE」の点数がマイナスからプラスに変わったとき。これは、値動きが下向きから上向きに元気になった合図なので、ここで買います。
- 「PFE」の点数が「もう下がりすぎだよ」というラインを越えたとき。これも、これからは上がりそう、という合図なので、ここで買います。
エグジット条件
- 「PFE」の点数がプラスからマイナスに変わったとき。値動きの元気がなくなった合図なので、ここで売って利益や損を確定させます。
- 「PFE」の点数が「もう上がりすぎだよ」というラインを下回ったとき。これからは下がりそう、という合図なので、ここで売ります。
リスク管理
もしものために、お約束を決めておくことがとても大切です。例えば、「一度に使うお金は少しだけにする」とか、「これ以上損したら、今日はもうやめる」といったルールを守ることが、大切なお金を守ることにつながります。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでSOL/USDTのOHLCVを取得して前処理
- 『Polarized Fractal Efficiency』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 7581回 |
勝率 | 16.41% |
平均利益 | 0.87% |
平均損失 | -0.65% |
期待値 | -0.4% |
プロフィットファクター | 0.42 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -1.51 |
HODL(Buy&Hold) | 34.03% |
HODL戦略との比較
実装コード(Python)
strategy.py
"""
Polarized Fractal Efficiency Trading Signal Generator
価格変動の効率性を測定してトレンドを検出
"""
import pandas as pd
import numpy as np
def calculate_pfe_signals(df: pd.DataFrame,
period: int = 10,
smoothing: int = 5) -> pd.DataFrame:
"""
Polarized Fractal Efficiency戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
PFE計算期間(デフォルト: 10)
smoothing : int
平滑化期間(デフォルト: 5)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 価格変化(直線距離)
df['price_change'] = df['close'] - df['close'].shift(period)
# 実際の価格パス(各期間の変化の合計)
df['period_changes'] = 0.0
for i in range(1, period + 1):
df['period_changes'] += np.sqrt(
(df['close'].shift(i-1) - df['close'].shift(i))**2 + 1
)
# 効率性比率
df['efficiency'] = np.sqrt(df['price_change']**2 + period**2) / (df['period_changes'] + 0.0001)
# PFE(極性を持つフラクタル効率)
df['pfe_raw'] = np.sign(df['price_change']) * df['efficiency'] * 100
# 指数移動平均でスムージング
df['pfe'] = df['pfe_raw'].ewm(span=smoothing, adjust=False).mean()
# PFEの移動平均(トレンド)
df['pfe_ma'] = df['pfe'].rolling(window=period).mean()
# PFEの標準偏差(ボラティリティ)
df['pfe_std'] = df['pfe'].rolling(window=period).std()
# ダイナミックレベル
df['pfe_upper'] = df['pfe_std'] * 2
df['pfe_lower'] = -df['pfe_std'] * 2
# シグナル生成
df['pfe_prev'] = df['pfe'].shift(1)
df['is_buy'] = (
((df['pfe'] > 0) & (df['pfe_prev'] <= 0)) | # ゼロラインクロス
((df['pfe'] > df['pfe_lower']) & (df['pfe_prev'] <= df['pfe_lower'])) # 売られ過ぎからの反発
) & df['pfe'].notna()
df['is_sell'] = (
((df['pfe'] < 0) & (df['pfe_prev'] >= 0)) | # ゼロラインクロス
((df['pfe'] < df['pfe_upper']) & (df['pfe_prev'] >= df['pfe_upper'])) # 買われ過ぎからの反落
) & df['pfe'].notna()
# 不要カラム削除
df.drop(['price_change', 'period_changes', 'efficiency', 'pfe_raw',
'pfe_ma', 'pfe_std', 'pfe_upper', 'pfe_lower', 'pfe_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝てる確率が約16%と、とても低かったからです。100回売り買いしても16回くらいしか勝てず、もうけが出にくい状態でした。
- 2「プロフィットファクター」という成績表が0.42だったからです。これが1より小さいと、勝って得たお金より、負けて失ったお金の方が多いという意味になります。
- 3最終的に、用意したお金が全部なくなってしまったからです。途中、一番お金が減った時も、ぜんぶなくなるくらい大きな損が出ていました。
この結果から学べる3つの教訓
- 1この「PFE」という作戦は、過去のSOL/USDTの5分ごとの値動きでは、残念ながらうまくいきませんでした。
- 2勝つ回数が少なくても、一回で大きく勝てれば全体でプラスになることもあります。でも、この作戦ではそれも難しかったようです。
- 3「これはいける!」と思った作戦でも、実際に試すとダメなことがあります。だから、本当に使う前に、過去のデータで練習してみることや、損をしないためのルール作りがすごく大事だということがわかりました。
リスク管理の具体的手法
取引量の決め方
一回の売り買いで使うお金は、持っているお金のほんの少し(例えば100分の1)だけにします。こうすれば、もし負けても、大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が1割とか2割減ってしまったら、一度お休みします。そして、作戦が今の状況に合っているか見直します。これで、もっと大きな損を防ぐことができます。
資金管理の方法
もしもうかったとしても、そのお金を全部次の売り買いに使うのはやめましょう。一部はちゃんと貯金するなど、お金の計画を立てることが大切です。
改良案の具体的提案
- 作戦で使う数字(設定値)を色々と変えてみて、一番うまくいく組み合わせを探してみること。
- PFEの合図だけでなく、他の作戦(例えば「移動平均線」など)と組み合わせて、もっと「ここだ!」というタイミングを見つけられるようにすること。
- SOL/USDT以外の仮想通貨で試したり、5分ごとではなく1時間ごとなど、時間を変えて試してみること。
実用性の向上(運用上の注意)
- 今回試した結果では、この作戦はうまくいきませんでした。なので、このまま使うのは危ないかもしれません。
- もしどうしても試してみたいなら、なくなっても大丈夫なくらいの、ほんの少しのお金で始めてみましょう。そして、実際の値動きを見ながら、作戦を調整することが大切です。
- 世の中の状況が変わると、うまくいく作戦も変わることがあります。だから、作戦で使う数字やルールは、ときどき見直すのがおすすめです。
検証の透明性と信頼性
- データの出所: このテストで使ったのは、「SOL/USDT」という仮想通貨の、5分ごとの実際の値動きの記録です。
- 検証のやり方: 昔のデータを使って、「もしこの作戦で売り買いしていたらどうなっていたか?」というコンピューターでのシミュレーションをしました。
- コード: このシミュレーションに使ったプログラムは公開されています。「Python」というプログラミングの言葉で書かれています。
- 注意事項: この結果は、あくまで昔のデータで試したものです。これからもうまくいくとは限りません。お金を使うときは、自分でよく考えて決めてくださいね。
よくある質問
Q.PFEって何のこと?
A.値動きがどれだけ「ムダなくまっすぐ」進んでいるかを点数にしたものです。目的地まで、寄り道しないで進めたかどうかを調べている、と考えるとわかりやすいかもしれません。
Q.「勝てる確率が16%」って、すごく低いってこと?
A.はい、その通りです。100回売り買いしたら、84回は負けてしまった、ということです。勝つ回数が少ないと、1回でとても大きく勝たない限り、全体でプラスにするのは難しくなります。
Q.PFって何?0.42って成績が悪いの?
A.「プロフィットファクター」の略で、もうけと損のバランスを見る成績表みたいなものです。1より大きいと「もうけの方が多い」という意味ですが、0.42だと「損の方が大きかった」ということになり、残念ながらあまり良い成績ではありません。
Q.「最終的に-100%」って、お金がぜんぶなくなっちゃったってこと?
A.はい、その通りです。この作戦をやり続けたら、最初に用意したお金がぜんぶなくなってしまった、という悲しい結果でした。
Q.この作戦って、他の仮想通貨とかでも使えるの?
A.試すことはできますが、うまくいくとは限りません。今回はSOL/USDTの5分ごとの値動きで試しましたが、他の仮想通貨や株、または1時間ごとのような違う時間で見ると、まったく違う結果になる可能性が高いです。
Q.検証に使用した期間と時間足は?
A.5m足で検証しました。期間は記事内の概要をご確認ください。
Q.最終リターンと最大ドローダウンは?
A.最終リターンは-100.00%、最大DDは100.00%です。
Q.勝率やPFはどの程度?
A.勝率は16.41%、プロフィットファクターは0.42です。
Q.HODLとの比較結果は?
A.HODLは34.03%でした。記事内の比較表をご覧ください。
Q.手数料やスリッページは考慮済み?
A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。
Q.市場環境はトレンド/レンジどちらに近かった?
A.期間中はトレンド優勢と推測されます。
Q.この戦略は初心者でも扱える?
A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。
Q.推奨のリスク管理は?
A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。
Q.将来の結果は期待できる?
A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。
Q.改良の方向性は?
A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。