未来の値段がわかる?コイン取引の作戦「サイバーサイクル」を大解剖!
この作戦は、コイン(暗号資産)の値段がこれから上がるか下がるかを、まるで未来を当てるかのように予測しようとするものです。「サイバーサイクル」という名前のこの方法が、いつ買ったり売ったりすればいいかをどうやって見つけるのか、そしてその結果はどうだったのかを、わかりやすく説明しますね。
導入と前提条件
この作戦は、コイン(暗号資産)の値段がこれから上がるか下がるかを、まるで未来を当てるかのように予測しようとするものです。「サイバーサイクル」という名前のこの方法が、いつ買ったり売ったりすればいいかをどうやって見つけるのか、そしてその結果はどうだったのかを、わかりやすく説明しますね。
【検証】戦略のバックテスト概要
- 戦略名: Cyber Cycle を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2024-02-16〜2025-08-25(555日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: bybit
Cyber Cycle の理論的背景
この作戦は、「コインの値段は、上がったり下がったり、決まったリズム(サイクル)で動くことがある」という考え方が元になっています。海で波が何度もやってくるように、値段にも上げ下げの波がくり返し来ると考えるんです。サイバーサイクルでは、まず値段のギザギザの動きを「なめらか」な線にして、本当の波の形を見つけやすくします。次に、その波が「上向き」か「下向き」か、そして波の「大きさはどれくらいか」を計算します。これらの情報を使って、値段が変わりそうな「きっかけ」を見つけて、取引のタイミングを決めるんですよ。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段の波を表す線が、過去の波のいきおいを示す「きっかけの線」を、下から上にこえたら「買い」のサインです。
- 値段の波が、「売られすぎ」を示す線よりも下にあった状態から、その線を上にこえ始めたときも「買い」のサインと見なします。
エグジット条件
- 値段の波を表す線が、「きっかけの線」を、上から下にわってしまったら、持っているコインを売るタイミングです。
- 値段の波が、「買われすぎ」を示す線よりも上にあった状態から、その線を下まわり始めたときも売るタイミングと見なします。
リスク管理
もし予想がはずれて損しちゃっても、大損しないためのルールです。「ここまで損したらやめる」というラインを決めておいて、それ以上に損が大きくならないようにします。これによって、大切なお金を守りながらチャレンジを続けられるようにします。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『Cyber Cycle』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 15834回 |
勝率 | 12.12% |
平均利益 | 0.43% |
平均損失 | -0.51% |
期待値 | -0.39% |
プロフィットファクター | 0.11 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -3.69 |
HODL(Buy&Hold) | 64.28% |
HODL戦略との比較
実装コード(Python)
"""
Cyber Cycle Trading Signal Generator
デジタルフィルターを使用したサイクル分析
"""
import pandas as pd
import numpy as np
def calculate_cyber_cycle_signals(df: pd.DataFrame,
period: int = 16) -> pd.DataFrame:
"""
Cyber Cycle戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
サイクル期間(デフォルト: 16)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 価格データのスムージング
df['price'] = (df['high'] + df['low']) / 2
df['smooth'] = (df['price'] + 2 * df['price'].shift(1) + 2 * df['price'].shift(2) + df['price'].shift(3)) / 6
# サイクル成分の抽出(2次IIRフィルター)
alpha = 2 / (period + 1)
df['cycle'] = 0.0
for i in range(2, len(df)):
a = 1 - 0.5 * alpha
b = 1 - alpha
c = (1 - 0.75 * alpha)
if i >= 2 and not np.isnan(df.iloc[i]['smooth']) and not np.isnan(df.iloc[i-1]['smooth']) and not np.isnan(df.iloc[i-2]['smooth']):
df.loc[df.index[i], 'cycle'] = (
a**2 * (df.iloc[i]['smooth'] - 2 * df.iloc[i-1]['smooth'] + df.iloc[i-2]['smooth']) +
2 * b * df.iloc[i-1]['cycle'] -
c**2 * df.iloc[max(i-2, 0)]['cycle']
)
# トリガーライン(1期前のサイクル)
df['trigger'] = df['cycle'].shift(1)
# サイクルの標準偏差
df['cycle_std'] = df['cycle'].rolling(window=period).std()
# ダイナミックレベル
df['upper_level'] = df['cycle_std'] * 1.5
df['lower_level'] = -df['cycle_std'] * 1.5
# シグナル生成
df['is_buy'] = (
((df['cycle'] > df['trigger']) & (df['cycle'].shift(1) <= df['trigger'].shift(1))) | # トリガークロス
((df['cycle'] > df['lower_level']) & (df['cycle'].shift(1) <= df['lower_level'])) # 売られ過ぎからの反発
) & df['cycle'].notna()
df['is_sell'] = (
((df['cycle'] < df['trigger']) & (df['cycle'].shift(1) >= df['trigger'].shift(1))) | # トリガークロス
((df['cycle'] < df['upper_level']) & (df['cycle'].shift(1) >= df['upper_level'])) # 買われ過ぎからの反落
) & df['cycle'].notna()
# 不要カラム削除
df.drop(['price', 'smooth', 'trigger', 'cycle_std', 'upper_level', 'lower_level'],
axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1この結果は、「もしこの作戦を昔のデータで使っていたらどうなったかな?」という、お試し(シミュレーション)の結果です。本当にこの通りにお金が動いたわけではありません。
- 2「勝率12.12%」というのは、100回チャレンジして、うまくいったのは約12回だけだった、ということです。ほとんどが失敗だったんですね。
- 3「最終損益-100%」というのは、最初のお金が、ぜんぶなくなっちゃった、という意味です。つまり、この作戦では、この期間ではまったくもうからなかった、ということになります。
この結果から学べる3つの教訓
- 1どんなにすごそうな作戦に見えても、うまくいかなかったときは、その原因をちゃんと調べることが大切です。
- 2勝つ回数が少なくても、一回で大きく勝てばプラスになることもありますが、この作戦はそうじゃありませんでした。
- 3昔のデータでうまくいかなかった作戦は、そのまま使わずに、もっと良くする方法を考えることが大事です。
リスク管理の具体的手法
取引量の決め方
一回のチャレンジで使うお金は、持っているお金のほんの少しだけにします。例えば、1000円持っていたら、10円とか20円だけ使う、という感じです。そうすれば、もし負けても大きなダメージにはなりません。
損失が大きくなったときの対処法
もし損がどんどんふくらんで、決めておいた金額をこえてしまったら、いったん全部の取引をストップして、作戦を見直します。これ以上、損が広がらないように、冷静になることが大切です。
資金管理の方法
「いくらもうかったら、いったんお休みする」というゴールを決めたりします。また、損が大きくなりすぎないように、いつも自分のお金がぜんぶでいくらあるかをチェックしておくことが重要です。
改良案の具体的提案
- チャレンジした回数(15834回)が多すぎるのに、勝てた回数が少なすぎます。もっとねらいをすまして、回数をへらしても効率よく取引できるようにした方が良さそうです。
- もうけの期待度をしめす数字もすごく悪かったので、取引のルールを変えるか、まったく別の作戦を考えた方がいいかもしれません。
- 「最大DD100%」は、一番大きくお金がへってしまったとき、ぜんぶなくなってしまったことを示しています。だから、損を小さくするためのルールをもっときびしくする必要があります。
実用性の向上(運用上の注意)
- この作戦は、昔のデータで試したらすごく成績が悪かったので、このまま本番のお金で使うのはやめた方が安全です。
- もしこの作戦を試してみたいなら、まずはゲームみたいに練習するか、本当に少なーいお金で始めて、ルールを大きく変えるなど、すごく注意ぶかくやる必要があります。
- うまくいかなくても、カッとなったり落ちこんだりせず、「どうしてダメだったんだろう?」と冷静に考えて、次に活かすことが一番大事です。
検証の透明性と信頼性
- データの出所: このお試し計算には、イーサリアム(ETH)というコインの値段のデータを使いました。値段は、テザー(USDT)という別のコインで表されています。データは、5分ごとの値段の動きを記録したものです。
- 検証のやり方: この作戦がどれだけうまくいくか、ある期間のデータを使って「もしも」の計算(シミュレーション)をしてみました。
- コード: この作戦が、どうやって計算しているかの設計図(プログラムコード)は、みんなが見られるようになっています。
- 注意事項: この結果は、あくまで昔のデータを使った計算上の話で、未来のもうけを約束するものではありません。お金を使った取引には、ソンをする可能性がいつもあります。自分でよく考えて、自分の責任で行ってください。