ビットコインの売り時・買い時はわかる?「オーサム・オシレーター」を試してみた!
この作戦は、「オーサム・オシレーター」という道具を使って、ビットコインの値段の上がり下りの「勢い」を見る方法です。5分ごとの細かい値動きのグラフで、いつ買っていつ売ればいいのか、そのタイミングを探ってみます。中学生のみんなにもわかるように、売り買いのヒントを解説しますね。
導入と前提条件
この作戦は、「オーサム・オシレーター」という道具を使って、ビットコインの値段の上がり下りの「勢い」を見る方法です。5分ごとの細かい値動きのグラフで、いつ買っていつ売ればいいのか、そのタイミングを探ってみます。中学生のみんなにもわかるように、売り買いのヒントを解説しますね。
【検証】戦略のバックテスト概要
- 戦略名: Awesome Oscillator を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-08-25〜2025-08-25(364日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Awesome Oscillator の理論的背景
この作戦は、「値段の動きには『勢い』があって、その勢いの変化を見れば、これからどう動くかのヒントが見つかるかもしれない」という考えが元になっています。オーサム・オシレーターは、短い時間と長い時間の勢いを比べることで、今の市場の本当の勢いをキャッチしようとします。勢いがプラスになれば「買い」のパワーが強いサイン、マイナスになれば「売り」のパワーが強いサイン、というふうに考えます。また、グラフが特別な形になったら、値段の流れが変わる合図かもしれない、と考えて売り買いのタイミングをはかります。
具体的な売買ルール(今回の検証)
エントリー条件
- 勢いがマイナスからプラスに変わった時(ゼロの線を上に超えた時)に買う。
- 勢いのグラフが下がりきって、お皿の底みたいな形になって、また上がり始めた時に買う。
エグジット条件
- 勢いがプラスからマイナスに変わった時(ゼロの線を下に超えた時)に売る。
- 勢いのグラフが上がりきって、お皿をひっくり返したみたいな形になって、また下がり始めた時に売る。
- 目標の利益が出たら売って、利益を確定させる。
- 決めておいた額まで損が出たら売って、それ以上損が大きくならないようにする。
リスク管理
一気にたくさんのお金を使わず、もしなくなっても大丈夫と思える少ない金額で挑戦します。もし予想と反対に値段が動いて損をしてしまった時も、被害が広がらないように「ここまで損したらやめる」というルールをあらかじめ決めておきます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Awesome Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 9148回 |
勝率 | 7.03% |
平均利益 | 0.43% |
平均損失 | -0.46% |
期待値 | -0.4% |
プロフィットファクター | 0.06 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -4.36 |
HODL(Buy&Hold) | 75.36% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
Awesome Oscillator戦略
Bill Williamsの開発したモメンタムインジケーター
"""
import pandas as pd
import numpy as np
def calculate_awesome_signals(df: pd.DataFrame, fast_period: int = 5, slow_period: int = 34) -> pd.DataFrame:
"""
Awesome Oscillatorシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
fast_period : int
短期SMA期間(デフォルト: 5)
slow_period : int
長期SMA期間(デフォルト: 34)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# Median Price(中央値価格)
df['median_price'] = (df['high'] + df['low']) / 2
# Awesome Oscillator計算
df['ao_fast'] = df['median_price'].rolling(window=fast_period).mean()
df['ao_slow'] = df['median_price'].rolling(window=slow_period).mean()
df['ao'] = df['ao_fast'] - df['ao_slow']
# Twin Peaks(ツインピークス)パターン検出
# Saucer(ソーサー)シグナル
df['ao_color'] = np.where(df['ao'] > df['ao'].shift(1), 'green', 'red')
# シグナル生成
# ゼロラインクロス
df['zero_cross_buy'] = (df['ao'] > 0) & (df['ao'].shift(1) <= 0)
df['zero_cross_sell'] = (df['ao'] < 0) & (df['ao'].shift(1) >= 0)
# ソーサーシグナル(色の変化で判定)
df['saucer_buy'] = (
(df['ao'] > df['ao'].shift(1)) & # AOが上昇
(df['ao'].shift(1) < df['ao'].shift(2)) # 前回が下降
)
df['saucer_sell'] = (
(df['ao'] < df['ao'].shift(1)) & # AOが下降
(df['ao'].shift(1) > df['ao'].shift(2)) # 前回が上昇
)
# 総合シグナル
df['is_buy'] = df['zero_cross_buy'] | df['saucer_buy']
df['is_sell'] = df['zero_cross_sell'] | df['saucer_sell']
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"Awesome Oscillator: 短期={fast_period}, 長期={slow_period}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦を試したところ、勝てる確率が100回中7回くらいと、とても低かったです。ほとんどの取引で負けてしまったので、最終的に使ったお金が全部なくなってしまいました。
- 2計算上、1回取引するごとに少しずつ損をしていく状態でした。儲かった金額と損した金額を比べても、損の方がずっと大きくて、利益を出すのがとても難しい作戦だったことがわかります。
- 3一番運が悪かった時には、一回の失敗で持っていたお金が全部なくなってしまう可能性がありました。これは、損が大きくなりすぎないようにする工夫が、うまく働いていなかったことを示しています。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、一回の勝ちで大きな利益が出ればプラスになる作戦もありますが、この作戦はそうなりませんでした。
- 29000回以上も売り買いしたのに利益が出なかったということは、「今がチャンス!」というサインの精度があまり良くなくて、意味のない取引をたくさんしてしまったのかもしれません。
- 3この作戦で売り買いするよりも、ただビットコインを買ってずっと持っているだけの方が、良い結果になっていました。つまり、何もしない方がマシだった、ということです。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、持っているお金全体の1%〜2%くらいにすると安心です。例えば、10万円持っていたら、1回に使うのは1000円〜2000円くらいにしておきます。
損失が大きくなったときの対処法
もし損がふくらんで、持っているお金の5%など、決めておいた額に達したら、その日は取引をやめたり、作戦を見直したりする勇気も大切です。
資金管理の方法
投資に使うお金と、普段のお小遣いや生活に使うお金は、きちんと分けて管理しましょう。そうすれば、もし投資で負けても生活に困ることはありません。
改良案の具体的提案
- 「買いだ!」「売りだ!」というサインが出てもすぐに行動せず、グラフの形など、他の道具も使って「本当に今でいいのかな?」ともう一度確認する。
- 作戦で使っている計算の数字(短い期間を5、長い期間を34にしている部分)を色々と変えてみて、もっと良い結果が出る組み合わせがないか探してみる。
- 「ここまで損したらやめる」というルールを、もっと厳しく決めて、一度の失敗で大きな損をしないようにする。
実用性の向上(運用上の注意)
- この作戦は今回のテストでうまくいかなかったので、そのまま真似するのは危険です。もし試すなら、必ず練習用のツールや、なくなってもいいと思える少額で試してみましょう。
- 5分ごとの値動きはとてもスピーディーです。焦ったり欲張ったりせず、自分で決めたルールを冷静に守ることが、とても大事になります。
- 取引の結果をノートにつけて、「どこが良くて、どこが悪かったのか」を振り返ることが、上達への一番の近道です。
検証の透明性と信頼性
- データの出所: この結果は、昔のビットコインの5分ごとの値段の記録を使って計算したものです。
- 検証のやり方: 「バックテスト」という方法で、もし昔の時代にこの作戦を使っていたらどうなっていたか、をコンピューターでシミュレーションしました。
- コード: このシミュレーションに使ったプログラムの設計図は、誰でも見られるようになっています。
- 注意事項: これは昔のデータを使ったシミュレーション結果です。未来も同じように利益が出ることを保証するものではありません。投資は、自分でよく考えて、自分の責任で行いましょう。