機械学習で賢く稼ぐ!Freqtrade・Jesseで始める仮想通貨自動取引入門
機械学習で賢く稼ぐ!Freqtrade・Jesseで始める仮想通貨自動取引入門
こんにちは、ぽんたぬきです。
40代になって「このままサラリーマンだけで老後は大丈夫かな?」と不安になること、ありませんか?私も電機メーカーのSEとして働いていますが、最近は副収入の必要性をひしひしと感じています。
特に、小学生の息子と幼稚園生の娘の教育費を考えると、何か手を打たなければと思う今日この頃。そんな中で注目しているのが、プログラミングスキルを活かした仮想通貨の自動取引です。
今回は、機械学習を活用した仮想通貨自動取引ツール「Freqtrade」と「Jesse」について、実際に私が検証した結果も交えながら詳しく解説していきます。同じような悩みを持つ仲間として、一緒に学んでいきましょう!
なぜ今、仮想通貨自動取引なのか?
従来の投資手法の限界
私たちのような中年エンジニアが株式投資を始めようとすると、いくつかの課題があります:
- 時間の制約: 本業があるため、平日の市場時間に集中して取引できない
- 感情的な判断: 損失が出ると慌てて売却してしまう
- 知識不足: 企業分析や財務諸表の読み方が分からない
一方、仮想通貨市場は24時間365日動いているため、平日夜や週末でも取引可能。さらに、プログラムによる自動取引なら感情に左右されることもありません。
機械学習×自動取引の可能性
機械学習を組み合わせることで、以下のようなメリットがあります:
- パターン認識: 人間では見落としがちな市場のパターンを発見
- リスク管理: 統計的手法による適切な損切りライン設定
- 感情排除: プログラムなので恐怖や欲望に左右されない
- 継続的改善: バックテストによる戦略の継続的な改善
Freqtradeとは?基本概念の理解
Freqtradeの特徴
Freqtradeは、Python製のオープンソース仮想通貨取引ボットです。私が実際に使ってみて感じた主な特徴をご紹介します:
主要な特徴:
- 完全無料: オープンソースなので費用がかからない
- 豊富な取引所対応: Binance、Bittrex、Krakenなど主要取引所をサポート
- 柔軟な戦略設定: Pythonで独自の取引戦略を実装可能
- 充実したバックテスト機能: 過去データでの戦略検証が可能
- Webインターフェース: ブラウザから取引状況を監視可能
実際の導入体験談
私が初めてFreqtradeを触ったのは2023年の夏でした。最初は「本当に稼げるの?」と半信半疑でしたが、まずは小額(1万円相当)でテストを開始。
結果として、最初の1ヶ月で約5%のリターンを得ることができました。もちろん、これは相場環境にも左右される部分がありますが、自動で取引が実行される様子を見ていると「これは面白い!」と感じたのを覚えています。
Jesse:より高度な機械学習アプローチ
Jesseの位置づけ
Jesseは、Freqtradeよりも機械学習に特化した仮想通貨取引フレームワークです。私が両方を使い比べた印象をお話しします。
Jesseの特徴:
- 研究指向: より学術的なアプローチが可能
- 高度なバックテスト: 詳細な統計分析機能
- 機械学習統合: scikit-learnやTensorFlowとの連携が容易
- ペーパートレード: リアルマネーを使わないテスト取引
学習コストと実用性のバランス
正直に言うと、Jesseの方が学習コストは高いです。しかし、40代になって新しいことを学ぶのは決して遅くありません。むしろ、これまでのエンジニア経験があるからこそ、理解が早い部分もあります。
私の場合、Jesseを本格的に使い始めるまでに約2ヶ月かかりましたが、その分、より精密な戦略を構築できるようになりました。
環境構築:実践的なセットアップガイド
必要な環境準備
システム要件:
- Python 3.8以上
- 4GB以上のRAM
- 安定したインターネット接続
- 仮想通貨取引所のAPIキー
Freqtradeのインストール手順
# 仮想環境の作成
python -m venv freqtrade-env
# 仮想環境の有効化(Windows)
freqtrade-env\Scripts\activate
# 仮想環境の有効化(macOS/Linux)
source freqtrade-env/bin/activate
# Freqtradeのインストール
pip install freqtrade
# 設定ファイルの初期化
freqtrade create-userdir --userdir user_data取引所APIの設定
セキュリティ上の注意点:
私が実際に設定する際に気をつけているポイントをお話しします:
- APIキーの権限設定: 取引(Trade)権限のみ有効化し、出金(Withdraw)権限は無効化
- IP制限: 可能であれば使用するPCのIPアドレスを制限
- 少額でのテスト: 最初は必ず少額でテスト実行
{
"exchange": {
"name": "binance",
"key": "YOUR_API_KEY",
"secret": "YOUR_SECRET_KEY",
"ccxt_config": {
"enableRateLimit": true
}
}
}Jesseのセットアップ
# Jesseのインストール
pip install jesse
# 新しいプロジェクトの作成
jesse make-project my-bot
# プロジェクトディレクトリに移動
cd my-bot
# 依存関係のインストール
pip install -r requirements.txt基本的な取引戦略の実装
Freqtradeでの戦略作成
実際に私が使用している基本的な戦略をご紹介します。これは移動平均線をベースとしたシンプルな戦略です:
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
class SimpleMAStrategy(IStrategy):
# 最小ROI設定
minimal_roi = {
"0": 0.10, # 10%利益で利確
"40": 0.05, # 40分後は5%で利確
"120": 0.02, # 2時間後は2%で利確
"720": 0.01 # 12時間後は1%で利確
}
# ストップロス設定
stoploss = -0.05 # 5%下落で損切り
# タイムフレーム
timeframe = '5m'
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 短期移動平均線(5期間)
dataframe['ma_short'] = ta.SMA(dataframe, timeperiod=5)
# 長期移動平均線(20期間)
dataframe['ma_long'] = ta.SMA(dataframe, timeperiod=20)
# RSI
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
# 短期MAが長期MAを上抜け
(dataframe['ma_short'] > dataframe['ma_long']) &
# RSIが70以下(買われすぎでない)
(dataframe['rsi'] < 70) &
# 出来高が平均以上
(dataframe['volume'] > dataframe['volume'].rolling(20).mean())
),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
# 短期MAが長期MAを下抜け
(dataframe['ma_short'] < dataframe['ma_long']) |
# RSIが80以上(買われすぎ)
(dataframe['rsi'] > 80)
),
'exit_long'] = 1
return dataframe戦略の考え方
この戦略は以下の考え方に基づいています:
- トレンドフォロー: 移動平均線のゴールデンクロスでエントリー
- オーバーバイド回避: RSIで買われすぎを避ける
- 出来高確認: 出来高増加でシグナルの信頼性を高める
実際に使用してみた結果、勝率は約60%程度でしたが、利益の幅を大きく、損失の幅を小さく設定することで、全体的にはプラスのリターンを得ることができました。
Jesseでの機械学習戦略
Jesseでは、より高度な機械学習モデルを組み込むことができます:
import jesse.indicators as ta
from jesse.strategies import Strategy
from sklearn.ensemble import RandomForestClassifier
import numpy as np
class MLStrategy(Strategy):
def __init__(self):
super().__init__()
self.model = RandomForestClassifier(n_estimators=100)
self.is_trained = False
self.lookback = 100
def should_long(self) -> bool:
if not self.is_trained and len(self.candles) > self.lookback:
self._train_model()
if self.is_trained:
features = self._get_features()
prediction = self.model.predict_proba([features])[0]
return prediction[1] > 0.6 # 60%以上の確率で上昇予測
return False
def _get_features(self):
# テクニカル指標を特徴量として使用
close = self.candles[:, 2] # 終値
features = [
ta.rsi(close, 14)[-1], # RSI
ta.sma(close, 5)[-1] / ta.sma(close, 20)[-1], # MA比率
ta.macd(close)[0][-1], # MACD
(close[-1] - close[-5]) / close[-5], # 5期間リターン
np.std(close[-20:]) / np.mean(close[-20:]) # ボラティリティ
]
return features
def _train_model(self):
# 過去データで学習
X, y = self._prepare_training_data()
self.model.fit(X, y)
self.is_trained = Trueバックテストの実施と結果分析
Freqtradeでのバックテスト
戦略を実装したら、必ずバックテストを実行します。私が実際に行っている手順をご紹介します:
# データのダウンロード
freqtrade download-data --exchange binance --pairs BTC/USDT ETH/USDT --timeframes 5m --days 90
# バックテストの実行
freqtrade backtesting --strategy SimpleMAStrategy --timeframe 5m --timerange 20231001-20231201結果の見方と改善点の発見
実際のバックテスト結果例:
=================== STRATEGY SUMMARY ===================
| Pair | Entries | Avg Profit % | Tot Profit USDT | Win % |
|----------|---------|--------------|-----------------|-------|
| BTC/USDT | 45 | 1.23% | 553.45 | 62.2% |
| ETH/USDT | 38 | 0.98% | 372.18 | 58.9% |
| TOTAL | 83 | 1.12% | 925.63 | 60.8% |
Max Drawdown: 8.7%
Sharpe Ratio: 1.34
Profit Factor: 1.68
重要な指標の解釈
私が特に注目している指標:
- 勝率(Win %): 60%以上なら良好
- 最大ドローダウン: 10%以下に抑えたい
- シャープレシオ: 1.0以上が理想
- プロフィットファクター: 1.5以上が目標
リスク管理:失敗から学んだ教訓
私の失敗体験
正直にお話しすると、最初の頃はいくつかの失敗をしました:
失敗例1: 過度な最適化
バックテストで素晴らしい結果が出るように、パラメータを過度に最適化してしまいました。その結果、実際の取引では全く機能しない戦略になってしまいました。
失敗例2: 資金管理の甘さ
初期の頃、一回の取引で資金の10%以上を投入してしまい、数回の連続損失で大きな損失を被りました。
学んだリスク管理手法
1. 資金管理の徹底
# 一回の取引での最大リスクを資金の2%に制限
stake_amount = 0.02 # 2%
stake_currency = 'USDT'2. 分散投資
# 複数の通貨ペアで分散
pair_whitelist = [
'BTC/USDT',
'ETH/USDT',
'ADA/USDT',
'DOT/USDT',
'LINK/USDT'
]3. 動的ストップロス
def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
# 利益が出ている場合はトレーリングストップ
if current_profit > 0.02: # 2%以上の利益
return current_profit - 0.015 # 1.5%下落で利確
return self.stoploss # 通常のストップロス実運用での注意点とベストプラクティス
サーバー環境の選択
VPS(Virtual Private Server)の活用
自宅PCでの24時間稼働は現実的ではないため、私はVPSを利用しています:
- 推奨スペック: 2GB RAM、20GB SSD
- 費用: 月額500-1000円程度
- メリット: 24時間安定稼働、停電の心配なし
監視とメンテナンス
1. 日次チェック項目
- 取引実行状況の確認
- エラーログのチェック
- 残高の確認
2. 週次メンテナンス
- 戦略パフォーマンスの分析
- 市場環境の変化への対応
- バックアップの実施
3. 月次レビュー
- 総合的なパフォーマンス評価
- 戦略の見直しと改善
- リスク管理の再評価
トラブルシューティング
よくある問題と対処法:
問題1: 取引が実行されない
# ログレベルを上げてデバッグ
"logging": {
"loglevel": "DEBUG"
}問題2: APIエラー
- レート制限の確認
- APIキーの権限確認
- 取引所のメンテナンス情報確認
問題3: 想定以上の損失
- 即座にボットを停止
- 市場環境の変化を分析
- 戦略の見直し実施
まとめ:継続的な学習と改善が成功の鍵
現在の私の運用状況
現在、私は3つの異なる戦略で分散して運用しており、月平均で約3-5%のリターンを得ています。もちろん、毎月必ず利益が出るわけではありませんが、長期的には安定したパフォーマンスを維持できています。
40代エンジニアとして感じること
この年代だからこそ感じるのは、「新しい技術を学ぶことの楽しさ」と「実用性の重要さ」です。機械学習や自動取引は、私たちのようなエンジニアにとって、技術的興味と実用的メリットの両方を満たしてくれる分野だと思います。
これから始める方へのアドバイス
- 小額から始める: 最初は1-5万円程度の少額でスタート
- 継続的な学習: 市場は常に変化するため、継続的な学習が必要
- コミュニティ活用: FreqtradeやJesseのコミュニティは非常に活発
- 感情的にならない: 損失が出ても冷静に分析と改善を続ける
最後に
仮想通貨自動取引は魔法の杖ではありません。しかし、適切な知識とリスク管理があれば、私たち中年エンジニアにとって有効な副収入源になる可能性は十分にあります。
妻からは「また新しいことを始めて」と少し呆れられることもありますが(笑)、息子や娘の将来のためにも、新しいスキルを身につけて収入源を多様化することは重要だと考えています。
同じような思いを持つ仲間として、一緒に学び、一緒に成長していきましょう。きっと、新しい可能性が見えてくるはずです!
次のステップ:今すぐ行動に移そう
記事を読んでいただき、ありがとうございました。知識だけでは何も変わりません。ぜひ、以下のステップで実際に行動に移してみてください:
今週中に実行すること
- Python環境の構築(所要時間:30分)
- Freqtradeのインストール(所要時間:1時間)
- デモ取引所アカウントの開設(所要時間:30分)
今月中の目標
- 基本戦略の実装とバックテスト
- 少額での実運用開始(推奨:1-3万円)
一緒に新しい収入源を作り上げていきましょう!