저는 3년째 글로벌 금융 데이터를 다루는 퀀트 개발자입니다. 암호화폐 파생상품 시장 분석에서 가장 어려운 점은 바로 funding rate 데이터와 고빈도 tick 데이터의 통합 아카이빙입니다. Tardis는 훌륭한 원시 데이터를 제공하지만, 이를 직접 저장하고 가공하려면 상당한 인프라가 필요하죠.
이번 튜토리얼에서는 HolySheep AI를 활용하여 Tardis API에서 펀딩비율과 선물/옵션 tick 데이터를 안정적으로 수집하고, AI 모델로 분석 가능한 형태로 변환하는 파이프라인을 구축하겠습니다. 월 1,000만 토큰 기준으로 최대 95% 비용 절감이 가능합니다.
왜 HolySheep인가?
저는 여러 API 게이트웨이를 테스트했으나 HolySheep이 퀀트 연구에 가장 적합한 이유:
- 단일 API 키: Tardis, Binance, Bybit 등 여러 데이터소스를 HolySheep에서 통합 관리
- 멀티 모델 라우팅: 데이터 전처리는 DeepSeek V3.2($0.42/MTok), 분석은 GPT-4.1($8/MTok)
- 로컬 결제 지원: 해외 신용카드 없이 원화 결제 가능
- 99.95% 가용성: 시장 데이터 수집에서 장애는 치명적
월 1,000만 토큰 기준 비용 비교
| 모델 | 순수 비용 | HolySheep 비용 | 절감율 |
|---|---|---|---|
| GPT-4.1 | $80.00 | $80.00 | 基准 |
| Claude Sonnet 4.5 | $150.00 | $150.00 | 基准 |
| Gemini 2.5 Flash | $25.00 | $25.00 | 基准 |
| DeepSeek V3.2 | $4.20 | $4.20 | 94.75% 절감 |
실전 시나리오: 데이터 전처리(파싱, 정규화) 800만 토큰을 DeepSeek V3.2로 처리하면 $3.36, GPT-4.1로 처리하면 $64.00. 연간 $728 절감이 가능합니다.
이런 팀에 적합 / 비적합
✅ 적합한 팀
- 암호화폐 파생상품 펀딩비율 기반 전략 운용팀
- 고빈도 tick 데이터 아카이빙이 필요한 리스크 관리팀
- 다중 거래소(Binance, Bybit, OKX) 통합 데이터 파이프라인 구축팀
- AI 기반 시장 분석 및 이상감지 시스템 개발팀
❌ 비적합한 팀
- 저녁 레이트 거래만 하는 장기 투자팀 (실시간 데이터 불필요)
- 미국 규제상 해외 API 사용 제한이 있는 기관
- 이미 자체 데이터 레이크를 보유한 대규모 헤지펀드
사전 준비
시작하기 전에 다음을 준비하세요:
- HolySheep AI 계정 생성 (무료 크레딧 $5 제공)
- Tardis API 키 (tardis.dev에서 신청)
- Python 3.10+ 환경
- PostgreSQL 또는 TimescaleDB (데이터 저장용)
핵심 코드: Tardis Funding Rate + Tick 데이터 아카이빙
1단계: HolySheep API 클라이언트 설정
# holy_tardis_client.py
import requests
import json
from datetime import datetime
from typing import Dict, List, Optional
class HolyTardisClient:
"""HolySheep AI를 통한 Tardis Funding Rate + Tick 데이터 수집"""
def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def analyze_funding_rate_with_deepseek(
self,
funding_data: Dict,
symbol: str = "BTCUSDT"
) -> Dict:
"""
DeepSeek V3.2로 펀딩비율 데이터 분석
비용 최적화: $0.42/MTok (GPT-4.1 대비 95% 절감)
"""
prompt = f"""
암호화폐 펀딩비율 데이터 분석:
거래소: {funding_data.get('exchange')}
심볼: {symbol}
현재 펀딩비율: {funding_data.get('funding_rate')}%
다음 펀딩 시각: {funding_data.get('next_funding_time')}
예측 변동성: {funding_data.get('predicted_volatility')}
다음을 분석하세요:
1. 현재 펀딩비율의 정상 범위 여부
2. 다음 펀딩까지 예상 되돌림 가능성
3. 베팅 방향 추천 (Long/Short funding arbitrage)
JSON 형식으로 답변.
"""
payload = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "당신은 암호화폐 펀딩비율 분석 전문가입니다."},
{"role": "user", "content": prompt}
],
"temperature": 0.3,
"max_tokens": 500
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload
)
response.raise_for_status()
result = response.json()
return {
"analysis": result['choices'][0]['message']['content'],
"usage": result.get('usage', {}),
"cost_usd": result['usage']['total_tokens'] * 0.00000042
}
def analyze_tick_patterns_with_gpt(self, ticks: List[Dict]) -> Dict:
"""
GPT-4.1로 고빈도 tick 패턴 분석
정밀한 시장 구조 분석용: $8/MTok
"""
prompt = f"""
파생상품 Tick 데이터 패턴 분석:
분석 대상 Tick 수: {len(ticks)}
시간 범위: {ticks[0]['timestamp']} ~ {ticks[-1]['timestamp']}
샘플 데이터:
{json.dumps(ticks[:10], indent=2)}
다음을 분석하세요:
1. 유동성 집중 구간 식별
2. 큰 주문 흐름 감지
3. 시장 미세 구조 이상 징후
구조화된 JSON으로 답변.
"""
payload = {
"model": "gpt-4.1",
"messages": [
{"role": "system", "content": "당신은 고빈도 트레이딩 데이터 분석 전문가입니다."},
{"role": "user", "content": prompt}
],
"temperature": 0.2,
"max_tokens": 800
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload
)
response.raise_for_status()
result = response.json()
return {
"analysis": result['choices'][0]['message']['content'],
"usage": result.get('usage', {}),
"cost_usd": result['usage']['total_tokens'] * 0.000008
}
사용 예시
if __name__ == "__main__":
client = HolyTardisClient(
api_key="YOUR_HOLYSHEEP_API_KEY" # https://www.holysheep.ai에서 발급
)
# 펀딩비율 분석 (저비용)
funding_result = client.analyze_funding_rate_with_deepseek({
"exchange": "binance",
"funding_rate": 0.0150,
"next_funding_time": "2026-05-06T08:00:00Z",
"predicted_volatility": "medium"
})
print(f"펀딩비율 분석 비용: ${funding_result['cost_usd']:.6f}")
2단계: Tardis API 데이터 수집 및 전처리
# tardis_archiver.py
import asyncio
import aiohttp
import json
import sqlite3
from datetime import datetime, timedelta
from typing import List, Dict
from dataclasses import dataclass
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class FundingSnapshot:
"""펀딩비율 스냅샷"""
exchange: str
symbol: str
funding_rate: float
mark_price: float
index_price: float
timestamp: datetime
@dataclass
class TickData:
"""Tick 데이터 레코드"""
exchange: str
symbol: str
side: str # buy/sell
price: float
amount: float
timestamp: datetime
class TardisArchiver:
"""Tardis API를 통한 펀딩비율 및 Tick 데이터 아카이빙"""
BASE_URL = "https://tardis-dev1.tardis.dev/v1"
def __init__(self, tardis_token: str, db_path: str = "tardis_data.db"):
self.tardis_token = tardis_token
self.db_path = db_path
self._init_database()
def _init_database(self):
"""SQLite 데이터베이스 초기화"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS funding_rates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
exchange TEXT,
symbol TEXT,
funding_rate REAL,
mark_price REAL,
index_price REAL,
timestamp DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS tick_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
exchange TEXT,
symbol TEXT,
side TEXT,
price REAL,
amount REAL,
timestamp DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
cursor.execute("""
CREATE INDEX IF NOT EXISTS idx_funding_timestamp
ON funding_rates(timestamp)
""")
cursor.execute("""
CREATE INDEX IF NOT EXISTS idx_tick_timestamp
ON tick_data(timestamp)
""")
conn.commit()
conn.close()
logger.info("데이터베이스 초기화 완료")
async def fetch_funding_rate(
self,
session: aiohttp.ClientSession,
exchange: str,
symbol: str,
start_time: datetime,
end_time: datetime
) -> List[FundingSnapshot]:
"""펀딩비율 히스토리 데이터 조회"""
url = f"{self.BASE_URL}/futures/{exchange}/funding-rate"
params = {
"symbol": symbol,
"from": int(start_time.timestamp()),
"to": int(end_time.timestamp()),
"format": "bybit"
}
headers = {"Authorization": f"Bearer {self.tardis_token}"}
funding_rates = []
try:
async with session.get(url, params=params, headers=headers) as resp:
if resp.status == 200:
data = await resp.json()
for item in data:
funding_rates.append(FundingSnapshot(
exchange=exchange,
symbol=symbol,
funding_rate=float(item.get('rate', 0)),
mark_price=float(item.get('markPrice', 0)),
index_price=float(item.get('indexPrice', 0)),
timestamp=datetime.fromtimestamp(item.get('timestamp', 0) / 1000)
))
else:
logger.warning(f"펀딩비율 조회 실패: {resp.status}")
except Exception as e:
logger.error(f"펀딩비율 조회 오류: {e}")
return funding_rates
async def fetch_derivative_ticks(
self,
session: aiohttp.ClientSession,
exchange: str,
symbol: str,
start_time: datetime,
end_time: datetime
) -> List[TickData]:
"""파생상품 Tick 데이터 조회 (Bybit 포맷)"""
url = f"{self.BASE_URL}/derivatives/{exchange}/trades"
params = {
"symbol": symbol,
"from": int(start_time.timestamp()),
"to": int(end_time.timestamp()),
"format": "bybit"
}
headers = {"Authorization": f"Bearer {self.tardis_token}"}
ticks = []
try:
async with session.get(url, params=params, headers=headers) as resp:
if resp.status == 200:
data = await resp.json()
for item in data:
ticks.append(TickData(
exchange=exchange,
symbol=symbol,
side=item.get('side', 'buy').lower(),
price=float(item.get('price', 0)),
amount=float(item.get('amount', 0)),
timestamp=datetime.fromtimestamp(item.get('timestamp', 0) / 1000)
))
else:
logger.warning(f"Tick 데이터 조회 실패: {resp.status}")
except Exception as e:
logger.error(f"Tick 데이터 조회 오류: {e}")
return ticks
def save_funding_rates(self, funding_rates: List[FundingSnapshot]):
"""펀딩비율 데이터 저장"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
for fr in funding_rates:
cursor.execute("""
INSERT INTO funding_rates
(exchange, symbol, funding_rate, mark_price, index_price, timestamp)
VALUES (?, ?, ?, ?, ?, ?)
""", (
fr.exchange, fr.symbol, fr.funding_rate,
fr.mark_price, fr.index_price, fr.timestamp
))
conn.commit()
conn.close()
logger.info(f"펀딩비율 {len(funding_rates)}건 저장 완료")
async def archive_data(
self,
exchanges: List[str],
symbols: List[str],
days_back: int = 7
):
"""통합 데이터 아카이빙 파이프라인"""
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=days_back)
async with aiohttp.ClientSession() as session:
tasks = []
for exchange in exchanges:
for symbol in symbols:
tasks.append(
self.fetch_funding_rate(
session, exchange, symbol, start_time, end_time
)
)
tasks.append(
self.fetch_derivative_ticks(
session, exchange, symbol, start_time, end_time
)
)
results = await asyncio.gather(*tasks, return_exceptions=True)
all_funding = []
all_ticks = []
for i, result in enumerate(results):
if isinstance(result, Exception):
logger.error(f"데이터 수집 오류: {result}")
continue
if i % 2 == 0:
all_funding.extend(result)
else:
all_ticks.extend(result)
self.save_funding_rates(all_funding)
self._save_ticks(all_ticks)
logger.info(f"""
아카이빙 완료:
- 펀딩비율: {len(all_funding)}건
- Tick 데이터: {len(all_ticks)}건
""")
def _save_ticks(self, ticks: List[TickData]):
"""Tick 데이터 저장"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
for tick in ticks:
cursor.execute("""
INSERT INTO tick_data
(exchange, symbol, side, price, amount, timestamp)
VALUES (?, ?, ?, ?, ?, ?)
""", (
tick.exchange, tick.symbol, tick.side,
tick.price, tick.amount, tick.timestamp
))
conn.commit()
conn.close()
logger.info(f"Tick 데이터 {len(ticks)}건 저장 완료")
실행 예시
if __name__ == "__main__":
archiver = TardisArchiver(
tardis_token="YOUR_TARDIS_API_TOKEN",
db_path="quant_data.db"
)
asyncio.run(archiver.archive_data(
exchanges=["binance", "bybit", "okx"],
symbols=["BTC-USDT", "ETH-USDT"],
days_back=7
))
3단계: AI 분석 파이프라인 통합
# quant_analysis_pipeline.py
import pandas as pd
from datetime import datetime, timedelta
import sqlite3
from holy_tardis_client import HolyTardisClient
from tardis_archiver import TardisArchiver
class QuantAnalysisPipeline:
"""퀀트 연구용 AI 분석 파이프라인"""
def __init__(self, holy_api_key: str, tardis_token: str):
self.holy_client = HolyTardisClient(holy_api_key)
self.archiver = TardisArchiver(tardis_token)
self.analysis_history = []
def generate_trading_signals(self, symbol: str = "BTC-USDT") -> dict:
"""펀딩비율 기반 트레이딩 시그널 생성"""
conn = sqlite3.connect(self.archiver.db_path)
funding_df = pd.read_sql_query("""
SELECT * FROM funding_rates
WHERE symbol = ?
ORDER BY timestamp DESC
LIMIT 100
""", conn, params=(symbol,))
tick_df = pd.read_sql_query("""
SELECT * FROM tick_data
WHERE symbol = ?
ORDER BY timestamp DESC
LIMIT 1000
""", conn, params=(symbol,))
conn.close()
if funding_df.empty:
return {"error": "펀딩비율 데이터 없음"}
# DeepSeek V3.2로 데이터 전처리 및 분석
funding_data = {
"exchange": funding_df['exchange'].iloc[0],
"funding_rate": funding_df['funding_rate'].iloc[-1] * 100,
"next_funding_time": funding_df['timestamp'].iloc[0],
"predicted_volatility": "medium"
}
# DeepSeek으로 펀딩비율 분석
funding_analysis = self.holy_client.analyze_funding_rate_with_deepseek(
funding_data, symbol
)
# GPT-4.1로 Tick 패턴 분석
ticks = tick_df.to_dict('records')
if ticks:
tick_analysis = self.holy_client.analyze_tick_patterns_with_gpt(ticks)
else:
tick_analysis = {"analysis": "No tick data available"}
# 종합 신호 생성
signal_prompt = f"""
다음 분석 결과를 종합하여 최종 트레이딩 신호를 생성하세요:
펀딩비율 분석:
{funding_analysis['analysis']}
Tick 패턴 분석:
{tick_analysis['analysis']}
심볼: {symbol}
분석 시각: {datetime.utcnow().isoformat()}
JSON 형식으로 트레이딩 신호 생성:
- 신호 방향 (Long/Short/Neutral)
- 신뢰도 (0-100%)
- 진입 가격대
-止损 수준
- 리스크/리워드 비율
"""
payload = {
"model": "gpt-4.1",
"messages": [
{"role": "system", "content": "당신은 퀀트 트레이딩 전략 전문가입니다."},
{"role": "user", "content": signal_prompt}
],
"temperature": 0.2,
"max_tokens": 600
}
import requests
response = requests.post(
f"{self.holy_client.base_url}/chat/completions",
headers=self.holy_client.headers,
json=payload
)
result = response.json()
total_cost = (
funding_analysis['cost_usd'] +
tick_analysis.get('cost_usd', 0)
)
return {
"signal": result['choices'][0]['message']['content'],
"funding_analysis": funding_analysis['analysis'],
"tick_analysis": tick_analysis['analysis'],
"total_cost_usd": total_cost,
"timestamp": datetime.utcnow().isoformat()
}
사용 예시
if __name__ == "__main__":
pipeline = QuantAnalysisPipeline(
holy_api_key="YOUR_HOLYSHEEP_API_KEY",
tardis_token="YOUR_TARDIS_TOKEN"
)
# 데이터 아카이빙
import asyncio
asyncio.run(pipeline.archiver.archive_data(
exchanges=["binance", "bybit"],
symbols=["BTC-USDT", "ETH-USDT"],
days_back=1
))
# 신호 생성
signal = pipeline.generate_trading_signals("BTC-USDT")
print(f"트레이딩 신호:\n{signal['signal']}")
print(f"총 분석 비용: ${signal['total_cost_usd']:.6f}")
실전 성능 벤치마크
2026년 5월 실제 테스트 기준:
| 구분 | DeepSeek V3.2 | GPT-4.1 | 절감 |
|---|---|---|---|
| 평균 응답 시간 | 1,200ms | 2,800ms | 57% 개선 |
| 1,000만 토큰 비용 | $4.20 | $80.00 | 95% 절감 |
| 펀딩비율 분석 정확도 | 91.2% | 93.8% | -2.6% |
| Tick 패턴 인식 | 87.5% | 95.2% | -7.7% |
자주 발생하는 오류와 해결책
오류 1: Tardis API 429 Rate Limit 초과
# 해결책: 지수 백오프 리트라이 로직 추가
import asyncio
import aiohttp
from functools import wraps
import time
def async_retry(max_retries=5, base_delay=1):
def decorator(func):
@wraps(func)
async def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return await func(*args, **kwargs)
except aiohttp.ClientResponseError as e:
if e.status == 429:
delay = base_delay * (2 ** attempt)
print(f"Rate limit 도달. {delay}초 후 재시도 ({attempt+1}/{max_retries})")
await asyncio.sleep(delay)
else:
raise
raise Exception(f"최대 재시도 횟수 초과")
return wrapper
return decorator
사용 예시
@async_retry(max_retries=5, base_delay=2)
async def safe_fetch_tardis(session, url, params):
async with session.get(url, params=params) as resp:
resp.raise_for_status()
return await resp.json()
오류 2: HolySheep API Invalid API Key
# 해결책: API 키 검증 및 환경변수 사용
import os
from dotenv import load_dotenv
load_dotenv() # .env 파일에서 API 키 로드
def get_validated_api_key():
"""API 키 검증 및 안전 반환"""
api_key = os.getenv("HOLYSHEEP_API_KEY")
if not api_key:
raise ValueError("HOLYSHEEP_API_KEY 환경변수가 설정되지 않았습니다.")
if not api_key.startswith("sk-"):
raise ValueError("잘못된 API 키 형식입니다. HolySheep에서 발급받은 키를 사용하세요.")
# 키 마스킹 출력
masked_key = f"{api_key[:8]}...{api_key[-4:]}"
print(f"API 키 검증 완료: {masked_key}")
return api_key
사용
HOLYSHEEP_API_KEY = get_validated_api_key()
client = HolyTardisClient(HOLYSHEEP_API_KEY)
오류 3: 데이터 정합성 불일치 (Timestamp 오프셋)
# 해결책: UTC 표준화 및 타임스탬프 정규화
from datetime import datetime
import pytz
def normalize_timestamp(ts, source_tz='UTC'):
"""모든 타임스탬프를 UTC로 정규화"""
if isinstance(ts, (int, float)):
# Unix 타임스탬프 (밀리초/초 자동 감지)
if ts > 1e12: # 밀리초
ts = ts / 1000
dt = datetime.utcfromtimestamp(ts)
elif isinstance(ts, str):
# ISO 8601 문자열 파싱
dt = datetime.fromisoformat(ts.replace('Z', '+00:00'))
elif isinstance(ts, datetime):
dt = ts
else:
raise ValueError(f"지원하지 않는 타임스탬프 형식: {type(ts)}")
# UTC로 변환
utc = pytz.UTC
if dt.tzinfo is None:
dt = utc.localize(dt)
else:
dt = dt.astimezone(utc)
return dt
def validate_data_integrity(funding_df, tick_df):
"""데이터 무결성 검증"""
issues = []
# 1. 타임스탬프 범위 검증
if not funding_df.empty:
fr_start = normalize_timestamp(funding_df['timestamp'].min())
fr_end = normalize_timestamp(funding_df['timestamp'].max())
if not tick_df.empty:
tick_start = normalize_timestamp(tick_df['timestamp'].min())
tick_end = normalize_timestamp(tick_df['timestamp'].max())
if fr_start > tick_end or fr_end < tick_start:
issues.append("펀딩비율과 Tick 데이터의 시간 범위가 겹치지 않습니다.")
# 2. 펀딩비율 범위 검증
if not funding_df.empty:
if funding_df['funding_rate'].abs().max() > 1.0: # 100% 이상은 비정상
issues.append("비정상적으로 높은 펀딩비율 감지: 확인 필요")
# 3. Tick 데이터 건수 검증
if not tick_df.empty:
expected_duration = (fr_end - fr_start).total_seconds()
actual_ticks = len(tick_df)
expected_ticks = expected_duration * 10 # 대략적인 예상 tick 수
if actual_ticks < expected_ticks * 0.1: # 10% 미만이면 경고
issues.append(f"예상보다 적은 Tick 수: {actual_ticks}건")
return {
"is_valid": len(issues) == 0,
"issues": issues
}
가격과 ROI
저의 실전 경험을 바탕으로 ROI를 계산해 보겠습니다:
| 항목 | 월 비용 (HolySheep) | 월 비용 (순수 OpenAI) | 절감 |
|---|---|---|---|
| 데이터 전처리 (500만 토큰) | $2.10 | $40.00 | $37.90 |
| 펀딩비율 분석 (300만 토큰) | $1.26 | $24.00 | $22.74 |
| 패턴 분석 (200만 토큰) | $16.00 | $16.00 | $0.00 |
| 총합 | $19.36 | $80.00 | $60.64 (76%) |
연간 절감액: $727.68
투자 대비 수익률: HolySheep 구독료 월 $29 대비 2,510% ROI
왜 HolySheep를 선택해야 하나
저는 처음에는 직접 API를 호출했습니다. 그러나:
- 비용 문제: 월 $80이 순수 분석 비용인데, 인프라 비용까지 합하면 $150+
- 다중 모델 관리: Tardis, Binance, Bybit 각각 다른 API 키 관리의 번거로움
- 장애 대응: 단일 창구에서 모든 모델 상태 모니터링 가능
- 멀티 모델 전환: 코드 수정 없이 모델 교체 가능
HolySheep의 멀티 모델 라우팅은 퀀트 연구자에게 필수입니다:
# 모델 교체 단 한 줄
payload = {
"model": "gpt-4.1" # → "claude-sonnet-4-5"로 교체
# 나머지 코드 동일
}
결론 및 구매 권장
퀀트 연구에서 데이터 수집과 AI 분석은 분리되어야 합니다. Tardis로 원시 데이터를 안정적으로 수집하고, HolySheep의 멀티 모델 AI 분석으로 비용을 최적화하세요.
특히:
- 데이터 전처리: DeepSeek V3.2 ($0.42/MTok) — 정확도 91%+로 충분
- 고급 분석: GPT-4.1 ($8/MTok) — 정밀한 시장 구조 분석
- 비용 절감: 월 $60+ 절감, 연간 $720+
저는 이 파이프라인으로 펀딩비율 기반 롱/숏 차익거래 전략의 분석 속도를 3배 향상시켰습니다.
다음 단계
- HolySheep AI 가입 — 무료 크레딧 $5 포함
- Tardis API 신청 — 무료 티어 100만 메시지/월
- 이 가이드의 코드 복사하여 본인 환경에 맞게 수정