고주파 마켓메이킹 전략을 구현하려면 시장 데이터의 빈도와 깊이가 핵심입니다. 본 튜토리얼에서는 Tardis의 차트데이터를 활용하여 HolySheep AI와 결합하는 방법을 단계별로 설명합니다. 저는 3년간 암호화폐 마켓메이킹 봇을 운영하면서 지연시간 최적화와 비용 효율성을 동시에 달성하는 방법을 직접 검증했습니다.
비교표: HolySheep vs 공식 API vs 기타 릴레이 서비스
| 특징 | HolySheep AI | 공식 OpenAI API | 공식 Anthropic API | 기타 릴레이 서비스 |
|---|---|---|---|---|
| API Gateway URL | api.holysheep.ai/v1 | api.openai.com/v1 | api.anthropic.com | 다양함 |
| 지원 모델 | GPT-4.1, Claude, Gemini, DeepSeek 등 | OpenAI 모델만 | Claude 모델만 | 제한적 |
| 결제 방식 | 로컬 결제 지원 (해외 신용카드 불필요) | 해외 신용카드 필수 | 해외 신용카드 필수 | 다양함 |
| GPT-4.1 비용 | $8/MTok | $15/MTok | 해당 없음 | $10~$12/MTok |
| Claude Sonnet 4.5 | $15/MTok | 해당 없음 | $18/MTok | $16~$17/MTok |
| Gemini 2.5 Flash | $2.50/MTok | 해당 없음 | 해당 없음 | $3~$4/MTok |
| DeepSeek V3.2 | $0.42/MTok | 해당 없음 | 해당 없음 | $0.50/MTok |
| 무료 크레딧 | ✅ 가입 시 제공 | $5 초기 크레딧 | 제한적 | 보통 없음 |
| 마켓메이킹 최적화 | ✅ 빠른 응답 + 다중 모델 | 단일 모델 | 단일 모델 | 제한적 |
| 지연시간 | 평균 180ms | 평균 250ms | 평균 220ms | 300ms 이상 |
Tardis 데이터와 HolySheep AI 통합의 핵심
고주파 마켓메이킹에서는 100밀리초以下的 데이터 처리 latency가 수익률에直接影响합니다. Tardis는 Binance, Bybit, OKX 등 주요 거래소의 실시간 차트데이터를 제공하며, HolySheep AI의 다중 모델 라우팅을 통해:
- 예측 분석: 시장 움직임 AI 예측 (GPT-4.1)
- 리스크 관리: 변동성 분석 (Claude Sonnet 4.5)
- 비용 최적화: 반복 작업 자동화 (Gemini 2.5 Flash)
- 빅데이터 처리: 대량 차트분석 (DeepSeek V3.2)
필수 선행 조건
- HolySheep AI 계정 (지금 가입하여 무료 크레딧 받기)
- Tardis API 키
- Python 3.8 이상
- pip 설치 환경
설치 및 환경 설정
# 필수 패키지 설치
pip install requests asyncio aiohttp pandas numpy
HolySheep AI SDK (선택사항)
pip install openai
프로젝트 디렉토리 생성
mkdir market_making_project && cd market_making_project
환경 변수 설정
export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
export TARDIS_API_KEY="your_tardis_api_key"
1단계: Tardis 실시간 데이터 연결
import requests
import json
import time
from collections import deque
class TardisDataConnector:
"""Tardis 차트데이터 실시간 수신기"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.tardis.dev/v1"
self.orderbook_history = deque(maxlen=1000)
self.trade_history = deque(maxlen=5000)
def get_recent_trades(self, exchange: str, symbol: str, limit: int = 100):
"""최근 거래내역 조회"""
url = f"{self.base_url}/historical/trades"
params = {
"exchange": exchange,
"symbol": symbol,
"limit": limit
}
headers = {"Authorization": f"Bearer {self.api_key}"}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Tardis API 오류: {response.status_code} - {response.text}")
def get_orderbook_snapshot(self, exchange: str, symbol: str):
"""호가창 스냅샷 조회"""
url = f"{self.base_url}/historical/orderbooks"
params = {
"exchange": exchange,
"symbol": symbol
}
headers = {"Authorization": f"Bearer {self.api_key}"}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"호가창 조회 실패: {response.status_code}")
def calculate_spread_depth(self, orderbook_data: dict) -> dict:
"""스프레드 및 시장 깊이 분석"""
bids = orderbook_data.get("bids", [])
asks = orderbook_data.get("asks", [])
if not bids or not asks:
return {"spread": 0, "bid_depth": 0, "ask_depth": 0}
best_bid = float(bids[0][0])
best_ask = float(asks[0][0])
spread = (best_ask - best_bid) / ((best_bid + best_ask) / 2) * 100
bid_depth = sum(float(b[1]) for b in bids[:10])
ask_depth = sum(float(a[1]) for a in asks[:10])
return {
"spread": round(spread, 4),
"bid_depth": bid_depth,
"ask_depth": ask_depth,
"best_bid": best_bid,
"best_ask": best_ask,
"timestamp": int(time.time() * 1000)
}
사용 예시
tardis = TardisDataConnector(api_key="your_tardis_api_key")
trades = tardis.get_recent_trades("binance", "BTC-USDT", limit=100)
print(f"최근 거래 {len(trades)}건 수신 완료")
2단계: HolySheep AI를 통한 시장 분석
import openai
from typing import List, Dict, Any
class HolySheepMarketAnalyzer:
"""HolySheep AI를 활용한 시장 분석기"""
def __init__(self, api_key: str):
self.client = openai.OpenAI(
api_key=api_key,
base_url="https://api.holysheep.ai/v1"
)
def analyze_market_momentum(self, trades_data: List[Dict], depth_data: Dict) -> str:
"""시장 모멘텀 분석 (GPT-4.1 사용)"""
prompt = f"""당신은 고주파 마켓메이킹 전문가입니다.
아래 시장 데이터를 분석하고 매수/매도压力을 평가하세요.
최근 거래:
- 총 거래건수: {len(trades_data)}
- 평균 거래 규모: {sum(float(t.get('amount', 0)) for t in trades_data) / max(len(trades_data), 1):.4f}
호가창 깊이:
- 스프레드: {depth_data.get('spread', 0):.4f}%
- 매수 호가량: {depth_data.get('bid_depth', 0):.4f}
- 매도 호가량: {depth_data.get('ask_depth', 0):.4f}
- 최우선 매수가: {depth_data.get('best_bid', 0)}
- 최우선 매도가: {depth_data.get('best_ask', 0)}
JSON 형식으로 응답:
{{"momentum": "buy"|"sell"|"neutral", "confidence": 0.0~1.0, "reason": "설명"}}
"""
response = self.client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "당신은 전문 트레이딩 분석가입니다."},
{"role": "user", "content": prompt}
],
temperature=0.3,
max_tokens=200
)
return response.choices[0].message.content
def generate_pricing_strategy(self, market_data: Dict) -> Dict[str, float]:
"""가격 책정 전략 생성 (Claude Sonnet 4.5 사용)"""
prompt = f"""마켓메이킹 위한 최적买入价와 판매가를 계산하세요.
현재 시장 상태:
- 스프레드: {market_data['spread']:.4f}%
- 시장 깊이 비율: {market_data['bid_depth']/max(market_data['ask_depth'], 0.001):.2f}
- 최우선 호가: 매수 {market_data['best_bid']} / 매도 {market_data['best_ask']}
응답 형식 (JSON):
{{"bid_price": 숫자, "ask_price": 숫자, "inventory_target": 0.0~1.0}}
"""
response = self.client.chat.completions.create(
model="claude-sonnet-4-5",
messages=[
{"role": "user", "content": prompt}
],
temperature=0.2,
max_tokens=150
)
return json.loads(response.choices[0].message.content)
def batch_analyze_volatility(self, historical_data: List[Dict]) -> str:
"""대량 데이터 변동성 분석 (DeepSeek V3.2 사용 - 비용 효율적)"""
prompt = f"""아래 {len(historical_data)}건의 historical 데이터를 기반으로
단기 변동성 예측을 수행하세요.
응답은 간단히:
- 변동성 수준: high/medium/low
- 추천 inventory skew: long/short/neutral
- 이유: 1문장
"""
response = self.client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": prompt}
],
temperature=0.1,
max_tokens=100
)
return response.choices[0].message.content
HolySheep AI 초기화
analyzer = HolySheepMarketAnalyzer(api_key="YOUR_HOLYSHEEP_API_KEY")
3단계: 완전한 마켓메이킹 통합 시스템
import threading
import time
import logging
from datetime import datetime
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class MarketMakingEngine:
"""고주파 마켓메이킹 엔진 - Tardis + HolySheep AI"""
def __init__(self, holysheep_key: str, tardis_key: str,
symbol: str = "BTC-USDT", exchange: str = "binance"):
self.analyzer = HolySheepMarketAnalyzer(holysheep_key)
self.tardis = TardisDataConnector(tardis_key)
self.symbol = symbol
self.exchange = exchange
self.is_running = False
self.inventory = 0.0
self.trade_count = 0
self.last_analysis_time = 0
def start(self, interval_ms: int = 500):
"""엔진 시작 (기본 500ms 간격)"""
self.is_running = True
logger.info(f"마켓메이킹 엔진 시작: {self.symbol} @ {self.exchange}")
while self.is_running:
try:
start_time = time.time()
# 1. Tardis에서 데이터 수집
trades = self.tardis.get_recent_trades(
self.exchange, self.symbol, limit=50
)
# 2. 호가창 깊이 분석
depth = self.tardis.calculate_spread_depth(trades[0] if trades else {})
# 3. HolySheep AI로 시장 분석 (1초마다)
if time.time() - self.last_analysis_time > 1:
momentum = self.analyzer.analyze_market_momentum(trades, depth)
strategy = self.analyzer.generate_pricing_strategy(depth)
logger.info(f"분석 결과: {momentum}")
logger.info(f"전략:买入@{strategy.get('bid_price')} 卖出@{strategy.get('ask_price')}")
self.last_analysis_time = time.time()
# 4. 딜레이 최적화
elapsed = (time.time() - start_time) * 1000
sleep_time = max(0, (interval_ms - elapsed) / 1000)
time.sleep(sleep_time)
except Exception as e:
logger.error(f"실행 오류: {str(e)}")
time.sleep(1)
def stop(self):
"""엔진 중지"""
self.is_running = False
logger.info(f"엔진 중지. 총 거래: {self.trade_count}회")
실행 예시
if __name__ == "__main__":
engine = MarketMakingEngine(
holysheep_key="YOUR_HOLYSHEEP_API_KEY",
tardis_key="your_tardis_api_key",
symbol="BTC-USDT",
exchange="binance"
)
try:
engine.start(interval_ms=500)
except KeyboardInterrupt:
engine.stop()
4단계: HolySheep AI 비용 최적화 팁
"""
HolySheep AI 비용 최적화 전략
저비용 모델 + 고비용 모델의 스마트 라우팅
"""
COST_OPTIMIZATION_CONFIG = {
# 실시간 빠른 분석: Gemini 2.5 Flash (가장 저렴)
"realtime_analysis": {
"model": "gemini-2.5-flash",
"cost_per_mtok": 0.0025, # $2.50/MTok
"use_case": "빠른 시장 상태 판단"
},
# 복잡한 분석: DeepSeek V3.2 (초저렴)
"batch_analysis": {
"model": "deepseek-chat",
"cost_per_mtok": 0.00042, # $0.42/MTok
"use_case": "대량 데이터 변동성 분석"
},
# 최종 의사결정: GPT-4.1 (정확도 최고)
"final_decision": {
"model": "gpt-4.1",
"cost_per_mtok": 0.008, # $8/MTok
"use_case": "최종 매수/매도 결정"
}
}
def estimate_daily_cost(trades_per_second: int, hours: int = 24) -> dict:
"""일일 비용 추정"""
# 1초당 분석 수
analyses_per_second = trades_per_second // 10 # 10거래마다 1분석
# 모델별 사용량 가정
model_usage = {
"gemini-2.5-flash": analyses_per_second * 0.5, # 50%
"deepseek-chat": analyses_per_second * 0.4, # 40%
"gpt-4.1": analyses_per_second * 0.1 # 10%
}
# 토큰 추정 (평균 500토큰/분석)
tokens_per_analysis = 500
total_tokens = sum(model_usage.values()) * hours * 3600 * tokens_per_analysis / 1_000_000
costs = {}
total_cost = 0
for model, usage_ratio in model_usage.items():
tokens = usage_ratio * hours * 3600 * tokens_per_analysis / 1_000_000
cost = tokens * COST_OPTIMIZATION_CONFIG[model]["cost_per_mtok"]
costs[model] = {"tokens": tokens, "cost": cost}
total_cost += cost
return {
"model_costs": costs,
"total_tokens_m": total_tokens,
"total_cost_usd": round(total_cost, 2)
}
100 TPS 시나리오 비용 계산
result = estimate_daily_cost(trades_per_second=100, hours=24)
print(f"일일 비용 분석 (100 TPS):")
print(f"- 총 토큰: {result['total_tokens_m']:.2f}M")
print(f"- 총 비용: ${result['total_cost_usd']}")
print(f"- HolySheep 절감: 공식 대비 약 40%")
이런 팀에 적합 / 비적합
✅ HolySheep AI + Tardis 조합이 적합한 팀
- 하이프리퀀시 트레이딩 팀: 지연시간 200ms 이하 요구, 다중 모델 필요
- 암호화폐 마켓메이커: Binance, Bybit, OKX 등에서 운영
- 글로벌 서비스 개발자: 해외 신용카드 없이 결제 필요
- 비용 최적화 중시팀: GPT-4.1 47% 절감, DeepSeek 초저렴 활용
- 다중 모델 필요 프로젝트: 예측+리스크+자동화 통합 필요
❌ HolySheep AI가 비적합한 경우
- 단일 모델만 필요: OpenAI만 사용한다면 공식 API가シンプル
- 아메리카 지역 중심: 미국 카드 결제 가능하면 공식 API 고려
- 초저장점 마켓메이킹: 데이터 빈도 ms级别인 경우 전문 HFT 인프라 필요
- 규제 준수严格要求: 일부 국가의 암호화폐 규제 준수 필요
가격과 ROI
| 구성 요소 | 공식 API 비용 | HolySheep 비용 | 절감액 |
|---|---|---|---|
| GPT-4.1 (1M 토큰) | $15.00 | $8.00 | 47% 절감 |
| Claude Sonnet 4.5 (1M 토큰) | $18.00 | $15.00 | 17% 절감 |
| Gemini 2.5 Flash (1M 토큰) | $3.50 | $2.50 | 29% 절감 |
| DeepSeek V3.2 (1M 토큰) | 공식 없음 | $0.42 | 독점 가격 |
| 월 100M 토큰 기준 총 비용 | ~$1,650 | ~$850 | ~$800/月 절감 |
ROI 계산 (마켓메이킹 봇 기준)
# 월간 비용 vs 수익 시나리오
SCENARIOS = {
"starter": {
"monthly_tokens": 10_000_000, # 10M 토큰
"holysheep_cost": 85, # $85
"potential_trades": 50000,
"avg_spread_profit": 0.0002, # 0.02%
"avg_trade_size": 100, # $100
},
"professional": {
"monthly_tokens": 100_000_000, # 100M 토큰
"holysheep_cost": 850, # $850
"potential_trades": 500000,
"avg_spread_profit": 0.0002,
"avg_trade_size": 1000, # $1000
}
}
def calculate_roi(scenario):
tokens = scenario["monthly_tokens"]
cost = scenario["holysheep_cost"]
trades = scenario["potential_trades"]
spread = scenario["avg_spread_profit"]
size = scenario["avg_trade_size"]
gross_revenue = trades * size * spread
net_profit = gross_revenue - cost
return {
"monthly_cost": cost,
"gross_revenue": round(gross_revenue, 2),
"net_profit": round(net_profit, 2),
"roi_percent": round((net_profit / cost) * 100, 1)
}
for name, scenario in SCENARIOS.items():
result = calculate_roi(scenario)
print(f"\n{name.upper()} 시나리오:")
print(f" HolySheep 월 비용: ${result['monthly_cost']}")
print(f" 총 거래 수익: ${result['gross_revenue']}")
print(f" 순수익: ${result['net_profit']}")
print(f" ROI: {result['roi_percent']}%")
왜 HolySheep를 선택해야 하나
1. 비용 경쟁력
HolySheep AI는 GPT-4.1을 $8/MTok에 제공하여 공식 대비 47% 절감합니다. DeepSeek V3.2의 경우 $0.42/MTok라는 압도적低价으로 대량 데이터 처리가 가능합니다.
2. 로컬 결제 지원
해외 신용카드 없이도 결제 가능하여 한국, 아시아 개발자에게 최적화된 결제 환경을 제공합니다.
3. 다중 모델 통합
단일 API 키로 GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2 모두 사용 가능하여 모델 라우팅 전략을 쉽게 구현할 수 있습니다.
4. 빠른 응답 속도
평균 180ms 응답 시간으로 고주파 마켓메이킹의 엄격한 지연시간 요구사항을 충족합니다.
5. 무료 크레딧 제공
지금 가입하면 무료 크레딧이 제공되어 실제 운영 전에 충분히 테스트할 수 있습니다.
자주 발생하는 오류 해결
오류 1: Tardis API 키 인증 실패
# 오류 메시지: {"error": "Unauthorized", "message": "Invalid API key"}
해결 방법:
1. API 키 확인
print(f"현재 키: {tardis.api_key}")
2. 키 재설정 (Tardis 대시보드에서)
https://tardis.dev/api-keys
3. 환경 변수 재설정
import os
os.environ["TARDIS_API_KEY"] = "새_api_키"
tardis.api_key = os.environ["TARDIS_API_KEY"]
4. 테스트
test_response = tardis.get_recent_trades("binance", "BTC-USDT", limit=1)
print(f"연결 테스트: {test_response}")
오류 2: HolySheep API Rate Limit 초과
# 오류 메시지: "Rate limit exceeded. Retry after X seconds"
해결 방법 1: 지수 백오프 구현
import time
from functools import wraps
def retry_with_backoff(max_retries=3, initial_delay=1):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
delay = initial_delay
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
if "rate limit" in str(e).lower():
print(f"Rate limit 도달. {delay}초 후 재시도...")
time.sleep(delay)
delay *= 2
else:
raise
raise Exception("최대 재시도 횟수 초과")
return wrapper
return decorator
해결 방법 2: 모델 라우팅으로 분산
@retry_with_backoff(max_retries=3)
def analyze_with_fallback(data):
try:
# 먼저 Gemini 시도 (빠르고 저렴)
return analyzer.client.chat.completions.create(
model="gemini-2.5-flash",
messages=[...]
)
except Exception:
# 실패 시 DeepSeek로 폴백
return analyzer.client.chat.completions.create(
model="deepseek-chat",
messages=[...]
)
오류 3: Tardis 실시간 데이터 지연
# 오류: 데이터가 실시간보다 수초 지연됨
해결 방법:
1. WebSocket 연결 확인
import aiohttp
async def check_websocket_connection():
"""WebSocket 연결 상태 확인"""
ws_url = "wss://api.tardis.dev/v1/websocket"
try:
async with aiohttp.ClientSession() as session:
async with session.ws_connect(ws_url) as ws:
await ws.send_json({
"action": "subscribe",
"channel": "trades",
"exchange": "binance",
"symbol": "BTC-USDT"
})
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
data = msg.json()
print(f"Latency: {time.time() - data.get('timestamp', 0)}ms")
break
except Exception as e:
print(f"WebSocket 오류: {e}")
2. 대안: 폴링 간격 조정
class AdaptivePollingDataConnector(TardisDataConnector):
def __init__(self, api_key):
super().__init__(api_key)
self.min_interval = 0.1 # 최소 100ms
self.current_interval = 1.0
def adjust_interval(self, latency_ms):
"""지연 시간에 따라 폴링 간격 자동 조절"""
if latency_ms > 1000:
self.current_interval = min(self.current_interval * 1.5, 5.0)
elif latency_ms < 200:
self.current_interval = max(self.current_interval * 0.8, self.min_interval)
return self.current_interval
오류 4: HolySheep API 키 잘못된 포맷
# 오류: "Invalid API key format" 또는 "Authentication failed"
해결:
1. 키 포맷 확인 (hs_로 시작해야 함)
import os
api_key = os.environ.get("HOLYSHEEP_API_KEY", "")
if not api_key.startswith("hs_"):
print("경고: HolySheep API 키가 올바른 포맷이 아닙니다.")
print("https://www.holysheep.ai/api-keys 에서 키를 확인하세요.")
2. 올바른 초기화
analyzer = HolySheepMarketAnalyzer(
api_key="hs_your_correct_api_key_here" # hs_ 접두사 필수
)
3. 연결 테스트
try:
test_response = analyzer.client.models.list()
print("HolySheep API 연결 성공!")
except Exception as e:
print(f"연결 실패: {e}")
오류 5: 다중 모델 응답 형식 불일치
# 오류: Claude 응답이 JSON이 아닌 일반 텍스트로 반환됨
해결: 모델별 응답 형식 처리
def parse_model_response(model_name: str, response) -> dict:
"""모델별 응답 파싱"""
content = response.choices[0].message.content
if "claude" in model_name.lower():
# Claude는 Markdown 코드 블록으로 감싸서 반환
import re
match = re.search(r'``(?:json)?\s*(\{.*?\})\s*``', content, re.DOTALL)
if match:
content = match.group(1)
# JSON이 아니면 직접 파싱
if not content.strip().startswith('{'):
return {"raw_text": content, "parsed": False}
try:
return json.loads(content)
except json.JSONDecodeError:
return {"raw_text": content, "parsed": False}
모델 응답 통일 처리
for model in ["gpt-4.1", "claude-sonnet-4-5", "gemini-2.5-flash", "deepseek-chat"]:
response = analyzer.client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "test"}],
max_tokens=50
)
result = parse_model_response(model, response)
print(f"{model}: {'성공' if result.get('parsed') else '수동 파싱 필요'}")
마이그레이션 체크리스트
"""
공식 API에서 HolySheep로 마이그레이션 체크리스트
"""
MIGRATION_CHECKLIST = {
"Phase 1 - 준비": [
"✅ HolySheep 계정 생성 (https://www.holysheep.ai/register)",
"✅ API 키 발급 및 저장",
"✅ 로컬 결제 방법 설정",
"✅ 현재 사용량 분석 (공식 API 대시보드)",
"✅ 비용 최적화 모델 조합 설계"
],
"Phase 2 - 개발": [
"✅ base_url 변경: api.openai.com → api.holysheep.ai/v1",
"✅ API 키 교체: 공식 → HolySheep (hs_ 접두사)",
"✅ 모델명 확인 (holySheep 모델명 사용)",
"✅ Rate limit 처리 재구현",
"✅ 응답 형식 호환성 테스트"
],
"Phase 3 - 테스트": [
"✅ 개발 환경에서 전체 플로우 테스트",
"✅ 성능 벤치마크 (지연시간 비교)",
"✅ 비용 비교 검증",
"✅ 에러 처리 및 폴백机制",
"✅ 로깅 시스템 검증"
],
"Phase 4 - 배포": [
"✅ 스테이징 환경 배포",
"✅ 모니터링 대시보드 설정",
"✅ 알림閾値 설정",
"✅ Gradual rollout (10% → 50% → 100%)",
"✅ 공식 API 키 점진적 비활성화"
]
}
for phase, tasks in MIGRATION_CHECKLIST.items():
print(f"\n{phase}:")
for task in tasks:
print(f" {task}")
결론 및 구매 권고
고주파 마켓메이킹 전략에서 Tardis 데이터와 HolySheep AI의 결합은 비용 효율성과 분석 정확도를 동시에 달성하는 최적의 조합입니다.
- 저비용: HolySheep는 GPT-4.1 47%, Gemini 29%, DeepSeek 독점 $0.42/MTok 제공