78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
"""
|
|
변동성 돌파(Volatility Breakout) 전략 구현체
|
|
|
|
볼린저 밴드, ATR 등 변동성 기반 돌파 전략들을 포함합니다.
|
|
"""
|
|
|
|
from typing import Dict, Any
|
|
import time
|
|
import random
|
|
from ..base import BaseQuantStrategy, strategy
|
|
|
|
|
|
@strategy
|
|
class BollingerBandBreakout(BaseQuantStrategy):
|
|
"""볼린저 밴드 돌파 전략"""
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "BollingerBandBreakout"
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "볼린저 밴드 상한선 돌파시 매수, 하한선 돌파시 매도하는 돌파 전략"
|
|
|
|
@property
|
|
def version(self) -> str:
|
|
return "2.0.0"
|
|
|
|
@property
|
|
def default_parameters(self) -> Dict[str, Any]:
|
|
return {
|
|
"period": 20,
|
|
"std_dev": 2.0,
|
|
"initial_capital": 100000,
|
|
"position_size": 0.08,
|
|
"stop_loss": 0.05
|
|
}
|
|
|
|
def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
|
|
required_params = ["period", "std_dev", "initial_capital"]
|
|
for param in required_params:
|
|
if param not in parameters:
|
|
return False
|
|
|
|
if parameters["std_dev"] <= 0 or parameters["period"] <= 0:
|
|
return False
|
|
|
|
return True
|
|
|
|
def execute(self, parameters: Dict[str, Any] = None) -> Dict[str, Any]:
|
|
if parameters is None:
|
|
parameters = self.default_parameters
|
|
|
|
if not self.validate_parameters(parameters):
|
|
raise ValueError("Invalid parameters")
|
|
|
|
# 시뮬레이션 실행
|
|
time.sleep(2) # 실행 시간 시뮬레이션
|
|
|
|
# 모의 결과 생성
|
|
profit_rate = random.uniform(-0.20, 0.30)
|
|
trades_count = random.randint(10, 40)
|
|
win_rate = random.uniform(0.35, 0.70)
|
|
|
|
return {
|
|
"strategy": self.name,
|
|
"version": self.version,
|
|
"profit_loss": round(parameters["initial_capital"] * profit_rate, 2),
|
|
"profit_rate": round(profit_rate * 100, 2),
|
|
"trades_executed": trades_count,
|
|
"win_rate": round(win_rate, 3),
|
|
"execution_time": "2.0s",
|
|
"parameters_used": parameters,
|
|
"final_capital": round(parameters["initial_capital"] * (1 + profit_rate), 2),
|
|
"sharpe_ratio": round(random.uniform(0.5, 2.5), 2),
|
|
"volatility": round(random.uniform(0.15, 0.35), 3)
|
|
}
|