암호화폐 거래 데이터를 기반으로 AI 예측 모델을 구축하고 싶으신가요? 이 튜토리얼에서는 OKX 거래소에서 과거 K-라인(캔들스틱) 데이터를 자동 수집하고, HolySheep AI를 활용하여 실시간 분석 파이프라인을 구축하는 방법을 단계별로 안내합니다.
저는 실제 암호화폐 AI 트레이딩 봇을 개발하면서 이 파이프라인을 구축했습니다. 처음에는 수동으로 데이터를 수집했지만, 지금은 cron 스케줄러를 통해 자동으로 데이터를 수집하고 HolySheep AI로 시장 분석 리포트를 생성하고 있습니다.
필수 준비물과 환경 설정
시작하기 전에 다음 환경이 필요합니다:
- Python 3.8 이상
- OKX 거래소 계정 (데모 거래소로 테스트 가능)
- HolySheep AI 계정 (AI 분석용)
- pip 패키지 관리자
가상환경을 생성하고 필수 패키지를 설치하겠습니다:
# 가상환경 생성 (Windows)
python -m venv trading_env
trading_env\Scripts\activate
가상환경 생성 (macOS/Linux)
python3 -m venv trading_env
source trading_env/bin/activate
필수 패키지 설치
pip install requests pandas python-dotenv schedule
pip install "holy-sheep-ai>=1.0.0" # HolySheep 공식 SDK
패키지 설치 확인
pip list | grep -E "requests|pandas|schedule"
OKX API 키 발급 받기
OKX 거래소에서 API 키를 발급받아야_historical 데이터를 다운로드할 수 있습니다:
- OKX 공식 웹사이트 접속 후 로그인
- 프로필 아이콘 클릭 → "API" 메뉴 선택
- "새 API 키 생성" 버튼 클릭
- API 키 이름 입력 (예: trading-bot)
- "Historical Data" 권한만 활성화 (보안 강화)
- 패스프레이즈 저장 후 API Key와 Secret Key 복사
⚠️ 중요: API Secret은 다시 조회할 수 없으므로 안전한 곳에 보관하세요.
핵심 Python 스크립트 작성
"""
OKX 거래소 K-라인 데이터 수집 스크립트
작성자: HolySheep AI 기술팀
버전: 1.0.0
"""
import requests
import pandas as pd
import time
import os
from datetime import datetime, timedelta
from dotenv import load_dotenv
.env 파일에서 환경 변수 로드
load_dotenv()
OKX API 설정
OKX_API_KEY = os.getenv("OKX_API_KEY")
OKX_SECRET_KEY = os.getenv("OKX_SECRET_KEY")
OKX_PASSPHRASE = os.getenv("OKX_PASSPHRASE")
OKX_BASE_URL = "https://www.okx.com"
HolySheep AI 설정
HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY")
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
class OKXKlineCollector:
"""OKX 거래소 K-라인 데이터 수집기"""
def __init__(self, api_key, secret_key, passphrase):
self.api_key = api_key
self.secret_key = secret_key
self.passphrase = passphrase
self.headers = {
"Content-Type": "application/json",
"x-simulated-trading": "0" # 실거래: 0, 데모: 1
}
def get_historical_klines(self, symbol, interval, start_time, end_time, limit=100):
"""
-historical K-라인 데이터 조회
Args:
symbol: 거래 페어 (예: BTC-USDT)
interval: 타임프레임 (1m, 5m, 1H, 1D)
start_time: 시작 시간 (밀리초 타임스탬프)
end_time: 종료 시간 (밀리초 타임스탬프)
limit: 최대 데이터 수 (기본 100)
Returns:
DataFrame: K-라인 데이터
"""
endpoint = "/api/v5/market/history-candles"
params = {
"instId": symbol,
"bar": interval,
"after": str(int(end_time)), # 종료 시간 (후순위)
"before": str(int(start_time)), # 시작 시간 (선순위)
"limit": limit
}
try:
response = requests.get(
f"{OKX_BASE_URL}{endpoint}",
headers=self.headers,
params=params,
timeout=30
)
response.raise_for_status()
data = response.json()
if data.get("code") != "0":
print(f"API 오류: {data.get('msg')}")
return None
candles = data.get("data", [])
# 데이터 정제
df = pd.DataFrame(candles, columns=[
"timestamp", "open", "high", "low", "close", "volume", "volCcy"
])
# 타입 변환
for col in ["open", "high", "low", "close", "volume", "volCcy"]:
df[col] = pd.to_numeric(df[col], errors="coerce")
# 타임스탬프 변환
df["datetime"] = pd.to_datetime(
df["timestamp"].astype(float) / 1000, unit="s"
)
return df.sort_values("timestamp")
except requests.exceptions.RequestException as e:
print(f"네트워크 오류: {e}")
return None
except Exception as e:
print(f"데이터 처리 오류: {e}")
return None
def collect_range(self, symbol, interval, days_back=30):
"""
지정된 기간의 모든 K-라인 데이터 수집
Args:
symbol: 거래 페어
interval: 타임프레임
days_back:遲 ?遲 ?遲 ?遲 ?遲 ?일遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?遲 ?�