機械学習による仮想通貨価格予測 第1部:時系列データの前処理とテクニカル指標【実践ガイド】
機械学習による仮想通貨価格予測 第1部:時系列データの前処理とテクニカル指標【実践ガイド】
はじめに:なぜデータ前処理がLSTM仮想通貨価格予測の精度を左右するのか
ねえねえ、キミ!!仮想通貨の価格予測をLSTMでやろうとして、「なんかモデルの精度が全然出ないんだけど……😭」ってなってナイ!?
僕、最初めちゃくちゃハマったんですヨ……。生データをそのままLSTMにぶっ込んだら、損失関数がNaNを吐き続けてネ。夜中の2時に「ナンデ!!!?」って声が出て、妻に「また変な声出してる、いい加減にしなさい!!」って怒られちゃいましたヨ😭。ファミコンのカセット吹いてた頃からの「とりあえずやってみる」クセ、直さないとなあ……。
でもネ、結局のところ 「ゴミを入れればゴミが出る(Garbage In, Garbage Out)」 ってコトですヨ!!どんなに最新のLSTMモデルを組んでも、前処理が雑なら予測も雑。コレ、真理デス。
仮想通貨データって、他の金融データと比べてもマジで難易度が高いんですヨ🔥。
- 高ボラティリティ:1日で±30%とか普通にあるじゃないデスカ!!
- フラッシュクラッシュ:瞬間的に−20%叩き出して、すぐ戻るアレ。モデルが大混乱するやつ😅
- 欠損データ:取引所のメンテや障害で、ロウソク足がポッカリ抜けることがある
そしてネ、2025年の最新研究を見ると、「Helformer」とか「Attention Transformer + GRUハイブリッド」みたいな超スゴいアーキテクチャが出てきてるんだヨ!!でもコレらも、入力データの品質が悪ければ宝の持ち腐れデスネ💡。前処理が基礎中の基礎ってコト、改めて実感しちゃいましたヨ!!
本シリーズの全体構成
本記事は全3部構成の第1部デス🎵。
| 部 | 内容 |
|---|---|
| 第1部(本記事) | 時系列データの前処理・テクニカル指標・正規化 |
| 第2部 | PyTorchによるLSTMモデルの設計と学習 |
| 第3部 | モデル評価・バックテスト・実運用 |
第1部で実装するパイプライン全体像
この記事を読み終わったら、キミはこのパイプラインを自力で実装できるようになりますヨ!!
生OHLCVデータ取得(CCXT)
→ 欠損値の線形補間
→ IQRクリッピングで外れ値処理
→ RSI / MACD / ATR / ボリンジャーバンド追加
→ RobustScalerで正規化(データリーク防止)
→ Train/Test分割(80:20)
動作環境・使用ライブラリ
Python 3.12+
ccxt 4.x
pandas-ta 0.3.14b
scikit-learn 1.4+
pandas 2.x
numpy 1.26+
インストールはこれだけデス!!
pip3 install ccxt pandas-ta scikit-learn pandas numpy matplotlib seabornじゃあ始めますヨ!!🦝
1. CCXTを使った仮想通貨OHLCVデータの取得
1-1. CCXTとは:100以上の取引所を統一APIで扱えるライブラリ
キミ、CCXTって知ってる!?コレ、マジでオススメですヨ!!😆
CCXT(CryptoCurrency eXchange Trading) は、Binance・Bybit・Coinbaseなど 100以上の取引所 を、ひとつの統一されたAPIで叩けるライブラリなんですヨ🎉。取引所ごとに違うAPI仕様を全部ラップしてくれてるから、コードの使い回しが超楽チン!!
インストールはコレだけデス。
pip3 install ccxtBinanceをメインのデータソースとしてオススメするのはネ、流動性が世界最大級で欠損が少ない のと、1リクエストで最大1000件のロウソク足 が取れるから。データの質と量、どっちも大事ですヨ💡
OHLCVデータの構造 はこんな感じデスネ。
| 項目 | 英語 | 意味 |
|---|---|---|
| O | Open | 始値:その時間足の最初の取引価格 |
| H | High | 高値:その時間足の最高取引価格 |
| L | Low | 安値:その時間足の最低取引価格 |
| C | Close | 終値:その時間足の最後の取引価格 |
| V | Volume | 出来高:その時間足の総取引量 |
「終値だけあればいいじゃん」って思うかもしれないケドネ、High と Low の差はATR計算に必要だし、Volumeは市場参加者の熱量を表すんですヨ🎵。全部大事!!
1-2. Binanceから過去データを取得する基本実装
exchange.fetch_ohlcv() の基本的な使い方から確認しておきますヨ!!
import ccxt
import pandas as pd
exchange = ccxt.binance({'enableRateLimit': True})
# 基本的なOHLCV取得(最新1000件)
ohlcv = exchange.fetch_ohlcv('BTC/USDT', timeframe='1h', limit=1000)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms', utc=True)
df = df.set_index('timestamp')
print(df.tail())時間足の選択はユースケースによって変えてネ💡。
| 時間足 | 適したユースケース |
|---|---|
1h |
短期予測(1〜3日先)・デイトレ補助 |
4h |
中期予測(3〜7日先) |
1d |
長期トレンド分析(7〜30日先) |
1-3. 数年分データ取得に必須のページネーション実装
ちょっと聞いてヨ……僕、コレでやらかしちゃったんだヨネ😭。
最初 limit=1000 だけで取得してたら「あれ、1000件しかないじゃん」ってなって。Binanceって1リクエストで 最大1000件 しか返してくれないんですヨ!!数年分のデータが欲しいときは、since パラメータを使ったページネーション実装が必須デス🔥
あと、レート制限を無視してガンガン叩くとIPBANされちゃうから、exchange.sleep(1000) の挿入も忘れずにネ!! じゃあコードいくヨ!!✨
import ccxt
import pandas as pd
import time
def fetch_ohlcv_all(
symbol: str = 'BTC/USDT',
timeframe: str = '1h',
start_date: str = '2022-01-01',
exchange_name: str = 'binance'
) -> pd.DataFrame:
"""
CCXTでページネーションを使った全件OHLCV取得
Args:
symbol : 通貨ペア(例: 'BTC/USDT')
timeframe : 時間足(例: '1h', '4h', '1d')
start_date : 取得開始日('YYYY-MM-DD'形式)
exchange_name: 取引所名
Returns:
OHLCVデータのDataFrame(timestampをインデックス)
"""
exchange = getattr(ccxt, exchange_name)({
'rateLimit': 1200,
'enableRateLimit': True,
})
since = exchange.parse8601(f'{start_date}T00:00:00Z')
all_ohlcv = []
limit = 1000 # Binanceの1リクエスト上限
print(f"データ取得開始: {symbol} / {timeframe} / {start_date} 〜")
while True:
try:
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, since=since, limit=limit)
if not ohlcv:
break
all_ohlcv.extend(ohlcv)
since = ohlcv[-1][0] + 1 # 最後のタイムスタンプの次から取得
print(f" 取得中: {len(all_ohlcv)}件...")
# レート制限対策:1秒待機
exchange.sleep(1000)
# 現在時刻を超えたら終了
if since > exchange.milliseconds():
break
except ccxt.NetworkError as e:
print(f"ネットワークエラー: {e} → 3秒後リトライ")
time.sleep(3)
except ccxt.ExchangeError as e:
print(f"取引所エラー: {e}")
break
# DataFrameに変換・整形
df = pd.DataFrame(
all_ohlcv,
columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms', utc=True)
df = df.set_index('timestamp').sort_index()
df = df[~df.index.duplicated(keep='first')] # 重複除去
df = df.astype(float)
print(f"取得完了: {len(df)}件 | {df.index[0]} 〜 {df.index[-1]}")
return df
# 実行例
if __name__ == '__main__':
df_raw = fetch_ohlcv_all(
symbol='BTC/USDT',
timeframe='1h',
start_date='2022-01-01'
)
print(df_raw.shape)
print(df_raw.head())動いた時、ターミナルに 取得完了: 21432件 って出た瞬間、思わず「よっしゃ!!」って声出ちゃいましたヨ😆 またしても妻に怒られたケド!!(笑)
2. 機械学習前処理の基本:欠損値の検出と補完
2-1. 仮想通貨データに欠損値が生じる主な原因
「え、仮想通貨って24時間動いてるのに欠損値なんてあるの?」ってキミ、思ってナイ!?😅
あるんですヨ、普通に!!
- 取引所の 定期メンテナンス(Binanceも月1〜2回やる)
- API障害 によるデータ取得失敗
- 流動性枯渇(アルトコインの薄い時間帯)
欠損値を放置したままLSTMに食わせると、NaNが伝播して損失関数が爆発しますヨ……経験者は語る😭。まず isnull().sum() で状況確認するクセをつけておきましょうネ💡。
# 欠損値の確認
missing = df_raw.isnull().sum()
missing_pct = (missing / len(df_raw)) * 100
print(missing_pct)2-2. 時系列の連続性を守る線形補間の実装
欠損値補完のベストプラクティスは、線形補間(interpolate('linear')) デスネ🎵。
時系列データは「前後の値が連続している」という前提でテクニカル指標を計算するんですヨ。単純に前の値をコピーする ffill(前方埋め)だと、「全然動いていない」ウソのデータになっちゃう。線形補間なら、前後の値の間を自然につないでくれるデス!!
| 補完手法 | 特徴 | 推奨度 |
|---|---|---|
interpolate('linear') |
前後の値を線形補間。時系列の連続性を保つ | ◎ 推奨 |
ffill |
前の値をそのままコピー。ラグが生じる | △ 価格には不向き |
bfill |
後ろの値をそのままコピー。未来情報が混入するリスク | △ 要注意 |
コレ見てよ!!スゴくナイ!?✨
import pandas as pd
import numpy as np
def handle_missing_values(df: pd.DataFrame) -> pd.DataFrame:
"""
欠損値の検出と補完
- 価格(OHLC): 線形補間で時系列の連続性を保持
- 出来高(Volume): 0補完(取引なしとして扱う)
"""
df = df.copy()
# --- 欠損値レポート ---
missing = df.isnull().sum()
missing_pct = (missing / len(df)) * 100
print("=== 欠損値レポート ===")
for col in df.columns:
if missing[col] > 0:
print(f" {col}: {missing[col]}件 ({missing_pct[col]:.2f}%)")
else:
print(f" {col}: 欠損なし")
if (missing_pct > 5).any():
print("WARNING: 欠損値が5%超のカラムがあります。データソースを確認してください。")
# --- 欠損値補完 ---
# 価格は線形補間
for col in ['open', 'high', 'low', 'close']:
if col in df.columns:
df[col] = df[col].interpolate(method='linear', limit_direction='both')
# 出来高は0補完(取引なし)
if 'volume' in df.columns:
df['volume'] = df['volume'].fillna(0)
# 補完後の確認
remaining_missing = df.isnull().sum().sum()
print(f"\n補完後の欠損値合計: {remaining_missing}件")
return df
# 実行例
df_clean = handle_missing_values(df_raw)
print(df_clean.isnull().sum())欠損0件になった時の安心感ったらないですヨ!!😆
3. LSTM学習品質を守る外れ値の検出とIQRクリッピング
3-1. フラッシュクラッシュが生み出す外れ値の特性
キミ、「フラッシュクラッシュ」って知ってる!?🔥
2010年のビットコイン黎明期とか、最近だとアルトコインで瞬間−40%みたいなやつ。数分で元値に戻るけど、その1本のローソク足がデータにしっかり残るんですヨ。コレがLSTMにとってどれほど有害かってゆうと——損失スケールがその1点に引きずられて、モデル全体の勾配が爆発するんデス!!(勾配爆発って、LSTMあるあるデスネ😅)
つまり、フラッシュクラッシュの外れ値は「例外的な市場イベント」であって、「LSTMが学習すべきパターン」ではないんですヨ💡。コレを取り除くのが外れ値処理の目的デス。
外れ値の検出手法にはいくつか種類があるんだケドネ、仮想通貨に特にオススメなのが IQR法(四分位範囲法) デス!!
| 手法 | 特徴 | 推奨度 |
|---|---|---|
| IQR法 | 中央値ベースで外れ値に頑健。正規分布を仮定しない | ◎ 推奨 |
| Zスコア法 | 平均・標準偏差ベース。高ボラ資産には不向き | △ |
| パーセンタイル法 | シンプルだが閾値設定が恣意的になりやすい | △ |
IQR法のロジックはシンプルデスネ。Q1(25パーセンタイル)とQ3(75パーセンタイル)の差がIQR(四分位範囲)デス。その multiplier × IQR を超える値をクリップするんですヨ!!
下限 = Q1 - multiplier × IQR
上限 = Q3 + multiplier × IQR
multiplier のデフォルトは 3.0 にしておくのがオススメデスネ。2.0だと正常な急騰・急落まで削ってしまうことがあるので、仮想通貨データには少し余裕を持たせた3.0が無難ですヨ💡。
3-2. IQRクリッピング関数の完全実装
ここが今回のハイライトデス!!よく見てネ!!🔥
import pandas as pd
import numpy as np
def clip_outliers_iqr(
df: pd.DataFrame,
columns: list = None,
multiplier: float = 3.0
) -> pd.DataFrame:
"""
IQR法による外れ値クリッピング
Args:
df : 対象DataFrame
columns : 処理対象カラム(Noneなら数値カラム全て)
multiplier: IQR倍率(デフォルト3.0)
Returns:
外れ値クリッピング済みのDataFrame
"""
df = df.copy()
if columns is None:
columns = df.select_dtypes(include=[np.number]).columns.tolist()
clip_report = {}
for col in columns:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - multiplier * IQR
upper = Q3 + multiplier * IQR
n_clipped = ((df[col] < lower) | (df[col] > upper)).sum()
clip_report[col] = {
'lower': lower,
'upper': upper,
'n_clipped': n_clipped,
}
df[col] = df[col].clip(lower=lower, upper=upper)
print("=== IQRクリッピング レポート ===")
for col, info in clip_report.items():
print(
f" {col}: {info['n_clipped']}件クリップ"
f" | 範囲 [{info['lower']:.4f}, {info['upper']:.4f}]"
)
return df
# 実行例
df_clipped = clip_outliers_iqr(df_clean, multiplier=3.0)
print(df_clipped.describe())実行すると各カラムのクリップ件数と範囲が表示されますヨ!!BTCデータだと close カラムが2〜3件クリップされる感じデスネ😆
4. テクニカル指標の追加:RSI・MACD・ATR・ボリンジャーバンド
4-1. テクニカル指標がLSTMの予測精度を向上させる理由
「価格データだけでLSTMが学習できるなら、指標って要らなくナイ!?」って思うキミ!!
実はネ、テクニカル指標を加えることで予測精度が 体感で5〜15% 改善するケースが多いんですヨ🎵。なぜかってゆうと——LSTMが「生の価格」だけを見ても、「今この価格が高すぎるのか、ちょうどいいのか」を判断する文脈情報が足りないんデス。そこにRSIを加えると「過買いゾーンだよ」という文脈が、MACDを加えると「モメンタムが転換しそうだよ」という文脈が加わるんですヨ💡。
今回追加するのはこの4つデス!!
| 指標 | パラメータ | 役割 |
|---|---|---|
| RSI | 14期間 | 相対力指数。過買い(70超)・過売り(30未満)を数値化 |
| MACD | 12/26/9 | モメンタム指標。シグナルとのクロスが売買タイミングの参考に |
| ATR | 14期間 | 平均真のレンジ。ボラティリティの絶対値を表す |
| ボリンジャーバンド | 20期間・2σ | バンド幅でボラティリティと相対的な価格位置を表現 |
4-2. pandas-taによるテクニカル指標の一括実装
pandas-ta は、100種類以上のテクニカル指標を1行で計算できる神ライブラリデスヨ!!コレ使わない手はないデス!! じゃあ実装いきますヨ!!🔥
import pandas as pd
import pandas_ta as ta
def add_technical_indicators(df: pd.DataFrame) -> pd.DataFrame:
"""
テクニカル指標の追加
追加指標: RSI(14), MACD(12,26,9), ATR(14), ボリンジャーバンド(20,2σ)
Args:
df: OHLCVカラムを持つDataFrame
Returns:
テクニカル指標カラムを追加したDataFrame
※ウォームアップ期間のNaN行は削除済み
"""
df = df.copy()
# RSI(14期間)
df['RSI_14'] = ta.rsi(df['close'], length=14)
# MACD(12, 26, 9)
macd = ta.macd(df['close'], fast=12, slow=26, signal=9)
df['MACD'] = macd['MACD_12_26_9']
df['MACD_signal'] = macd['MACDs_12_26_9']
df['MACD_hist'] = macd['MACDh_12_26_9']
# ATR(14期間)
df['ATR_14'] = ta.atr(df['high'], df['low'], df['close'], length=14)
# ボリンジャーバンド(20期間・2σ)
bbands = ta.bbands(df['close'], length=20, std=2)
df['BB_upper'] = bbands['BBU_20_2.0']
df['BB_middle'] = bbands['BBM_20_2.0']
df['BB_lower'] = bbands['BBL_20_2.0']
# バンド幅(ボラティリティの相対的な大きさ)
df['BB_width'] = (df['BB_upper'] - df['BB_lower']) / df['BB_middle']
# ウォームアップ期間(NaN行)を削除
before = len(df)
df = df.dropna()
after = len(df)
print(f"テクニカル指標追加完了")
print(f" 追加カラム: RSI_14, MACD, MACD_signal, MACD_hist, ATR_14, BB_upper, BB_middle, BB_lower, BB_width")
print(f" ウォームアップ期間で削除した行数: {before - after}件")
print(f" 処理後データ件数: {after}件")
return df
# 実行例
df_featured = add_technical_indicators(df_clipped)
print(df_featured.columns.tolist())
print(df_featured.tail())「RSI_14」「MACD_hist」「BB_width」あたりはLSTMがめちゃくちゃ好む特徴量なんですヨ!!実際に第2部でモデルを組んでみると、コレらが上位の重要特徴量として出てくることが多いデス😆!!
5. RobustScalerによる正規化とデータリーク防止
5-1. 仮想通貨データにRobustScalerが適している理由
正規化の話、キミにしっかり聞いてほしいんですヨ!!コレ、めちゃくちゃ大事デス🔥
仮想通貨データの正規化にオススメするのは RobustScaler デスネ。StandardScalerやMinMaxScalerじゃなくて、なぜRobustなのか?——さっきまで一生懸命IQRクリッピングをかけたけど、完全には消えないケースもあるんですヨ。その残った外れ値に一番強いのがRobustScalerなんデス!!
| スケーラー | 基準統計量 | 外れ値への耐性 | 仮想通貨への適合 |
|---|---|---|---|
| StandardScaler | 平均・標準偏差 | 弱い | △ 外れ値に引きずられやすい |
| MinMaxScaler | 最小値・最大値 | 非常に弱い | ✕ フラッシュクラッシュ1点で歪む |
| RobustScaler | 中央値・IQR | 強い | ◎ 推奨 |
RobustScalerは、平均じゃなくて「中央値」を引いて、「IQR」で割るんですヨ💡。だから残存した外れ値があっても影響が最小限になるんデス!!
5-2. データリーク防止の鉄則:Testデータでfitしてはいけない
コレ、めちゃくちゃ重要なポイントなんで、強調しますヨ!!😤
スケーラーは必ずTrainデータのみで fit() すること!!
もしTestデータも含めた全データで fit() してしまうと——Testデータの統計量がスケーリングに混入してしまうんですヨ。コレが「データリーク」デス。モデルがTestデータの情報を間接的に学習した状態になってしまうから、バックテストの精度がウソになっちゃうんデス😭。
# NG: 全データでfit(データリーク発生!)
scaler.fit(df_all)
# OK: Trainデータのみでfit
scaler.fit(df_train)
df_train_scaled = scaler.transform(df_train)
df_test_scaled = scaler.transform(df_test) # transformのみさらに、時系列データの分割では シャッフルしないこと も鉄則デスヨ!!未来のデータが過去として使われてしまうんデス!!
5-3. Train/Test分割と正規化の一体実装
ここ、パイプライン全体の締めくくりデス!!しっかり確認してネ!!✨
import pandas as pd
import numpy as np
from sklearn.preprocessing import RobustScaler
def split_and_scale(
df: pd.DataFrame,
test_ratio: float = 0.2
) -> tuple[pd.DataFrame, pd.DataFrame, RobustScaler]:
"""
時系列Train/Test分割 + RobustScalerによる正規化(データリーク防止)
Args:
df : テクニカル指標追加済みのDataFrame
test_ratio: テストデータの割合(デフォルト0.2 = 20%)
Returns:
(df_train_scaled, df_test_scaled, scaler)
※scalerは予測値の逆変換に必要なため返却
"""
# 時系列分割(シャッフルしない!)
split_idx = int(len(df) * (1 - test_ratio))
df_train = df.iloc[:split_idx].copy()
df_test = df.iloc[split_idx:].copy()
print("=== Train/Test 分割結果 ===")
print(f" Train: {len(df_train)}件 | {df_train.index[0]} 〜 {df_train.index[-1]}")
print(f" Test : {len(df_test)}件 | {df_test.index[0]} 〜 {df_test.index[-1]}")
feature_cols = df.columns.tolist()
# スケーラーをTrainデータのみでfit(データリーク防止)
scaler = RobustScaler()
scaler.fit(df_train[feature_cols])
# 変換
df_train_scaled = df_train.copy()
df_test_scaled = df_test.copy()
df_train_scaled[feature_cols] = scaler.transform(df_train[feature_cols])
df_test_scaled[feature_cols] = scaler.transform(df_test[feature_cols])
print("\n=== 正規化後の統計量(Train) ===")
print(df_train_scaled.describe().round(3))
return df_train_scaled, df_test_scaled, scaler
# 実行例
df_train, df_test, scaler = split_and_scale(df_featured, test_ratio=0.2)
print(f"\nTrain shape: {df_train.shape}")
print(f"Test shape: {df_test.shape}")scaler オブジェクトは第3部のバックテスト時に逆変換(inverse_transform)で使うから、必ず保存しておきましょうネ!!📡
まとめ:完成した前処理パイプラインを確認しよう
キミ、お疲れさまでしたヨ!!🎉
第1部で実装したパイプライン全体をまとめるとこんな感じデス!!
# ===== 前処理パイプライン 完成形 =====
# Step 1: OHLCVデータ取得
df_raw = fetch_ohlcv_all(
symbol='BTC/USDT',
timeframe='1h',
start_date='2022-01-01'
)
# Step 2: 欠損値補完
df_clean = handle_missing_values(df_raw)
# Step 3: 外れ値クリッピング
df_clipped = clip_outliers_iqr(df_clean, multiplier=3.0)
# Step 4: テクニカル指標追加
df_featured = add_technical_indicators(df_clipped)
# Step 5: 正規化 + Train/Test分割
df_train, df_test, scaler = split_and_scale(df_featured, test_ratio=0.2)
print("前処理パイプライン完了!!")
print(f"Train: {df_train.shape}, Test: {df_test.shape}")このパイプラインで得られた df_train と df_test が、第2部のLSTMモデル学習の入力になりますヨ!!🔥
第1部の要点まとめ
| ステップ | 手法 | ポイント |
|---|---|---|
| データ取得 | CCXT + ページネーション | レート制限を守る・重複除去を忘れずに |
| 欠損値補完 | 線形補間(interpolate) |
価格は線形補間・出来高は0補完 |
| 外れ値処理 | IQRクリッピング(multiplier=3.0) | 仮想通貨には3.0が無難 |
| テクニカル指標 | RSI/MACD/ATR/BBands | pandas-ta で一括計算 |
| 正規化 | RobustScaler | Trainのみで fit してデータリークを防ぐ |
| データ分割 | 時系列80:20 | シャッフルしない! |
最初に夜中の2時に「ナンデ!!!?」ってなってた僕が、コレを実装してからモデルの損失が安定して収束するようになった時は、本当に嬉しかったですヨ!!😆
やらかしちゃいましたヨ……😭 あの頃の僕に、この記事を読ませてあげたかったデス……。
第2部 ではPyTorchを使ったLSTMモデルの設計と学習を解説しますヨ!!お楽しみにネ!!🦝
本記事のコードはPython 3.12 + ccxt 4.x + pandas-ta 0.3.14b + scikit-learn 1.4+ で動作確認済みデス。
関連記事
機械学習による仮想通貨価格予測 第3部:バックテストと自動売買システム統合【完全ガイド】
機械学習・仮想通貨・バックテストの落とし穴を徹底解説。自動売買・ウォークフォワード最適化・FreqAI・モデル劣化対策まで、プロダクション実装の全手順をPythonコード付きで解説するヨ!
プロンプトエンジニアリングの"次" — コンテキストエンジニアリングが変えるAIエージェント設計の常識
プロンプトを書き直しても改善しないAIエージェント設計に悩んでいませんか?コンテキストエンジニアリングの定義からLLMの失敗パターン4選・RAG・メモリ設計・マルチエージェント構成まで、今日から使える設計パターンを実体験とコード付きで解説します。
RAGFlowで構築する高精度なオープンソースRAG:40代エンジニアが実践してみた完全ガイド
オープンソースのRAGFlowを使って高精度な検索拡張生成システムを構築する方法を、40代エンジニアが実際に試した経験をもとに詳しく解説します。