【失敗談】自動プログラムで売り買いしたら、お金がほぼゼロに? ある作戦の落とし穴
コンピューターのプログラムで、自動で売り買いをする方法があります。今回は、ある作戦を試してみたら、残念ながらほとんどのお金がなくなってしまいました。どうしてそうなったのか、一緒に見ていきましょう!
取引数
1782
勝率
19.14%
最終リターン
-99.83%
最大DD
99.83%
導入と前提条件
コンピューターのプログラムで、自動で売り買いをする方法があります。今回は、ある作戦を試してみたら、残念ながらほとんどのお金がなくなってしまいました。どうしてそうなったのか、一緒に見ていきましょう!
【検証】戦略のバックテスト概要
- 戦略名: EMA Crossover を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2024-09-20〜2025-08-25(338日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
EMA Crossover の理論的背景
「速い線」は、値段の最新の動きにすぐに反応します。「遅い線」は、ゆったり動いて全体の大きな流れを教えてくれます。速い線が遅い線を上に追い越すのは、「これから値段が上がりそう!」という勢いのあるサインと考えられます。逆に下に抜けるのは、「値段が下がりそう…」というサインです。この「勢いの変化」のタイミングをうまくつかまえて、利益を出そう!というのが、この作戦の基本的な考え方です。
具体的な売買ルール(今回の検証)
エントリー条件
- 5分ごとの値段グラフで、速い線が遅い線を追い越して上に出たとき、買うことにします。
- 5分ごとの値段グラフで、速い線が遅い線の下に潜り込んだとき、売ることにします。
エグジット条件
- 何かを買って持っているときに、速い線が遅い線の下に潜り込んだら、売ることにします(利益が出ていても、損していても売ります)。
- 何かを売っているときに、速い線が遅い線を追い越して上に出たら、買い戻すことにします(これも、利益が出ていても、損していても同じです)。
リスク管理
大失敗しないための大事なルールも決めていました。まず、「もし損しちゃっても、この金額まで」という上限を決めておきます。そして、一度に大きなお金を賭けるのではなく、少しずつやることで、もし負けても全体へのダメージが小さくなるようにしていました。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『EMA Crossover』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 1782回 |
勝率 | 19.14% |
平均利益 | 1.35% |
平均損失 | -0.75% |
期待値 | -0.35% |
プロフィットファクター | 0.3 |
最大ドローダウン | 99.83% |
最終リターン | -99.83% |
シャープレシオ | -0.65 |
HODL(Buy&Hold) | 84.76% |
HODL戦略との比較
実装コード(Python)
strategy.py
#!/usr/bin/env python3
"""
EMAクロスオーバー戦略
短期EMAが長期EMAを上抜けで買い、下抜けで売り
"""
import pandas as pd
import numpy as np
def calculate_ema_signals(df: pd.DataFrame, fast_period: int = 12, slow_period: int = 26) -> pd.DataFrame:
"""
EMAクロスオーバーシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
fast_period : int
短期EMA期間(デフォルト: 12)
slow_period : int
長期EMA期間(デフォルト: 26)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# EMAの計算
df['ema_fast'] = df['close'].ewm(span=fast_period, adjust=False).mean()
df['ema_slow'] = df['close'].ewm(span=slow_period, adjust=False).mean()
# EMAの差分(トレンド強度)
df['ema_diff'] = df['ema_fast'] - df['ema_slow']
df['ema_diff_pct'] = (df['ema_diff'] / df['close']) * 100
# クロスオーバーシグナル
df['is_buy'] = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
df['is_sell'] = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
# デバッグ情報
print(f"EMA期間: 短期={fast_period}, 長期={slow_period}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1勝つ確率が低すぎました。10回チャレンジしたら、8回は負けてしまう計算でした。これでは、お金を増やすのはとても難しいですよね。
- 2やればやるほど損をする可能性がありました。1回チャレンジするごとに、もうかる金額よりも損する金額のほうが大きい計算になっていたんです。使ったお金に対して、戻ってくるお金がとても少ない、効率の悪い状態でした。
- 3値段の動きとうまく合いませんでした。この作戦がうまくいくような、都合のいい値段の動きがあまりありませんでした。小さなチャンスも大きなチャンスもつかめず、損ばかりが増えてしまったのかもしれません。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、1回でドカンと大きく勝てば、全体ではプラスになることもあります。でも、今回の作戦ではそうはなりませんでした。
- 2計算してみて「やればやるほど損しそう」とか「使ったお金より儲けが少ない」という結果が出たら、その作戦自体に何か問題があると考えたほうが良さそうです。
- 3昔のデータで「これなら勝てる!」と思っても、実際にやってみると全然ダメなことがあります。練習だけでなく、本番でどうなるかをちゃんと確かめることが大切です。
リスク管理の具体的手法
取引量の決め方
1回に使うお金は、持っているお金全体の1%か2%くらいに、とても少なくします。こうすれば、もし負けたとしても、全体のお金はほとんど減りません。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が10%も減ってしまったら、一度プログラムをストップします。これ以上、傷が大きくならないようにするためです。
資金管理の方法
もし勝って利益が出ても、全部お小遣いにしないで、一部は次のチャレンジのためにとっておきます。そうやって、長い目で見て、ゆっくりお金を育てていくことを考えます。
改良案の具体的提案
- 「損は大きいのに、利益はちょっぴり」という結果にならないように、「ここまで利益が出たら売る」のような、欲張りすぎないルールを加える方法があります。
- 「ダマシ」というウソの合図に引っかからないように、他の道具(例えば「今の勢いはどれくらい?」を測る道具など)も一緒に使って、本当にチャンスなのかを確認する方法があります。
- むやみに何度も売り買いするのではなく、「これは本当に良いチャンスだ!」と思える時だけにしぼるように、ルールを厳しくする方法もあります。
実用性の向上(運用上の注意)
- この作戦だけでコンピューターに全部おまかせするのは、今のままではすごく危ないかもしれません。
- もし試してみたいなら、まずはお小遣いのような本当に少ない金額でやるか、本物のお金を使わずに、昔のデータでもっと練習してみるのがおすすめです。
- もっとうまくいきそうな他の作戦を探したり、この作戦をもっと良くする方法を考えたりする方がいいかもしれません。
検証の透明性と信頼性
- データの出所: この実験で使ったのは、「イーサリアム」という有名な仮想通貨の、5分ごとの値段のデータです。
- 検証のやり方: 約1年分の昔の値段データを使って、「もしこの作戦で売り買いしていたら、お金はどうなっていたかな?」というのをコンピューターで実験してみました。これを「バックテスト」と呼びます。
- コード: この実験のために作ったプログラムの設計図(コード)は、誰でも見られるように公開されています。
- 注意事項: これは、あくまで昔のデータで実験した結果です。だからといって、「未来も必ずこうなる!」というわけではありません。お金を使うときは、自分の判断で、十分に注意してくださいね。特に、この作戦は大きな損が出てしまったので、気をつけてください。
よくある質問
Q.「移動平均線」って、いったい何ですか?
A.グラフの上にかく線のことで、過去の値段の平均をつないだものです。最近の値段の動きにすぐ反応する「速い線」と、全体の大きな流れを見る「遅い線」の2種類をよく使います。
Q.「クロスオーバー」ってどういう意味ですか?
A.「交差する」という意味です。グラフの上で、速い線と遅い線がお互いを追い越して交わるタイミングのことを指しています。
Q.「やればやるほど損しそう」って、どうしてわかるんですか?
A.1回売り買いした時に、平均してどれくらい儲かるか(または損するか)を計算できるんです。それがマイナスだと「やればやるほど損する可能性が高い」ということになります。また、使ったお金に対して儲けが少ないと「効率が悪い」ということになります。
Q.「ダマシ」って何ですか?
A.「これから値段が上がるぞ!」という合図に見えたのに、実はウソで、すぐに下がってしまうような動きのことです。このウソの合図にだまされて、損をしてしまうことがあるんです。
Q.じゃあ、この作戦はもう全然使えないんですか?
A.このまま一人で使うのは難しいかもしれません。でも、他の作戦と組み合わせたり、ルールをもっと工夫したりすれば、うまくいくようになる可能性はありますよ。ただ、今の時点では、避けておいたほうが安心かもしれませんね。
Q.検証に使用した期間と時間足は?
A.5m足で検証しました。期間は記事内の概要をご確認ください。
Q.最終リターンと最大ドローダウンは?
A.最終リターンは-99.83%、最大DDは99.83%です。
Q.勝率やPFはどの程度?
A.勝率は19.14%、プロフィットファクターは0.30です。
Q.HODLとの比較結果は?
A.HODLは84.76%でした。記事内の比較表をご覧ください。
Q.手数料やスリッページは考慮済み?
A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。
Q.市場環境はトレンド/レンジどちらに近かった?
A.期間中はトレンド優勢と推測されます。
Q.この戦略は初心者でも扱える?
A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。
Q.推奨のリスク管理は?
A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。
Q.将来の結果は期待できる?
A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。
Q.改良の方向性は?
A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。