ビットコインの値段の波をキャッチ!「調和振動子」っていう作戦を紹介します!
この作戦は、「調和振動子」っていう考え方を使います。ビットコインの値段が、まるでブランコみたいに揺れる動きに注目するんです。1時間ごとの値段を見て、いつ買うといいか、いつ売るといいかのヒントを探します。
導入と前提条件
この作戦は、「調和振動子」っていう考え方を使います。ビットコインの値段が、まるでブランコみたいに揺れる動きに注目するんです。1時間ごとの値段を見て、いつ買うといいか、いつ売るといいかのヒントを探します。
【検証】戦略のバックテスト概要
- 戦略名: Harmonic Oscillator を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2024-07-01〜2025-08-25(419日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Harmonic Oscillator の理論的背景
世の中には、波みたいに繰り返す動きがたくさんあります。例えば、季節が春夏秋冬と変わったり、公園のブランコが揺れたりするのもそうですね。この作戦は、ビットコインの値段の動きにも、そんな波みたいなリズムがあるんじゃないか?と考えています。「調わ振動子」っていう特別な計算で、その波の「山」(いきおいが一番強いとき)と「谷」(いきおいが一番弱いとき)を見つけようとします。値段の動きのいきおいが変わる瞬間をキャッチして、買ったり売ったりするタイミングを決めるんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段のいきおいを表すグラフが、マイナス(下向きのいきおい)からプラス(上向きのいきおい)に変わった瞬間に「買います」。
エグジット条件
- 値段のいきおいを表すグラフが、プラス(上向きのいきおい)からマイナス(下向きのいきおい)に変わった瞬間に「売ります」。
リスク管理
この作戦を試した結果、とっても残念なことがわかりました。たった1回の取引で、持っていたお金のほとんど全部(99.26%)を失ってしまったんです。これは、大きな損をしないように「ここまで損したらやめる」っていうルール(これを「損切り」と言います)がなかったからです。だから、もしこの作戦を使うなら、「一回の取引で失ってもいいお金はこれだけ」と、先にしっかり決めておくことが絶対に必要です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Harmonic Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 1199回 |
勝率 | 23.19% |
平均利益 | 0.87% |
平均損失 | -0.79% |
期待値 | -0.4% |
プロフィットファクター | 0.36 |
最大ドローダウン | 99.26% |
最終リターン | -99.26% |
シャープレシオ | -2.01 |
HODL(Buy&Hold) | 77.56% |
HODL戦略との比較
実装コード(Python)
"""
Harmonic Oscillator Trading Signal Generator
調和振動子を使用したサイクル分析
"""
import pandas as pd
import numpy as np
def calculate_harmonic_signals(df: pd.DataFrame,
period: int = 16) -> pd.DataFrame:
"""
Harmonic Oscillator戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
基本期間(デフォルト: 16)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# HLC平均価格
df['hlc'] = (df['high'] + df['low'] + df['close']) / 3
# 第1段階フィルター(ハイパスフィルター)
alpha1 = np.clip((np.cos(2 * np.pi / period) + np.sin(2 * np.pi / period) - 1) / np.cos(2 * np.pi / period), -0.99, 0.99)
df['hp'] = df['hlc'].copy()
for i in range(2, len(df)):
if not np.isnan(df.iloc[i]['hlc']) and not np.isnan(df.iloc[i-1]['hlc']):
val = (1 - alpha1/2)**2 * (df.iloc[i]['hlc'] - 2*df.iloc[i-1]['hlc'] + df.iloc[i-2]['hlc']) + 2*(1-alpha1)*df.iloc[i-1]['hp'] - (1-alpha1)**2*df.iloc[i-2]['hp']
df.loc[df.index[i], 'hp'] = np.clip(val, -1e6, 1e6) # オーバーフロー防止
# 第2段階フィルター(スムージング)
df['smooth'] = df['hp'].rolling(window=period//2).mean()
# ハーモニックオシレーター
df['ho'] = df['smooth']
# 信号ラインの生成
df['signal'] = df['ho'].rolling(window=3).mean()
# ヒストグラム
df['histogram'] = df['ho'] - df['signal']
# シグナル生成
df['hist_prev'] = df['histogram'].shift(1)
df['is_buy'] = (df['histogram'] > 0) & (df['hist_prev'] <= 0) & df['histogram'].notna()
df['is_sell'] = (df['histogram'] < 0) & (df['hist_prev'] >= 0) & df['histogram'].notna()
# 不要カラム削除
df.drop(['hlc', 'hp', 'smooth', 'signal', 'histogram', 'hist_prev'],
axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝率が約23%しかありません。これは、4回取引したら3回は負けてしまう、というくらい低い数字です。
- 21回の取引で平均していくら儲かるかを示す「期待値」がマイナスです。つまり、取引すればするほど、お金が減ってしまう計算になります。
- 3儲けと損のバランスを示す「PF」が0.36でした。これは1よりずっと小さい数字で、儲かった金額よりも、損した金額の方がずっと大きいことを意味します。
この結果から学べる3つの教訓
- 1作戦が本当にうまくいくか、数字でしっかり確かめることが大事だということがわかりました。
- 2「何回勝てたか」だけじゃなくて、「トータルで儲かったか」など、色々な角度から作戦をチェックしないといけないんですね。
- 3どんなに難しそうな計算を使っても、結果がダメなら、やり方を変えたり、もっと良くしたりする必要があるということです。
リスク管理の具体的手法
取引量の決め方
この作戦は、一度にすごく大きく損をする可能性があるので、1回の取引に使うお金は、持っているお金のほんの少しだけにするべきです。例えば、持っているお金全体の1%か2%まで、と決めておくのが安全です。
損失が大きくなったときの対処法
この作戦では、持っているお金のほとんど全部をなくしてしまう危険があります。そうならないように、「これ以上損が大きくなったら、しばらく取引をお休みする」というような厳しいルールを作っておくことが、とても大切です。
資金管理の方法
この作戦は、あなたのお金全体を大きく減らしてしまう可能性がとても高いです。本気で使う前に、まずはものすごく少ない金額で試してみるか、この作戦だけじゃなくて、もっと安全な他の作戦と一緒に使うことを強くおすすめします。
改良案の具体的提案
- 大きな損をする前に「ここまで損したらやめる」というルール(損切り)を必ず加えることが必要です。
- 勝つ回数を増やしたり、全体のもうけをプラスにするために、計算に使う数字(設定値)を変えてみるのがいいかもしれません。
- 他の作戦のヒントになる道具と組み合わせて、もっと確実な「買い」や「売り」のタイミングを探してみましょう。
実用性の向上(運用上の注意)
- 今のままでは、この作戦は損をしやすいです。そのまま使わないで、必ずもっと良くする方法を考えてから試してくださいね。
- 計算に使う期間などの設定を変えると、作戦の結果も変わることがあります。色々な設定で試してみるのも一つの手です。
- 実際にお金を使って取引する前に、過去の値段の動きを使って「この作戦は本当に儲かるのかな?」としっかりテストしてみることが、すごく大事です。
検証の透明性と信頼性
- データの出所: 使った情報:ビットコイン(BTC/USDT)の1時間ごとの値段のデータです。
- 検証のやり方: 確かめ方:取引した回数や勝率、儲けと損のバランスなどの数字をもとにして、この作戦がどうだったかをチェックしました。
- コード: プログラムについて:この作戦の計算プログラム(Pythonコード)があるので、誰でも同じようにテストしてみることができます。
- 注意事項: 注意してほしいこと:この作戦は、昔のデータを使って考えたものです。だから、未来も同じようにうまくいくとは限りません。投資をするときは、自分でよく考えて決めてくださいね。特に、この作戦は今のままでは、とても損をしやすいという結果が出ていることを忘れないでください。