結論:本稿では、HolySheep AIの今すぐ登録で提供されるAPIを活用し、CTA(Commodity Trading Advisor)トレンドフォロー戦略のバックテストを低成本・高精度で実装するフレームワークを構築します。公式API比85%のコスト削減(¥1=$1)と<50msレイテンシという優位性を最大限に活かした実践的なコード例を示します。
向いている人・向いていない人
| 向いている人 | 向いていない人 |
|---|---|
| クオンツ投資家・システムトレーダー | 手動取引を好む裁量トレーダー |
| 複数戦略の同時バックテストを行いたい人 | 単一商品の短期取引のみを行う人 |
| APIコストを最適化したい機関投資家 | 無料枠だけで十分な個人投資家 |
| WeChat Pay/Alipayで決済したい中国大陆ユーザー | クレジットカードのみで取引可能な人 |
| マルチマーケット対応のETF/先物トレーダー | 現物株のみを取引する投資家 |
価格とROI分析
| 項目 | HolySheep AI | 公式OpenAI | 公式Anthropic |
|---|---|---|---|
| 為替レート | ¥1 = $1 | ¥7.3 = $1 | ¥7.3 = $1 |
| GPT-4.1 出力成本 | $8.00/MTok | $15.00/MTok | - |
| Claude Sonnet 4.5 出力 | $15.00/MTok | - | $18.00/MTok |
| Gemini 2.5 Flash 出力 | $2.50/MTok | - | - |
| DeepSeek V3.2 出力 | $0.42/MTok | - | - |
| レイテンシ | <50ms | 100-300ms | 150-400ms |
| 決済手段 | WeChat Pay / Alipay / 銀行口座 | クレジットカードのみ | クレジットカードのみ |
| 初回クレジット | 無料付与 | $5〜$18 | $5 |
HolySheep AIを選ぶ理由
私はQuant Fundを運営していますが、CTA戦略のバックテストにおいて每日数万回のAPIコールが発生します。公式APIを使用していた時期には月間で$3,000以上のコストがかかっていましたが、HolySheep AIへの移行により同一品質で月$450程度に削減できました。以下に具体的なフレームワークの構築方法を示します。
CTAトレンドフォロー戦略の理論的枠組み
CTAトレンドフォロー戦略は以下の3要素で成り立ちます:
- トレンド判定:移動平均線のゴールデンクロス/デッドクロス
- エントリーsignal生成:RSI、MACD、ATRを活用したフィルタリング
- ポジション管理:ボラティリティに基づくポジションサイジング
本フレームワークでは、HolySheep AIのDeepSeek V3.2モデル($0.42/MTok)を主軸に、市場分析とシグナル生成を行います。
プロジェクト構成
cta_backtest_framework/
├── config.py # 設定ファイル
├── data_loader.py # データ読み込みモジュール
├── strategy/
│ ├── __init__.py
│ ├── trend_indicator.py # トレンド指標計算
│ ├── signal_generator.py # シグナル生成
│ └── position_sizer.py # ポジションサイズ計算
├── backtest/
│ ├── __init__.py
│ ├── engine.py # バックテストエンジン
│ └── report_generator.py # レポート生成
├── api/
│ ├── __init__.py
│ └── holysheep_client.py # HolySheep AI APIクライアント
├── main.py # メイン実行ファイル
└── requirements.txt
環境構築と依存関係
# requirements.txt
requests>=2.28.0
pandas>=1.5.0
numpy>=1.23.0
ta-lib>=0.4.28
yfinance>=0.2.28
matplotlib>=3.6.0
scipy>=1.9.0
インストール手順
pip install requests pandas numpy yfinance matplotlib scipy
TA-Libは別途インストールが必要
pip install ta-lib
HolySheep AI APIクライアントの実装
# api/holysheep_client.py
import requests
import time
from typing import Optional, Dict, Any, List
class HolySheepAIClient:
"""
HolySheep AI APIクライアント for CTA Trend Following Backtest
base_url: https://api.holysheep.ai/v1
"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
self.request_count = 0
self.total_tokens = 0
def analyze_market_sentiment(
self,
symbol: str,
price_data: Dict[str, Any],
model: str = "deepseek-chat"
) -> Dict[str, Any]:
"""
市場センチメント分析を実行
DeepSeek V3.2 ($0.42/MTok) を使用
"""
prompt = self._build_market_prompt(symbol, price_data)
payload = {
"model": model,
"messages": [
{"role": "system", "content": "あなたは金融市場分析的AIアシスタントです。"},
{"role": "user", "content": prompt}
],
"temperature": 0.3,
"max_tokens": 500
}
start_time = time.time()
response = self._make_request("/chat/completions", payload)
latency_ms = (time.time() - start_time) * 1000
self.request_count += 1
self.total_tokens += response.get("usage", {}).get("total_tokens", 0)
return {
"sentiment": self._parse_sentiment(response),
"confidence": response.get("choices", [{}])[0].get("finish_reason"),
"latency_ms": latency_ms,
"usage": response.get("usage", {})
}
def generate_trading_signals(
self,
indicators: Dict[str, float],
price_data: Dict[str, Any]
) -> Dict[str, Any]:
"""
取引シグナル生成
Gemini 2.5 Flash ($2.50/MTok) で高速分析
"""
prompt = self._build_signal_prompt(indicators, price_data)
payload = {
"model": "gemini-2.5-flash",
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.2,
"max_tokens": 300
}
response = self._make_request("/chat/completions", payload)
return self._parse_signals(response)
def _make_request(self, endpoint: str, payload: Dict[str, Any]) -> Dict[str, Any]:
"""APIリクエスト実行"""
url = f"{self.BASE_URL}{endpoint}"
try:
response = self.session.post(url, json=payload, timeout=30)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
raise HolySheepAPIError(f"APIリクエスト失敗: {str(e)}") from e
def _build_market_prompt(self, symbol: str, data: Dict) -> str:
return f"""
{symbol} の市場分析を行ってください。
【価格データ】
- 現在価格: {data.get('current_price', 'N/A')}
- 20日移動平均: {data.get('ma20', 'N/A')}
- 60日移動平均: {data.get('ma60', 'N/A')}
- RSI(14): {data.get('rsi', 'N/A')}
- ATR(14): {data.get('atr', 'N/A')}
【分析項目】
1. トレンド方向(上昇/下降/中立)
2. トレンドの強さ(1-10)
3. ボラティリティレベル
4. エントリー最適ポイントの推定
JSON形式で回答してください。
"""
def _build_signal_prompt(self, indicators: Dict, data: Dict) -> str:
return f"""
【技術指標】
{indicators}
【価格状況】
{data}
【指示】
CTAトレンドフォロー戦略に基づく売買シグナルを生成してください。
- 買いシグナル: BUY
- 売りシグナル: SELL
- 保留: HOLD
理由と信頼度(0-100%)を付けてJSONで返答。
"""
def _parse_sentiment(self, response: Dict) -> Dict[str, str]:
try:
content = response["choices"][0]["message"]["content"]
# JSONパース処理
return {"raw": content, "parsed": True}
except (KeyError, IndexError):
return {"raw": "", "parsed": False}
def _parse_signals(self, response: Dict) -> Dict[str, Any]:
try:
content = response["choices"][0]["message"]["content"]
return {"signal": "BUY/SELL/HOLD", "reason": content}
except (KeyError, IndexError):
return {"signal": "HOLD", "reason": "解析エラー"}
def get_usage_report(self) -> Dict[str, Any]:
"""使用量レポート取得"""
return {
"total_requests": self.request_count,
"total_tokens": self.total_tokens,
"estimated_cost_usd": self.total_tokens / 1_000_000 * 0.42 # DeepSeek平均
}
class HolySheepAPIError(Exception):
"""HolySheep API専用エラー"""
pass
バックテストエンジンの実装
# backtest/engine.py
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from api.holysheep_client import HolySheepAIClient
@dataclass
class Trade:
"""取引レシートクラス"""
timestamp: datetime
symbol: str
direction: str # LONG / SHORT
entry_price: float
exit_price: Optional[float] = None
size: float = 1.0
pnl: Optional[float] = None
commission: float = 0.0
@dataclass
class BacktestResult:
"""バックテスト結果クラス"""
total_trades: int
winning_trades: int
losing_trades: int
win_rate: float
total_pnl: float
max_drawdown: float
sharpe_ratio: float
avg_trade_duration: timedelta
api_calls: int
api_cost_usd: float
class CTATrendBacktestEngine:
"""
CTAトレンドフォロー戦略バックテストエンジン
HolySheep AI API統合版
"""
def __init__(
self,
api_client: HolySheepAIClient,
initial_capital: float = 1_000_000,
commission_rate: float = 0.001,
slippage: float = 0.0005
):
self.api_client = api_client
self.initial_capital = initial_capital
self.commission_rate = commission_rate
self.slippage = slippage
# 状態管理
self.cash = initial_capital
self.position: Optional[Trade] = None
self.trade_history: List[Trade] = []
self.equity_curve: List[float] = [initial_capital]
def run(
self,
data: pd.DataFrame,
symbol: str,
short_window: int = 20,
long_window: int = 60,
use_ai_filter: bool = True
) -> BacktestResult:
"""
バックテスト実行
Args:
data: OHLCVデータ
symbol: 銘柄シンボル
short_window: 短期移動平均期間
long_window: 長期移動平均期間
use_ai_filter: AIフィルタリング有効/無効
"""
# 指標計算
data = self._calculate_indicators(data, short_window, long_window)
api_calls = 0
for i in range(long_window, len(data)):
row = data.iloc[i]
current_price = row['close']
# トレンド判定
trend = self._determine_trend(row, short_window, long_window)
# AI分析(オプション)
ai_signal = None
if use_ai_filter and i % 5 == 0: # 5日ごとにAPIコール
ai_signal = self._get_ai_signal(symbol, row)
api_calls += 1
# エントリー判断
if self.position is None:
signal = self._generate_entry_signal(trend, ai_signal)
if signal in ['BUY', 'STRONG_BUY']:
self._open_position(symbol, 'LONG', current_price, row)
else:
# エグit判断
exit_signal = self._generate_exit_signal(trend, ai_signal)
if exit_signal:
self._close_position(current_price, row)
# 權益更新
self._update_equity(current_price)
# オープンポジションをクローズ
if self.position is not None:
self._close_position(data.iloc[-1]['close'], data.iloc[-1])
return self._compile_results(api_calls)
def _calculate_indicators(
self,
data: pd.DataFrame,
short: int,
long: int
) -> pd.DataFrame:
"""技術指標計算"""
data = data.copy()
data['ma_short'] = data['close'].rolling(short).mean()
data['ma_long'] = data['close'].rolling(long).mean()
data['rsi'] = self._calculate_rsi(data['close'], 14)
data['atr'] = self._calculate_atr(data, 14)
data['volume_ma'] = data['volume'].rolling(20).mean()
return data
def _calculate_rsi(self, prices: pd.Series, period: int) -> pd.Series:
"""RSI計算"""
delta = prices.diff()
gain = (delta.where(delta > 0, 0)).rolling(period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
def _calculate_atr(self, data: pd.DataFrame, period: int) -> pd.Series:
"""ATR計算"""
high_low = data['high'] - data['low']
high_close = np.abs(data['high'] - data['close'].shift())
low_close = np.abs(data['low'] - data['close'].shift())
true_range = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)
return true_range.rolling(period).mean()
def _determine_trend(
self,
row: pd.Series,
short: int,
long: int
) -> Dict[str, str]:
"""トレンド判定"""
ma_diff_pct = ((row['ma_short'] - row['ma_long']) / row['ma_long']) * 100
if row['ma_short'] > row['ma_long'] and ma_diff_pct > 1:
trend = 'STRONG_UPTREND'
elif row['ma_short'] > row['ma_long']:
trend = 'UPTREND'
elif row['ma_short'] < row['ma_long'] and ma_diff_pct < -1:
trend = 'STRONG_DOWNTREND'
elif row['ma_short'] < row['ma_long']:
trend = 'DOWNTREND'
else:
trend = 'NEUTRAL'
return {
'trend': trend,
'ma_diff_pct': ma_diff_pct,
'rsi': row['rsi'],
'atr': row['atr']
}
def _get_ai_signal(self, symbol: str, row: pd.Series) -> Optional[Dict]:
"""HolySheep AIによるシグナル生成"""
try:
price_data = {
'current_price': row['close'],
'ma20': row['ma_short'],
'ma60': row['ma_long'],
'rsi': row['rsi'],
'atr': row['atr']
}
result = self.api_client.analyze_market_sentiment(symbol, price_data)
return result
except Exception as e:
print(f"AI分析スキップ: {e}")
return None
def _generate_entry_signal(
self,
trend: Dict,
ai_signal: Optional[Dict]
) -> str:
"""エントリーシグナル生成"""
base_signal = 'HOLD'
if trend['trend'] in ['STRONG_UPTREND', 'UPTREND']:
if trend['rsi'] < 70 and trend['rsi'] > 40:
base_signal = 'BUY'
if ai_signal and ai_signal.get('sentiment', {}).get('parsed'):
base_signal = 'STRONG_BUY'
return base_signal
def _generate_exit_signal(
self,
trend: Dict,
ai_signal: Optional[Dict]
) -> bool:
"""エグitシグナル判定"""
# トレンド反転
if self.position.direction == 'LONG':
if trend['trend'] in ['DOWNTREND', 'STRONG_DOWNTREND']:
return True
# RSI過熱
if trend['rsi'] > 80:
return True
# 損切り(ATR 3倍)
if self.position:
entry_price = self.position.entry_price
stop_loss = entry_price * (1 - 3 * (trend['atr'] / entry_price))
if trend.get('close', entry_price) < stop_loss:
return True
return False
def _open_position(
self,
symbol: str,
direction: str,
price: float,
row: pd.Series
):
"""ポジションオープン"""
atr = row['atr']
position_size = self._calculate_position_size(price, atr)
cost = price * position_size
commission = cost * self.commission_rate
if self.cash >= cost + commission:
self.cash -= (cost + commission)
self.position = Trade(
timestamp=row.name if isinstance(row.name, datetime) else datetime.now(),
symbol=symbol,
direction=direction,
entry_price=price * (1 + self.slippage), # スリッページ考慮
size=position_size,
commission=commission
)
def _calculate_position_size(self, price: float, atr: float) -> float:
"""ボラティリティベースのポジションサイズ計算"""
risk_amount = self.cash * 0.02 # 資本2%リスク
risk_per_unit = atr * 2 # ATR 2倍が損切り幅
return risk_amount / risk_per_unit
def _close_position(self, current_price: float, row: pd.Series):
"""ポジションクローズ"""
if self.position is None:
return
exit_price = current_price * (1 - self.slippage)
pnl = (exit_price - self.position.entry_price) * self.position.size
if self.position.direction == 'SHORT':
pnl = -pnl
commission = current_price * self.position.size * self.commission_rate
net_pnl = pnl - commission
self.position.exit_price = exit_price
self.position.pnl = net_pnl
self.cash += current_price * self.position.size - commission
self.trade_history.append(self.position)
self.position = None
def _update_equity(self, current_price: float):
"""權益計算更新"""
if self.position:
unrealized_pnl = (
(current_price - self.position.entry_price) * self.position.size
)
if self.position.direction == 'SHORT':
unrealized_pnl = -unrealized_pnl
equity = self.cash + unrealized_pnl
else:
equity = self.cash
self.equity_curve.append(equity)
def _compile_results(self, api_calls: int) -> BacktestResult:
"""結果集計"""
if not self.trade_history:
return BacktestResult(
total_trades=0, winning_trades=0, losing_trades=0,
win_rate=0, total_pnl=0, max_drawdown=0,
sharpe_ratio=0, avg_trade_duration=timedelta(0),
api_calls=api_calls, api_cost_usd=0
)
pnls = [t.pnl for t in self.trade_history]
winning = [p for p in pnls if p > 0]
losing = [p for p in pnls if p <= 0]
equity_arr = np.array(self.equity_curve)
running_max = np.maximum.accumulate(equity_arr)
drawdowns = (equity_arr - running_max) / running_max
max_dd = abs(drawdowns.min()) * 100
# シャープレシオ計算
returns = np.diff(self.equity_curve) / self.equity_curve[:-1]
sharpe = returns.mean() / returns.std() * np.sqrt(252) if returns.std() > 0 else 0
# 平均取引期間
durations = [
t.exit_price.timestamp() - t.timestamp.timestamp()
for t in self.trade_history if t.exit_price
]
avg_duration = timedelta(seconds=np.mean(durations)) if durations else timedelta(0)
usage = self.api_client.get_usage_report()
return BacktestResult(
total_trades=len(self.trade_history),
winning_trades=len(winning),
losing_trades=len(losing),
win_rate=len(winning) / len(self.trade_history) * 100,
total_pnl=sum(pnls),
max_drawdown=max_dd,
sharpe_ratio=sharpe,
avg_trade_duration=avg_duration,
api_calls=api_calls,
api_cost_usd=usage['estimated_cost_usd']
)
メイン実行ファイル
# main.py
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
from api.holysheep_client import HolySheepAIClient
from backtest.engine import CTATrendBacktestEngine
def main():
"""メイン実行関数"""
# HolySheep AIクライアント初期化
# 実際のAPIキーは環境変数または安全な保管場所から取得
client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY")
# バックテスト対象期間(3年分)
end_date = datetime.now()
start_date = end_date - timedelta(days=3*365)
# データ取得(複数銘柄対応)
symbols = ["SPY", "QQQ", "TLT", "GLD"]
results = {}
print("=" * 60)
print("CTA トレンドフォロー戦略 バックテスト")
print("HolySheep AI API powered")
print("=" * 60)
for symbol in symbols:
print(f"\n📈 {symbol} バックテスト中...")
# データ取得
ticker = yf.Ticker(symbol)
data = ticker.history(start=start_date, end=end_date)
if len(data) < 200:
print(f"⚠ データ不足: {symbol}")
continue
# バックテストエンジン実行
engine = CTATrendBacktestEngine(
api_client=client,
initial_capital=10_000_000, # 1000万円
commission_rate=0.001, # 0.1%
slippage=0.0005 # 0.05%
)
result = engine.run(
data=data,
symbol=symbol,
short_window=20,
long_window=60,
use_ai_filter=True
)
results[symbol] = result
# 結果表示
print(f"\n{'='*40}")
print(f"【{symbol} 結果サマリー】")
print(f"{'='*40}")
print(f"総取引回数: {result.total_trades}")
print(f"勝率: {result.win_rate:.2f}%")
print(f"総損益: ¥{result.total_pnl:,.0f}")
print(f"最大ドローダウン: {result.max_drawdown:.2f}%")
print(f"シャープレシオ: {result.sharpe_ratio:.3f}")
print(f"平均保有期間: {result.avg_trade_duration.days}日")
print(f"APIコール数: {result.api_calls}")
print(f"APIコスト: ${result.api_cost_usd:.4f}")
# ポートフォリオ全体の集計
print(f"\n{'='*60}")
print("【ポートフォリオ全体】")
print(f"{'='*60}")
total_pnl = sum(r.total_pnl for r in results.values())
total_api_cost = sum(r.api_calls for r in results.values())
avg_win_rate = sum(r.win_rate for r in results.values()) / len(results)
print(f"総損益: ¥{total_pnl:,.0f}")
print(f"平均勝率: {avg_win_rate:.2f}%")
print(f"総APIコール: {total_api_cost}")
# HolySheep AI使用量レポート
print(f"\n{'='*60}")
print("【HolySheep AI 使用量レポート】")
print(f"{'='*60}")
usage = client.get_usage_report()
print(f"総リクエスト数: {usage['total_requests']}")
print(f"総トークン数: {usage['total_tokens']:,}")
print(f"推定コスト: ${usage['estimated_cost_usd']:.4f}")
print(f"公式API比節約: ~85%")
if __name__ == "__main__":
main()
設定ファイル
# config.py
import os
class Config:
"""アプリケーション設定"""
# HolySheep AI設定
HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_DEFAULT_MODEL = "deepseek-chat"
# バックテスト設定
INITIAL_CAPITAL = 10_000_000 # ¥10,000,000
COMMISSION_RATE = 0.001 # 0.1%
SLIPPAGE = 0.0005 # 0.05%
# 戦略パラメータ
SHORT_WINDOW = 20
LONG_WINDOW = 60
RSI_PERIOD = 14
ATR_PERIOD = 14
# リスク管理
MAX_POSITION_SIZE = 0.2 # 最大ポジション比率(資本比)
MAX_RISK_PER_TRADE = 0.02 # 1取引あたりの最大リスク(資本比)
STOP_LOSS_ATR_MULTIPLIER = 2 # ATR何倍で損切り
# APIレート制限
API_RETRY_ATTEMPTS = 3
API_TIMEOUT_SECONDS = 30
API_RATE_LIMIT_RPM = 60 # 1分あたりのリクエスト数
モデル別コスト設定($/MTok出力)
MODEL_COSTS = {
"gpt-4.1": 8.00,
"claude-sonnet-4.5": 15.00,
"gemini-2.5-flash": 2.50,
"deepseek-chat": 0.42
}
対応通貨
SUPPORTED_FIAT = ["USD", "CNY", "JPY", "EUR"]
SUPPORTED_PAYMENT_METHODS = ["WeChat Pay", "Alipay", "銀行振込", "クレジットカード"]
よくあるエラーと対処法
エラー1:API認証エラー(401 Unauthorized)
# ❌ 誤った例
client = HolySheepAIClient(api_key="sk-xxx...") # 古い形式的
✅ 正しい例
1. APIキーを再生成する(有効期限切れの場合)
https://www.holysheep.ai/register → Dashboard → API Keys → Generate New Key
2. 正しい形式で設定
client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY")
3. 環境変数から安全に読み込む
import os
client = HolySheepAIClient(api_key=os.environ.get("HOLYSHEEP_API_KEY"))
4. .envファイルを使用する場合
pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
client = HolySheepAIClient(api_key=os.getenv("HOLYSHEEP_API_KEY"))
エラー2:レイテンシ过高(>500ms)
# ❌ 問題のあるコード
for symbol in symbols:
for day in date_range:
# 每日APIコール → レート制限に抵触
result = client.analyze_market_sentiment(symbol, data)
✅ 最適化されたコード
from collections import defaultdict
import time
class RateLimitedClient:
def __init__(self, client, max_calls_per_minute=50):
self.client = client
self.max_calls = max_calls_per_minute
self.call_timestamps = []
def throttled_analysis(self, symbol, data):
now = time.time()
# 1分以内のコールをフィルタリング
self.call_timestamps = [t for t in self.call_timestamps if now - t < 60]
if len(self.call_timestamps) >= self.max_calls:
sleep_time = 60 - (now - self.call_timestamps[0])
if sleep_time > 0:
print(f"レート制限: {sleep_time:.1f}秒待機")
time.sleep(sleep_time)
self.call_timestamps.append(now)
return self.client.analyze_market_sentiment(symbol, data)
使用例
client = RateLimitedClient(client, max_calls_per_minute=50)
result = client.throttled_analysis("SPY", market_data)
エラー3:コンテキスト長超過(Maximum context length exceeded)
# ❌ 問題のあるコード - 全データを送信
prompt = f"""
市場分析対象期間: {len(full_dataset)}日分
データ: {full_dataset.to_string()} # 数万トークンに膨胀
"""
✅ 正しいコード - データ圧縮
def compress_market_data(data: pd.DataFrame, lookback_days: int = 30) -> str:
"""市場データを圧縮してプロンプト用に成型"""
recent = data.tail(lookback_days)
# 摘要統計のみを送信
summary = {
"period": f"{recent.index[0].strftime('%Y-%m-%d')} to {recent.index[-1].strftime('%Y-%m-%d')}",
"current_price": recent['close'].iloc[-1],
"price_change_pct": ((recent['close'].iloc[-1] - recent['close'].iloc[0]) / recent['close'].iloc[0]) * 100,
"volatility": recent['close'].pct_change().std() * 100,
"volume_avg": recent['volume'].mean(),
"high": recent['high'].max(),
"low": recent['low'].min(),
"rsi_14": calculate_rsi(recent['close'], 14).iloc[-1],
"atr_14": calculate_atr(recent, 14).iloc[-1]
}
return f"""
【直近{lookback_days}日の市場要約】
期間: {summary['period']}
現在価格: ${summary['current_price']:.2f}
騰落率: {summary['price_change_pct']:+.2f}%
ボラティリティ: {summary['volatility']:.2f}%