diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/main.py b/main.py new file mode 100644 index 0000000..6d3e621 --- /dev/null +++ b/main.py @@ -0,0 +1,30 @@ +from toss_api import TossInvestAPI + +def main(): + # 1. API 객체 초기화 + api = TossInvestAPI() + + # 2. 내 계좌 잔고 확인 + print("계좌 잔고 조회 중...") + balance = api.get_account_balance() + print(balance) + + # 3. 전략 예시: 전날 활발했던 종목(예: 삼성전자 '005930')의 중간 가격 계산 로직 (구현 필요) + target_ticker = "005930" + + print(f"{target_ticker} 현재가 조회 중...") + current_price_info = api.get_current_price(target_ticker) + print(current_price_info) + + # 4. 하한 목표가 매수 주문 예시 + # buy_price = 계산된_하한가 + # buy_result = api.create_order(target_ticker, "BUY", price=buy_price, quantity=10) + # print(buy_result) + + # 5. 매수 완료 후 상한 목표가 매도 주문 예시 + # sell_price = 계산된_상한가 + # sell_result = api.create_order(target_ticker, "SELL", price=sell_price, quantity=10) + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..40a57d6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,7 @@ +[project] +name = "toss-quant" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.14" +dependencies = [] diff --git a/toss_api.py b/toss_api.py new file mode 100644 index 0000000..c281df8 --- /dev/null +++ b/toss_api.py @@ -0,0 +1,68 @@ +import os +import requests +from dotenv import load_dotenv + +# .env 파일 로드 +load_dotenv() + +class TossInvestAPI: + def __init__(self): + self.api_key = os.getenv("TOSS_API_KEY") + self.secret_key = os.getenv("TOSS_SECRET_KEY") + self.account_number = os.getenv("TOSS_ACCOUNT_NUMBER") + self.base_url = os.getenv("TOSS_BASE_URL") + + # 공통 헤더 설정 (실제 가이드에 맞게 수정 필요) + self.headers = { + "Authorization": f"Bearer {self.api_key}", + "X-Secret-Key": self.secret_key, + "Content-Type": "application/json" + } + + def _request(self, method, endpoint, params=None, data=None): + """API 요청을 처리하는 내부 헬퍼 함수""" + url = f"{self.base_url}{endpoint}" + try: + response = requests.request(method, url, headers=self.headers, params=params, json=data) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + print(f"API 요청 오류: {e}") + return None + + # ========================================== + # 1. 조회 API + # ========================================== + def get_account_balance(self): + """계좌 잔고 및 보유 종목 조회""" + endpoint = f"/v1/account/{self.account_number}/balance" # 예시 URL + return self._request("GET", endpoint) + + def get_current_price(self, ticker): + """특정 종목의 현재가 조회""" + endpoint = f"/v1/market/price/{ticker}" # 예시 URL + return self._request("GET", endpoint) + + # ========================================== + # 2. 주문 API (구매/판매/취소) + # ========================================== + def create_order(self, ticker, order_type, price, quantity): + """ + 매수/매도 주문 실행 + - order_type: "BUY" (매수) 또는 "SELL" (매도) + """ + endpoint = "/v1/orders" # 예시 URL + payload = { + "account_number": self.account_number, + "ticker": ticker, + "order_type": order_type, + "price": price, + "quantity": quantity, + "order_class": "LIMIT" # 지정가 주문 (단타 목표가 설정에 필수) + } + return self._request("POST", endpoint, data=payload) + + def cancel_order(self, order_id): + """미체결 주문 취소 (지정가 매매 시 필수)""" + endpoint = f"/v1/orders/{order_id}/cancel" # 예시 URL + return self._request("POST", endpoint)