가격 예측은 일반적으로 머신러닝과 딥러닝 알고리즘을 결합하고 과거 데이터와 시장 기술 지표를 사용합니다. 다음은 몇 가지 일반적인 방법입니다.
강화 학습을 사용하는 지능형 거래 시스템은 시뮬레이션된 시장 환경에서 학습하고 시간이 지남에 따라 구매 및 판매 결정을 최적화하여 점차적으로 거래 전략을 개선할 수 있습니다.
AI 모델은 뉴스와 소셜미디어의 정서 분석을 통해 시장 정서를 판단하고, 외부 요인에 따른 주가 변동을 예측할 수 있습니다.
여러 알고리즘을 외부 데이터(예: 경제 지표, 회사 기본 분석)와 결합하면 가장 효과적인 AI 주가 예측 모델이 생성되는 경우가 많습니다.
주가 예측에 AI를 사용할 때 모델은 투자자의 의사 결정을 돕기 위해 다양한 지표를 생성합니다. 이러한 지표는 시장 동향을 판단하고 다양한 시나리오에 따라 해당 거래 작업을 수행하는 데 사용될 수 있습니다. 다음은 이를 운영하기 위한 몇 가지 일반적인 예측 지표와 전략입니다.
모델이 직접 예측한 미래 주가 가치입니다.
모델은 주식 가격이 오르거나 내릴 확률을 예측할 수 있습니다.
모델은 이동 평균과 같은 기술 지표를 기반으로 주식의 추세 방향을 예측할 수 있습니다.
RSI(상대 강도 지수)와 같은 기술 지표를 사용하여 주식이 과매수 또는 과매도 상태인지 확인할 수 있습니다.
이 모델은 주식의 미래 가격 변동 범위를 예측할 수 있습니다.
시장의 구매자와 판매자의 강점을 기반으로 예측합니다.
모델은 과거 데이터를 기반으로 합리적인 손절매 및 이익 실현 지점을 제안할 수 있습니다.
다양한 예측 지표에 따라 투자자는 매수, 매도, 방관 등 상응하는 거래 결정을 내릴 수 있습니다. 여러 지표를 결합하면 다양한 시장 시나리오에서 보다 합리적인 투자 결정을 내리는 데 도움이 될 수 있습니다.
수많은 회전 판정 지표 중 모든 지표가 동일한 예측력을 갖는 것은 아닙니다. 다음은 최근(2020~2025년)의 시장 경험을 바탕으로 정확성과 실용성에 따라 등급을 매기고, 시장 간 비교와 프로세스 자동화를 통해 구하고 계산하는 방법을 설명한다.
| 색인 | 정확도 등급 | 리드타임 | 최근 몇 년간의 검증 사례 |
|---|---|---|---|
| 수익률 곡선(2년-10년 스프레드) | 매우 높음 | 6~18개월 | 2022년 7월 반전, 2023년 지역 은행 위기와 경기 둔화에 대한 정확한 경고 |
| ISM 제조업 신규수주지수 | 매우 높음 | 3~6개월 | 산업재 및 원자재주는 2022년 4분기 42이하로 하락한 뒤 2023년 1분기 바닥을 기록 |
| 고수익 채권 스프레드(HY 스프레드) | 매우 높음 | 2~4개월 | 2022년에는 금리스프레드가 위험자산 저점에 정확히 부합하는 500bp 이상으로 확대될 예정 |
| 구리/금 비율 | 높은 | 2~5개월 | 2020년 3월 구리-금 비율이 바닥을 친 후 글로벌 경기 순환주는 1년 동안 상승하기 시작했습니다. |
| 글로벌 자금 흐름(EPFR 자금 흐름) | 높은 | 1~3개월 | 2023년 말에는 신흥시장 ETF로 자금이 유입돼 신흥국 지수 반등을 약 2개월 앞당길 예정이다. |
| Fed 점 도표 및 선물 내재 이자율 | 높은 | 3~6개월 | 2023년 말, 시장은 2024년 금리 인하 가격을 책정하고 있으며, 성장주는 예정보다 일찍 시작될 것입니다. |
| 국가별 PMI 차이 | 높은 | 1~3개월 | 2024년에는 미국 PMI가 계속해서 확대되는 반면 유럽은 위축될 것이며 미국 주식은 계속해서 유럽 주식을 능가할 것입니다. |
| VIX 패닉 지수 | 중간 | 즉시 ~ 1개월 | 역지표로 효과적이지만 2021년 다수의 잘못된 돌파구로 실용성 감소 |
| 자금조달잔고 및 소매투자심리 조사 | 중간 | 즉시 ~ 2주 | 극한값은 유용하지만 중간 구간에 노이즈가 너무 많아 다른 지표와 매칭이 필요하다. |
수익률곡선이 높은 정확도를 유지하는 이유는 미래경제에 대한 채권시장의 집합가격을 반영하기 때문이다. 채권시장 참여자는 기관법인이 지배하고 있으며, 정보 효율성은 개인 투자자가 지배하는 시장보다 훨씬 높습니다. ISM의 신규 수주는 기업 측의 실제 수요 변화를 직접적으로 반영하며 시장 정서에 영향을 받지 않습니다. 고수익 채권 스프레드는 신용 시장의 "스트레스 게이지"입니다. 기업의 부도 위험이 높아지면 펀드는 고위험 자산에서 가장 먼저 인출됩니다. 이 신호는 대개 주식시장의 반응보다 먼저 나타납니다.
상대적으로 VIX와 자금 조달 잔액의 정확성은 최근 몇 년 동안 감소했습니다. 주된 이유는 제로데이 만료 옵션(0DTE)이 옵션 시장 구조를 크게 변화시키고 VIX를 왜곡했기 때문입니다. 소셜 미디어를 통한 개인 투자자들의 집단적 행동 또한 전통적인 정서 지표의 신호 품질을 저하시켰습니다.
서로 다른 시장을 순환적으로 비교할 때는 비교 가능한 표준화된 프레임워크를 확립해야 합니다.
두 시장이나 업종의 가격을 비교하고 비율의 추세 방향을 관찰하세요. 예를 들어, "MSCI 신흥시장지수/MSCI 선진시장지수"를 곡선으로 그린다면, 이 비율이 증가한다는 것은 신흥시장의 성과가 더 좋다는 것을 의미합니다. 이 방법은 두 개의 비교 가능한 자산에 적용될 수 있습니다.
다양한 시장의 지표는 Z-Score(평균과의 표준편차의 배수)로 균일하게 변환되며, 수평적 비교는 차원적 차이를 제거한 후에만 가능합니다. 공식은 다음과 같습니다. Z = (현재 가치 - 지난 N 기간의 평균값) / 지난 N 기간의 표준 편차. 예를 들어 미국 PMI는 52이고 유로존 PMI는 47입니다. 표면적으로는 큰 차이가 없습니다. 그러나 미국 PMI 과거 평균이 53이면 표준 편차는 3이고 Z-Score는 -0.33입니다.
Citi 경제 서프라이즈 지수는 실제 경제 데이터가 시장 기대치와 얼마나 다른지 측정합니다. 이 지수를 국가별로 비교하면 어느 지역의 펀더멘털이 기대 이상으로 개선되거나 악화되고 있는지 확인할 수 있습니다. 자금은 서프라이즈 지수가 개선되는 시장으로 흘러가는 경향이 있습니다.
다음은 Python을 사용하여 자동화된 모니터링 시스템을 구축하는 전체 아키텍처 및 프로그램 예제입니다.
| 데이터 유형 | 무료 소스 | Python 제품군/API | 업데이트 빈도 |
|---|---|---|---|
| 주가,ETF가격 | Yahoo Finance | yfinance | 실시간/일간라인 |
| 미국 국채 수익률 | FRED(연방준비은행 데이터베이스) | fredapi | 일일 |
| PMI、GDP、CPI | FRED / OECD | fredapi / pandas-datareader | 월/분기 |
| 고수익 채권 스프레드 | FRED(BAMLH0A0HYM2) | fredapi | 일일 |
| 구리와 금 가격 | Yahoo Finance | yfinance(HG=F, GC=F) | 실시간/일간라인 |
| VIX 지수 | Yahoo Finance / CBOE | yfinance(^VIX) | 즉각적인 |
| 자금 흐름 | ETF 보유량의 예상 변화 | yfinance(거래량 + 순자산 변화) | 일일 |
| 선물 내재이자율 | CME FedWatch(크롤러 필요) | requests + BeautifulSoup | 즉각적인 |
# === 필수 패키지 설치 === # pip install yfinance fredapi pandas numpy schedule import yfinance as yf import pandas as pd import numpy as np from fredapi import Fred from datetime import datetime, timedelta # FRED API 키(무료로 신청하려면 https://fred.stlouisfed.org/docs/api/api_key.html로 이동) fred = Fred(api_key='YOUR_FRED_API_KEY') # ========================================== # 1. 수익률 곡선: 2년-10년 금리 스프레드 # ========================================== def get_yield_curve_spread(): gs10 = fred.get_series('DGS10') # 10년 국채수익률 gs2 = fred.get_series('DGS2') # 2년만기 국채수익률 spread = gs10 - gs2 spread = spread.dropna() latest = spread.iloc[-1] status = "거꾸로(경기침체 경고)" if latest < 0 else "정상" return { 'spread': round(latest, 3), 'status': status, 'series': spread.tail(252) # 지난 1년간의 정보 } # ========================================== # 2. 고수익 채권 스프레드 # ========================================== def get_hy_spread(): hy = fred.get_series('BAMLH0A0HYM2') hy = hy.dropna() latest = hy.iloc[-1] avg_1y = hy.tail(252).mean() z_score = (latest - hy.tail(756).mean()) / hy.tail(756).std() return { 'spread_bp': round(latest * 100, 0), 'z_score': round(z_score, 2), 'risk_level': "위험" if z_score > 1.5 else "중립적" if z_score > -0.5 else "낮은 위험" } # ========================================== # 3. 브론즈-골드 비율 # ========================================== def get_copper_gold_ratio(): copper = yf.download('HG=F', period='2y')['Close'] gold = yf.download('GC=F', period='2y')['Close'] ratio = copper / gold ratio = ratio.dropna() current = ratio.iloc[-1] ma_200 = ratio.rolling(200).mean().iloc[-1] trend = "경기 확장 신호" if current > ma_200 else 경기 위축 신호” return {'ratio': round(current, 5), 'ma200': round(ma_200, 5), 'trend': trend} # ========================================== # 4. 시장별 상대적 강점 비교 # ========================================== def relative_strength(ticker_a, ticker_b, period='1y'): """두 자산의 상대적인 강도 비율과 추세를 계산합니다""" a = yf.download(ticker_a, period=period)['Close'] b = yf.download(ticker_b, period=period)['Close'] ratio = a / b ratio = ratio.dropna() ma_50 = ratio.rolling(50).mean() latest_ratio = ratio.iloc[-1] latest_ma = ma_50.iloc[-1] outperformer = ticker_a if latest_ratio > latest_ma else ticker_b return { 'ratio': round(latest_ratio, 4), 'ma50': round(latest_ma, 4), 'outperformer': outperformer, 'series': ratio } #사용 예: # 상대적_강도('IWF', 'IWD') # 성장 대 가치 #relative_strength('EEM', 'SPY') # 신흥 시장 대 미국 주식 #relative_strength('^TWII', '000300.SS') # 대만 주식 대 CSI 300 # ========================================== # 5. Z-점수 정규화된 시장 간 비교 # ========================================== def zscore_compare(series_dict, lookback=756): """ 여러 시장에서 시계열을 수신하고 Z-Score를 계산하고 수평으로 비교합니다. series_dict: {'미국': pd.Series, '유럽': pd.Series, ...} """ results = {} for name, series in series_dict.items(): s = series.dropna().tail(lookback) current = s.iloc[-1] z = (current - s.mean()) / s.std() results[name] = { 'current': round(current, 3), 'z_score': round(z, 2), 'percentile': round((s < current).mean() * 100, 1) } return pd.DataFrame(results).T.sort_values('z_score', ascending=False) # ========================================== # 6. 부문 모멘텀 순위 # ========================================== def sector_momentum_ranking(): """미국 11개 주요 주식 부문 ETF의 다기간 모멘텀 및 순위 획득""" sectors = { '과학과 기술': 'XLK', '재원': 'XLF', '의료': 'XLV', '불필요한 소비': 'XLY', '필수소비': 'XLP', '산업': 'XLI', '에너지': 'XLE', '원재료': 'XLB', '유용': 'XLU', '부동산': 'XLRE', '의사소통': 'XLC' } results = [] for name, ticker in sectors.items(): data = yf.download(ticker, period='1y')['Close'] ret_1m = (data.iloc[-1] / data.iloc[-21] - 1) * 100 ret_3m = (data.iloc[-1] / data.iloc[-63] - 1) * 100 ret_6m = (data.iloc[-1] / data.iloc[-126] - 1) * 100 # 종합 모멘텀 점수: 가까운 미래에 가중치가 높아집니다. score = ret_1m * 0.4 + ret_3m * 0.35 + ret_6m * 0.25 results.append({ '그릇': name, '1개월%': round(ret_1m, 2), '3개월%': round(ret_3m, 2), '6개월%': round(ret_6m, 2), '종합운동에너지': round(score, 2) }) df = pd.DataFrame(results).sort_values('종합운동에너지', ascending=False) return df.reset_index(drop=True)
import schedule import time import requests def send_line_notify(token, msg): """LINE Notify로 메시지 보내기""" headers = {'Authorization': f'Bearer {token}'} requests.post('https://notify-api.line.me/api/notify', headers=headers, data={'message': msg}) def daily_rotation_report(): """일일 순환 모니터링 보고서""" yc = get_yield_curve_spread() hy = get_hy_spread() cg = get_copper_gold_ratio() sectors = sector_momentum_ranking() report = 에프""" === 일일 회전 모니터링 === 날짜: {datetime.now().strftime('%Y-%m-%d')} 수익률 곡선(2Y-10Y): {yc['spread']}% {yc['status']} 고수익 채권 스프레드 Z-점수: {hy['z_score']} ({hy['risk_level']}) 구리-금 비율 추세: {cg['trend']} 상위 3개 부문 모멘텀 순위: {sectors.head(3).to_string(index=False)} 업종 모멘텀은 하위 3위입니다. {sectors.tail(3).to_string(index=False)} """ print(report) # send_line_notify('YOUR_LINE_TOKEN', report) return report # 매일 오후 6시에 실행 schedule.every().monday.at("18:00").do(daily_rotation_report) schedule.every().tuesday.at("18:00").do(daily_rotation_report) schedule.every().wednesday.at("18:00").do(daily_rotation_report) schedule.every().thursday.at("18:00").do(daily_rotation_report) schedule.every().friday.at("18:00").do(daily_rotation_report) while True: schedule.run_pending() time.sleep(60)
def rotation_dashboard(): """ 현재 경제 사이클 단계에 대한 판단을 출력하는 종합적인 다중 지표 복귀 : 회복/확장/과열/경기침체 확률 추정 """ scores = {'회복': 0, '확장': 0, '과열': 0, '감소': 0} #수익률 곡선 신호 yc = get_yield_curve_spread() if yc['spread'] < -0.5: scores['감소'] += 3 elif yc['spread'] < 0: scores['과열'] += 2; scores['감소'] += 1 elif yc['spread'] < 1.0: scores['확장'] += 2 else: scores['회복'] += 3 # 고수익 채권 스프레드 신호 hy = get_hy_spread() if hy['z_score'] > 1.5: scores['감소'] += 3 elif hy['z_score'] > 0.5: scores['과열'] += 2 elif hy['z_score'] > -0.5: scores['확장'] += 2 else: scores['회복'] += 2 # 구리-금 비율 신호 cg = get_copper_gold_ratio() if cg['ratio'] > cg['ma200']: scores['확장'] += 2 else: scores['감소'] += 1; scores['회복'] += 1 # 확률분포로 변환 total = sum(scores.values()) probs = {k: round(v/total*100, 1) for k, v in scores.items()} phase = max(probs, key=probs.get) return { '심판주기': phase, '각 단계의 확률': probs, '권장 구성': { '회복': '기술과 금융에 비중확대; 저체중 수비', '확장': '원료와 에너지에 대한 비중확대; 높은 수준의 재고를 유지하라', '과열': '성장주 비중축소; 원자재와 인플레이션 방지 자산을 늘리세요', '감소': '공공 부채와 현금을 늘리십시오. 방어 부문에 비중확대' }[phase] }
def tw_sector_rotation(): """대만 주식 ETF 모멘텀 추적""" tw_sectors = { '대만반도체': '00891.TW', '대만 ESG 지속가능성': '00850.TW', '대만 금융': '0055.TW', '대만 고배당': '0056.TW', '대만 50': '0050.TW', '대만 미디엄 100': '0051.TW', } results = [] for name, ticker in tw_sectors.items(): try: data = yf.download(ticker, period='6mo')['Close'].dropna() if len(data) < 63: continue ret_1m = (data.iloc[-1] / data.iloc[-21] - 1) * 100 ret_3m = (data.iloc[-1] / data.iloc[-63] - 1) * 100 results.append({ '재고': name, '1 월 보수%': round(ret_1m, 2), '3개월 보수%': round(ret_3m, 2), '운동에너지 분율': round(ret_1m * 0.5 + ret_3m * 0.5, 2) }) except Exception as e: print(f"{name}획득 실패:{e}") return pd.DataFrame(results).sort_values('운동에너지 분율', ascending=False)
프로그래밍된 모니터링의 핵심 가치는 인간의 판단을 대체하는 것이 아니라 정서적 간섭을 제거하고 규율을 보장하는 것입니다. 시스템을 구축할 때 다음 사항에 특별한 주의가 필요합니다.
yfinance는 Yahoo Finance에서 금융 시장 데이터를 얻기 위해 Ran Aroussi가 개발한 오픈 소스 Python 제품군입니다. Yahoo Finance가 2017년 공식 API를 종료한 후 yfinance는 공개 정보에 액세스하는 가장 인기 있는 도구가 되었습니다. 최신 버전은 1.2.0(2026년 2월 출시)으로, Apache에서 라이센스가 부여되었으며 완전 무료이며 연구 및 교육 목적에 적합합니다.
# 설치하다 pip install yfinance #최신버전으로업그레이드 pip install yfinance --upgrade # 기본 가져오기 import yfinance as yf
yfinance의 종속성 패키지에는 pandas, numpy, 요청 및 lxml이 포함되어 있으며 Anaconda 환경을 사용하는 경우 모두 사전 설치되어 있습니다.
| 클래스/기능 | 사용 | 사용 예 |
|---|---|---|
| Ticker | 단일 대상(가격, 재무 보고서, 배당금 등)에 대한 모든 데이터에 액세스하세요. | yf.Ticker("AAPL") |
| Tickers | 여러 대상을 동시에 처리 | yf.Tickers("AAPL MSFT GOOG") |
| download() | 여러 대상의 과거 가격을 일괄 다운로드(가장 일반적으로 사용되는 기능) | yf.download("SPY QQQ", period="1y") |
| Search | 검색 코드 | yf.Search("TSMC") |
| Market | 시장 요약 데이터에 액세스 | yf.Market("us_market") |
| Sector / Industry | 산업 및 부문 정보에 액세스 | yf.Sector("technology") |
| WebSocket | 라이브 스트리밍 시장 데이터(v1.0+ 새로운 기능) | yf.WebSocket(on_message=callback) |
yfinance가 얻을 수 있는 정보는 단순한 주가를 넘어서 다음 범주를 포괄합니다.
| 데이터 카테고리 | 특정 콘텐츠 | 해당 속성/메서드 |
|---|---|---|
| 역사적 가격 | OHLCV(시가 최고가, 최저 마감 거래량), 조정된 종가 | .history() 또는 yf.download() |
| 기본 회사 정보 | 시가총액, 주가수익률, 52주 최고가와 최저가, 업종분류, 직원수 등 | .info |
| 재무제표 | 손익계산서, 대차대조표, 현금흐름표(연간 및 분기별) | .income_stmt / .balance_sheet / .cashflow / .quarterly_income_stmt |
| 배당금과 분할 | 역사적 배당금 분배 및 주식 분할 기록 | .dividends / .splits / .actions |
| 분석가 정보 | 목표주가, 투자의견, 수익예상 | .analyst_price_targets / .recommendations |
| 옵션 | 만료일, 콜/풋 체인 | .options / .option_chain() |
| 법인 보유 | 주요 기관 보유, 내부자 거래 | .institutional_holders / .insider_transactions |
| 달력 | 재무보고일, 배당락일 등 | .calendar |
| 시장 유형 | 코드 형식 | 예 |
|---|---|---|
| 미국 주식 | 코드를 직접 입력하세요 | AAPL, MSFT, TSLA, SPY |
| 대만 주식 | 코드 .TW(등재) / 코드 .TWO(등장) | 2330.TW(TSMC), 0050.TW, 0056.TW |
| 일본 주식 | 코드.티 | 7203.T(Toyota), 6758.T(Sony) |
| 홍콩 주식 | 코드.HK | 0700.HK(텐센트), 9988.HK(알리바바) |
| 본토 주식 | Code.SS(상하이)/Code.SZ(심천) | 600519.SS(마오타이), 000001.SZ |
| 유럽 주식 | Code.Exchange 접미사 | SAP.DE(독일), MC.PA(프랑스 LVMH), AZN.L(런던) |
| 색인 | ^로 시작 | ^GSPC(S&P 500), ^DJI(다우 존스), ^IXIC(나스닥), ^TWII(가중 지수), ^N225(닛케이) |
| 선물 | 코드=F | GC=F(금), SI=F(은), CL=F(원유), HG=F(구리), NG=F(천연가스) |
| 암호화폐 | 코드-USD | BTC-USD, ETH-USD, SOL-USD, ADA-USD |
| 외환 | 코드 1 코드 2 = X | EURUSD=X, JPYUSD=X, TWDUSD=X |
| ETF | 코드를 직접 입력하세요 | SPY, QQQ, EEM, VGK, EWT, EWJ |
import yfinance as yf # ======================================== # 방법 1: Ticker 객체 사용 (단일 대상에 대한 심층 분석에 적합) # ======================================== tsmc = yf.Ticker("2330.TW") # 역사적 가격을 얻으세요 hist = tsmc.history(period="1y") #거의 1년 hist = tsmc.history(period="6mo") # 지난 6개월 hist = tsmc.history(period="5d") # 지난 5일 hist = tsmc.history(period="max") # 모든 역사 hist = tsmc.history(start="2024-01-01", end="2025-12-31") #기간 지정 # 기간 매개변수 옵션: # 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max # ======================================== #방법 2: download() 사용(여러 표준을 일괄 다운로드하는 데 적합) # ======================================== data = yf.download( tickers="SPY QQQ EEM GC=F BTC-USD", period="1y", interval="1d", #일제 group_by="ticker", #대상별로 그룹화 auto_adjust=True, # 권리금 자동 조정 threads=True #다중 스레드로 다운로드 속도 향상 ) # 특정 객체에 접근: data['SPY']['Close'] # ======================================== # 시간 세분성(간격 매개변수) # ======================================== # 분 레벨: 1m, 2m, 5m, 15m, 30m, 60m, 90m # 시간 수준: 1h # 일 수준 이상: 1일, 5일, 1주, 1개월, 3개월 # # 참고 제한사항: # 100만 개의 데이터는 지난 7일 동안만 검색할 수 있습니다. # 일중 데이터(간격 < 1d)는 지난 60일 동안만 사용할 수 있습니다. # 일일선 위, 수십년간의 이력 확인 가능 # 5분 K라인(지난 5일)을 받아보세요 intraday = yf.download("AAPL", period="5d", interval="5m")
History() 및 download()는 모두 다음 필드가 포함된 Pandas DataFrame을 반환합니다.
| 필드 | 설명하다 |
|---|---|
| Open | 개장 가격 |
| High | 최고가 |
| Low | 최저 가격 |
| Close | 종가(배당금에 따라 조정된 기본값) |
| Volume | 용량 |
| Dividends | 배당금 (.history() 만 있음) |
| Stock Splits | 주식 분할(.history()에서만 사용 가능) |
msft = yf.Ticker("MSFT") # === 기본 회사 정보 (return dict) === info = msft.info print(info['marketCap']) # 시가총액 print(info['trailingPE']) # 가격 대비 수익 비율 print(info['dividendYield']) #배당수익률 print(info['fiftyTwoWeekHigh']) #52주 최고가 print(info['sector']) #산업 print(info['longBusinessSummary'])# 회사 프로필 # === 재무제표(DataFrame 반환) === msft.income_stmt # 연간 손익계산서 msft.quarterly_income_stmt # 분기별 손익계산서 msft.balance_sheet # 연간 대차대조표 msft.quarterly_balance_sheet # 분기별 대차대조표 msft.cashflow #연간현금흐름표 msft.quarterly_cashflow # 분기별 현금흐름표 # === 배당금과 분할 === msft.dividends #역사적 배당금 msft.splits # 역사적 주식분할 msft.actions # 배당+분할합병 # === 분석가 정보 === msft.analyst_price_targets # 목표주가(고/저/평균/중간) msft.recommendations #애널리스트 평가 msft.calendar # 달력(결산보고일 등) # === 법인 지분 === msft.institutional_holders # 기관 보유 msft.major_holders # 주요주주 msft.insider_transactions #내부자거래 # === 선택 === msft.options # 사용 가능한 마감일 목록 chain = msft.option_chain(msft.options[0]) chain.calls # 통화정보 chain.puts # 정보를 담다
# ======================================== # 1. 일괄 다운로드 후 단일 대상의 종가를 구합니다. # ======================================== data = yf.download(["SPY", "GC=F", "BTC-USD"], period="1y") spy_close = data['Close']['SPY'] # 다중 인덱스는 MultiIndex입니다. # 단일 대상 다운로드 시 직접 접근 spy = yf.download("SPY", period="1y") spy_close = spy['Close'] # ======================================== # 2. MultiIndex 처리를 위한 .squeeze() 기술 # ======================================== # 단일 대상을 다운로드할 때 Close 필드가 Series가 아닌 DataFrame일 수 있습니다. # 시리즈로의 변환을 보장하려면 .squeeze()를 사용하세요. close = yf.download("AAPL", period="1y")['Close'].squeeze() # ======================================== # 3. 오류 처리(yfinance가 가끔 실패할 수 있음) # ======================================== def safe_download(ticker, **kwargs): """안전한 다운로드, 실패 시 빈 DataFrame 반환""" try: data = yf.download(ticker, progress=False, **kwargs) if data.empty: print(f"{ticker}: 정보 없음") return data except Exception as e: print(f"{ticker}다운로드 실패:{e}") return pd.DataFrame() # ======================================== #4. 대만주식의 자주 사용되는 코드를 빠르게 확인해보세요 # ======================================== tw_tickers = { 'TSMC': '2330.TW', '혼하이': '2317.TW', '미디어텍': '2454.TW', '대만 50': '0050.TW', '고배당': '0056.TW', '재원': '0055.TW', '반도체': '00891.TW', '가중지수': '^TWII', } # ======================================== # 5. 기술 지표 계산의 전체 예 # ======================================== import pandas as pd ticker = yf.Ticker("2330.TW") df = ticker.history(period="1y") # 이동 평균 df['MA20'] = df['Close'].rolling(20).mean() df['MA60'] = df['Close'].rolling(60).mean() df['EMA12'] = df['Close'].ewm(span=12).mean() # RSI delta = df['Close'].diff() gain = delta.where(delta > 0, 0).rolling(14).mean() loss = (-delta.where(delta < 0, 0)).rolling(14).mean() df['RSI'] = 100 - (100 / (1 + gain / loss)) # 볼린저 밴드 df['BB_mid'] = df['Close'].rolling(20).mean() df['BB_std'] = df['Close'].rolling(20).std() df['BB_upper'] = df['BB_mid'] + 2 * df['BB_std'] df['BB_lower'] = df['BB_mid'] - 2 * df['BB_std'] print(df[['Close','MA20','RSI','BB_upper','BB_lower']].tail()) # ======================================== # 6. CSV로 내보내기 # ======================================== df.to_csv("tsmc_data.csv", encoding="utf-8-sig") #utf-8-sig를 사용하면 Excel에서 중국어를 올바르게 표시할 수 있습니다.
| 한계 | 자세한 설명 | 대처 전략 |
|---|---|---|
| 비공식 API | yfinance는 Yahoo와 제휴하지 않습니다. Yahoo의 공개 API를 사용하며 Yahoo 버전 개정으로 인해 일시적으로 유효하지 않을 수 있습니다. | 최신 버전으로 계속 업데이트하세요. 백업 데이터 소스 준비(예: 대만 주식에는 FinMind를 사용할 수 있음) |
| 주파수 제한 | 단기간에 많은 요청이 발생하면 Yahoo에서 해당 IP를 일시적으로 차단할 수 있습니다. | 루프에 time.sleep(1)을 추가합니다. 요청을 줄이려면 Progress=False를 사용하세요. 데이터를 로컬로 캐시 |
| 일중 데이터 마감일 | 1분 데이터는 7일 동안만 보관됩니다. 일중 데이터는 최대 60일 동안 보관됩니다. | 장기간의 일중 데이터가 필요한 경우 정기적으로 다운로드하여 로컬 데이터베이스에 저장해야 합니다. |
| 데이터 품질 | 때때로 누락된 값이나 이상값이 있습니다. 일부 인기 없는 타겟의 데이터가 불완전합니다. | 다운로드 후 정리하려면 .dropna()를 사용하십시오. 중요한 분석을 위해 다중 소스 교차 검증을 사용합니다. |
| 개인/연구 용도로만 사용 | Yahoo Finance의 이용 약관은 자료를 상업적인 재판매가 아닌 개인적인 용도로 제한합니다. | 상업적 사용에는 유료 API(예: Bloomberg, Refinitiv, Polygon.io)를 사용해야 합니다. |
| 일부 방법은 웹 크롤러를 사용합니다. | 상대적으로 불안정한 Yahoo 웹 페이지를 크롤링하여 몇 가지 기능(예: 일부 .info 필드)을 얻습니다. | 핵심 .history() 및 download()는 공식 API를 사용하며 매우 안정적입니다. |
| 키트/서비스 | 비용 | 장점 | 단점 |
|---|---|---|---|
| yfinance | 무료 | 사용하기 쉽고, 다양한 정보와 활발한 커뮤니티 | 비공식, 때때로 유효하지 않음, 고빈도 거래에 적합하지 않음 |
| Alpha Vantage | 무료(제한적) / 유료 | 내장된 기술 지표 계산 및 공식 API 키 | 무료 버전은 분당 5개의 요청으로 제한됩니다. |
| FRED API(fredapi) | 무료 | 가장 권위 있는 일반 경제 데이터(수익률, PMI, GDP 등) | 일반 경제 데이터만 있고 개별 주가는 없습니다. |
| FinMind | 무료(제한적) | 법인 칩, 금융 채권 등을 포함한 대만 주식에 대한 가장 완전한 정보입니다. | 대만 시장에만 해당 |
| Polygon.io | 무료(지연) / 유료(즉시) | 매우 낮은 지연 시간(1ms), 실시간 트랜잭션에 적합 | 무료 버전 데이터가 15분 지연됩니다. |
개인 연구 및 학습, 전략 프로토타이핑, 중장기 투자 분석을 위해서는 yfinance가 가장 좋은 시작점입니다. 심플한 디자인 덕분에 초보자도 두세 줄의 코드로 글로벌 시장 데이터를 얻고 이를 팬더로 분석할 수 있습니다. 요구 사항이 실시간 트랜잭션이나 상용 애플리케이션으로 업그레이드되면 유료 API로 전환할 수 있습니다.
MetaQuotes 언어(MQL)는 금융 시장 거래를 위해 특별히 개발된 프로그래밍 언어이며 MetaTrader 플랫폼(예: MT4 및 MT5)에서 자동화된 거래 전략(전문가 조언자), 맞춤형 지표, 스크립트 및 기능 라이브러리를 생성하는 데 사용됩니다.
// 새로운 K 스틱이 시작될 때마다 동작
정수 시작() {
if (OrdersTotal() == 0 && Volume[0] == 1) {
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "주문 구매", 0, 0, clrGreen);
}
0을 반환합니다.
}
#property indicator_separate_window
#property indicator_buffers 1
double Buffer[];
int OnInit() {
SetIndexBuffer(0, Buffer);
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total, const int prev_calculated,
const datetime &time[], const double &open[],
const double &high[], const double &low[],
const double &close[], const long &tick_volume[],
const long &volume[], const int &spread[]) {
for (int i = 0; i < rates_total; i++) {
Buffer[i] = close[i] - open[i];
}
return(rates_total);
}
MQL 코드는 MetaTrader에 내장된 MetaEditor를 통해 편집 및 컴파일될 수 있으며 전략 테스터에서 백테스트 및 최적화될 수 있습니다.
MetaQuotes Language는 거래 자동화를 위해 만들어진 전문 언어입니다. 초보자와 전문 퀀트 트레이더 모두 강력한 기능을 사용하여 정교한 트레이딩 전략을 구현할 수 있습니다.
이는 여러 지표, 그리기 도구 및 완전한 거래 인터페이스(브로커에 연결된 경우)를 포함하는 가장 완벽한 버전입니다.
<!-- 고급 차트 컨테이너 -->
<div class="tradingview-widget-container">
<div id="tradingview_adv"></div>
<script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>
<스크립트 유형="텍스트/자바스크립트">
새로운 TradingView.widget({
"자동 크기 조정": 사실,
"symbol": "바이낸스:BTCUSDT",
"간격": "H",
"timezone": "기타/UTC",
"테마": "어두운",
"스타일": "1",
"로케일": "zh_TW",
"container_id": "tradingview_adv"
});
</스크립트>
</div>
이 도구는 대시보드로 제공되며 다양한 기술 지표(예: 이동 평균, 오실레이터)를 기반으로 매수 또는 매도 추천을 자동으로 계산하고 표시합니다.
<!-- 기술 분석 가젯 -->
<div class="tradingview-widget-container">
<div class="tradingview-widget-container__widget"></div>
<script type="text/javascript" src="https://s3.tradingview.com/external-embedding/embed-widget-technical-analytic.js" async>
{
"간격": "1분",
"너비": 425,
"isTransparent": 거짓,
"높이": 450,
"symbol": "나스닥:TSLA",
"showIntervalTabs": 사실,
"로케일": "zh_TW",
"colorTheme": "빛"
}
</스크립트>
</div>
여러 상품의 실시간 가격비교를 표시하는데 적합합니다. 금융사이트 홈페이지 사이드바에서 흔히 볼 수 있는 내용입니다.
<!-- 시장 개요 -->
<div class="tradingview-widget-container">
<script type="text/javascript" src="https://s3.tradingview.com/external-embedding/embed-widget-market-overview.js" async>
{
"colorTheme": "어두운",
"dateRange": "12M",
"showChart": 사실,
"로케일": "zh_TW",
"너비": "100%",
"높이": "400",
"탭": [
{
"제목": "색인",
"기호": [
{"s": "FOREXCOM:SPX500", "d": "S&P 500"},
{"s": "FOREXCOM:NSXUSD", "d": "나스닥 100"}
]
}
]
}
</스크립트>
</div>
JavaScript를 수동으로 작성하는 것이 가능하지만 TradingView는 구문 오류를 피하기 위해 권장되는 공식 그래픽 생성기를 제공합니다:
| 질문 | 해결책 |
|---|---|
| 차트를 로드할 수 없습니다. | 조사하다container_idHTML ID와 정확하게 일치하는지 여부입니다. |
| 너비 런닝 버전 | 할 것이다width로 설정"100%"그리고 외부 div의 너비가 고정되어 있는지 확인하세요. |
| 데이터 지연 | 무료 버전 위젯 데이터는 교환에 따라 일반적으로 15~20분 정도 지연됩니다. |
바이낸스는 개발자에게 다음을 포함하여 풍부한 API 지원을 제공하는 선도적인 글로벌 암호화폐 거래소입니다.Spot API그리고Client API, 사용자가 자동 거래 및 데이터 수집을 수행할 수 있도록 지원합니다.
바이낸스 현물 API는 현물 시장 거래자를 위해 바이낸스가 설계한 API입니다. 시장 정보 쿼리, 주문, 주문 취소 및 기타 작업에 사용할 수 있습니다. 이 API는 일반적으로 거래 봇, 자동화된 거래 전략을 설계하고 시장 변동을 모니터링하는 데 사용됩니다.
바이낸스 클라이언트 API는 바이낸스의 다양한 API 방법에 액세스할 수 있는 편리한 방법을 제공합니다. 개발자는 다음을 사용할 수 있습니다.binance.client라이브러리 API
다양한 현물시장과 계약시장의 인증 및 관리, 편리한 호출 기능을 제공합니다.
pip install binancebinance.clientAPI 연결 및 호출binance.spot방법.binance.client에서 클라이언트 가져오기
#클라이언트 초기화
클라이언트 = 클라이언트(api_key='your_api_key', api_secret='your_secret_key')
# 현재 가격을 가져옵니다
가격 = client.get_symbol_ticker(symbol="BTCUSDT")
인쇄(가격)
Bybit는 시장 상황 조회, 주문, 펀딩 비율 확인, 계정 관리 등에 사용할 수 있는 REST 및 WebSocket API를 제공합니다. 다음은 Python 사용 방법을 보여줍니다.requests이 제품군은 Bybit의 공개 API를 호출합니다.
pip install requests
수입요청
BASE_URL = "https://api.bybit.com"
def get_symbols():
url = f"{BASE_URL}/v5/market/instruments-info?category=linear"
res = 요청.get(url)
res.raise_for_status()
데이터 = res.json()
기호 = [s["symbol"] for s in data["result"]["list"]]
print(f"총 {len(symbols)}개의 거래 쌍을 얻었습니다:")
print(symbols[:10]) # 처음 10개 항목을 표시합니다.
__name__ == "__main__"인 경우:
get_symbols()
import requests
def get_klines(symbol="BTCUSDT", interval="60", limit=5):
url = f"{BASE_URL}/v5/market/kline?category=linear&symbol={symbol}&interval={interval}&limit={limit}"
res = requests.get(url)
res.raise_for_status()
data = res.json()
for k in data["result"]["list"]:
print(k)
if __name__ == "__main__":
get_klines()
주문 접수, 자산 조회 등 Bybit의 프라이빗 엔드포인트에는 API Key와 서명이 필요합니다.
가져오기 요청, 시간, hmac, hashlib
API_KEY = "your_api_key"
API_SECRET = "your_api_secret"
def sign_request(매개변수, 비밀):
"""Bybit 서명 생성"""
query = "&".join([f"{k}={v}" for k, v in sorted(params.items())])
return hmac.new(secret.encode(), query.encode(), hashlib.sha256).hexdigest()
def get_wallet_balance():
엔드포인트 = "/v5/account/wallet-balance"
url = BASE_URL + 엔드포인트
타임스탬프 = str(int(time.time() * 1000))
매개변수 = {
"accountType": "UNIFIED",
"타임스탬프": 타임스탬프,
"api_key": API_KEY,
}
params["sign"] = sign_request(params, API_SECRET)
res = 요청.get(url, params=params)
인쇄(res.json())
__name__ == "__main__"인 경우:
get_wallet_balance()
파이오넥스가 사용하는/api/v1/common/symbols?type=PERP"영구 계약" 거래 쌍을 획득하려면, Bybit에서는 다음을 사용할 수 있습니다./v5/market/instruments-info지정하고category=linear(USDT 영구) 또는inverse(역 계약)은 동일한 효과를 얻습니다.
수입요청
클래스바이비트API:
BASE_URL = "https://api.bybit.com"
@classmethod
def get_symbols(cls, 카테고리="선형"):
"""
특정 유형의 거래 쌍을 얻으세요
카테고리는 다음과 같습니다:
- 선형 → USDT 무기한(PERP)
- 인버스 → 인버스 무기한/인도계약
- 스팟 → 스팟
"""
엔드포인트 = "/v5/market/instruments-info"
url = f"{cls.BASE_URL}{엔드포인트}"
params = {"범주": 범주}
res = 요청.get(url, params=params)
res.raise_for_status()
데이터 = res.json()
data.get("retCode") == 0인 경우:
기호 = [s["symbol"] for s in data["result"]["list"]]
print(f"총 {len(symbols)} {category} 유형의 거래 쌍을 얻었습니다.")
기호[:10]의 s에 대해:
인쇄
그 외:
print("획득 실패:", data)
__name__ == "__main__"인 경우:
BybitAPI.get_symbols("선형")
| Pionex | Bybit | 설명하다 |
|---|---|---|
type=PERP | category=linear | USDT 무기한 계약 |
type=SPOT | category=spot | 현물 시장 |
| — | category=inverse | 역영구 또는 인도 계약 |
{
"retCode": 0,
"result": {
"list": [
{
"symbol": "BTCUSDT",
"contractType": "LinearPerpetual",
"status": "Trading",
"lotSizeFilter": {
"minOrderQty": "0.001",
"maxOrderQty": "100",
"qtyStep": "0.001"
},
"priceFilter": {
"tickSize": "0.5"
}
}
]
}
}
category=linear즉, 파이넥스의 "PERP" 거래쌍에 해당합니다.priceFilter、lotSizeFilter및 기타 제한 사항.파이넥스에서 사용 가능/api/v1/market/klines시장 상황을 확인하세요. Bybit의 해당 엔드포인트는 다음과 같습니다./v5/market/kline. ~을 통해category시장 유형을 지정하세요(예:linearUSDT 무기한 계약을 나타냄)에 전달될 수 있습니다.symbol、interval、limit、endTime그리고 다른 매개변수.
수입요청
수입 시간
클래스바이비트API:
BASE_URL = "https://api.bybit.com"
@classmethod
def get_klines(cls, 기호: str, 간격: str, end_time: int = 없음, 제한: int = 100):
"""
Bybit K-line 정보 조회
:param 기호: "BTCUSDT"와 같은 거래 쌍
:param 간격: 시간 간격(1, 3, 5, 15, 30, 60, 120, 240, 360, 720, D, W, M)
:param end_time: 종료 시간(Unix 밀리초), 기본값은 현재입니다.
:param 한도: 반환된 트랜잭션 수, 최대 1000개
"""
엔드포인트 = "/v5/market/kline"
url = f"{cls.BASE_URL}{엔드포인트}"
매개변수 = {
"category": "선형", # USDT 무기한
"기호": 기호,
"간격": 간격,
"한계": 한도
}
end_time인 경우:
params["end"] = 종료 시간
그 외:
params["end"] = int(time.time() * 1000)
res = 요청.get(url, params=params)
res.raise_for_status()
데이터 = res.json()
data.get("retCode") == 0인 경우:
klines = 데이터["결과"]["목록"]
print(f"{symbol}은 총 {len(klines)} K개의 라인을 얻었습니다.")
# 처음 3개의 루트 정보를 표시합니다.
klines[:3]의 k에 대해:
시가_시가, 시가_가, 고가, 저가, 종가, 거래량, 회전율 = k
print(f"시가:{open_price} 종가:{종가} 고가:{고가} 저가:{낮} 거래량:{볼륨}")
그 외:
print("획득 실패:", data)
__name__ == "__main__"인 경우:
BybitAPI.get_klines(symbol="BTCUSDT", 간격="60", 제한=5)
{
"retCode": 0,
"결과": {
"기호": "BTCUSDT",
"범주": "선형",
"목록": [
[
"1735119600000", // 시작 시간(밀리초)
"98342.5", // 개시 가격
"98350.0", // 최고가
"98285.0", // 최저가
"98290.5", // 종가
"12.304", // 거래량
"1210000.5" // 거래량(USDT)
]
]
}
}
category로 변경 가능spot또는inverse다양한 시장에 대응합니다.end인수는 밀리초 단위의 타임스탬프입니다(Unix epoch × 1000).다음은 재시도, 속도 제한 및 캐시가 내장된 ThreadPoolExecutor를 사용하여 직접 재현 가능한 Python 예제입니다. 프로세스: 먼저 캐시에서 캡처된 K-라인(있는 경우)을 로드하고 누락되거나 부족한 거래 쌍에 대한 요청만 발행합니다. 스레드 풀을 사용하여 동시에 여러 요청을 실행하고 세마포어를 사용하여 제한을 피하기 위해 동시성 수를 제어합니다. 실패할 경우 지수 백오프를 사용하여 재시도합니다.
# 요구사항: pip 설치 요청
수입요청
수입 시간
JSON 가져오기
수입 OS
Concurrent.futures에서 ThreadPoolExecutor, as_completed를 가져옵니다.
스레딩 가져오기에서 세마포어
BASE_URL = "https://api.bybit.com/v5/market/kline"
CACHE_FILE = "klines_cache.json"
# 조정 가능한 매개변수
MAX_WORKERS = 20 # 스레드 풀 크기(API 비율 제한 조정에 따라 다름)
MAX_CONCURRENT = 10 # 실제 동시 요청 수(세마포어로 제어)
RETRY = 3 # 각 요청에 대한 재시도 횟수
INITIAL_BACKOFF = 0.5 # 첫 번째 재시도를 기다리는 시간(초)
CATEGORY = "선형" # 선형 -> USDT 지속 가능; 스팟/역은 변경될 수 있습니다
LIMIT_PER_CALL = 200 # 각 kline API 제한(API 상한 설정에 따라 다름)
DATASET_ALLDAYS = 24 * 6 # 예: 최소한 몇 K 라인이 필요한지 결정합니다(변경 가능).
# 캐시 로드/액세스
def load_cache():
os.path.exists(CACHE_FILE)인 경우:
시도해 보세요:
json.load(open(CACHE_FILE, "r", 인코딩="utf-8")) 반환
제외예외:
{} 반환
{} 반환
def save_cache(캐시):
json.dump(cache, open(CACHE_FILE, "w", 인코딩="utf-8"), verify_ascii=False, indent=2)
# 재시도 및 속도 제어를 포함한 단일 기호의 API 캡처(동시 실행 횟수는 세마포어에 의해 제어됨)
def fetch_klines_for_symbol(symbol, 간격="60", end_time=None, Limit=LIMIT_PER_CALL, sem: 세마포어 = 없음):
매개변수 = {
"카테고리": 카테고리,
"기호": 기호,
"간격": 간격,
"한계": 한도
}
end_time인 경우:
params["end"] = int(end_time)
백오프 = INITIAL_BACKOFF
last_exc = 없음
# 세마포어를 얻습니다(제공된 경우)
만약 sem:
sem.acquire()
시도해 보세요:
범위(1, RETRY + 1) 내 시도의 경우:
시도해 보세요:
resp = 요청.get(BASE_URL, params=params, timeout=10)
resp.raise_for_status()
데이터 = resp.json()
# Bybit v5는 성공을 나타내기 위해 retCode == 0을 반환합니다.
data.get("retCode", 0) == 0이고 데이터에 "result"가 있는 경우:
klines = data["result"].get("list", [])
클라인 반환
그 외:
last_exc = 예외(f"API 오류: {data}")
e로 요청.예외.RequestException을 제외합니다.
last_exc=e
#백오프
시간.수면(백오프)
백오프 *= 2
마지막으로:
만약 sem:
sem.release()
# 실패하면 마지막 오류를 던지거나 None을 반환합니다.
last_exc 올리기
# 일괄 처리: 쌍으로 전달(기호 목록), dict {symbol: klines} 반환
def get_klines_batch(쌍, 간격="60", 데이터 세트_alldays=DATASET_ALLDAYS, 제한=LIMIT_PER_CALL, max_workers=MAX_WORKERS, max_concurrent=MAX_CONCURRENT):
캐시 = load_cache() # 캐시 형식: { 기호: [kline_list] }
결과 = {}
to_fetch = []
# 어떤 기호를 가져와야 하는지 결정합니다(캐시에 존재하지 않거나 길이가 충분하지 않음).
쌍으로 된 s의 경우:
캐시됨 = 캐시.get(들)
캐시되고 len(cached) >= 데이터세트_alldays인 경우:
결과[들] = 캐시됨
그 외:
to_fetch.append(들)
# 가져올 것이 없으면 직접 반환하면 됩니다.
to_fetch가 아닌 경우:
결과 반환
sem = 세마포어(max_concurrent)
ThreadPoolExecutor(max_workers=max_workers)를 exe로 사용:
futures = {exe.submit(fetch_klines_for_symbol, 기호, 간격, 없음, 제한, sem): to_fetch의 기호에 대한 기호}
as_completed(선물)의 fut에 대해:
Sym = 선물[fut]
시도해 보세요:
kl = fut.result()
# API 반환이 목록 형식으로 저장되는 경우 (Bybit 예시 [time,open,high,low,close,vol,turnover]에 따름)
캐시[sym] = KL
결과[sym] = KL
e와 같은 예외를 제외하고:
# 실패를 기록하되 전체 프로그램을 차단하지는 마세요.
print(f"[오류] {sym}을(를) 획득하지 못했습니다: {e}")
결과[sym] = 없음
# 캐시를 보관합니다(선택사항: 성공한 캐시만 저장).
save_cache(캐시)
결과 반환
# 사용 예
__name__ == "__main__"인 경우:
# 500쌍이 있다고 가정합니다(표시).
쌍 = ["BTCUSDT", "ETHUSDT", "SOLUSDT"] # ... 500
# 일괄 가져오기를 실행합니다.
all_klines = get_klines_batch(쌍, 간격="60", 데이터 세트_alldays=100, 제한=200)
# 길이 요구 사항을 충족하는 기호를 필터링합니다.
good = [s의 경우 s, kl 및 len(kl) >= 100인 경우 all_klines.items()의 kl]
print(f"100개 이상 일치하는 거래 쌍의 수: {len(good)}")
인쇄(양호[:20])
MAX_WORKERS그리고MAX_CONCURRENT. API 키가 있는 경우 일반적으로 비율 할당량을 늘릴 수 있습니다.Pionex는 개발자가 프로그램을 통해 거래를 자동화하고, 시장 데이터를 쿼리하고, 계정 자산을 관리할 수 있는 공식 API를 제공합니다. API는 REST 및 WebSocket 메소드를 모두 지원합니다.
API Key그리고Secret, 한 번만 표시됨// Node.js axios를 사용하여 Pionex API를 요청합니다.
const axios = require("axios");
const crypto = require("암호화");
const apiKey = "귀하의 API_KEY";
const secret = "귀하의 API_SECRET";
const baseUrl = "https://api.pionex.com";
// 서명 생성
함수 기호(쿼리) {
return crypto.createHmac("sha256", secret).update(query).digest("hex");
}
// 계좌 잔액 쿼리
비동기 함수 getBalances() {
const 타임스탬프 = Date.now();
const 쿼리 = `타임스탬프=${타임스탬프}`;
const 서명 = sign(쿼리);
const res = axios.get(`${baseUrl}/api/v1/account?${query}&signature=${signature}`, {
헤더: { "X-MBX-APIKEY": apiKey }
});
console.log(res.data);
}
getBalances();
수입 시간
hmac 가져오기
hashlib 가져오기
수입요청
API_KEY = "귀하의 API_KEY"
SECRET = "귀하의API_SECRET"
BASE_URL = "https://api.pionex.com"
def sign(query: str) -> str:
return hmac.new(SECRET.encode(), query.encode(), hashlib.sha256).hexdigest()
def get_balances():
타임스탬프 = str(int(time.time() * 1000))
쿼리 = f"타임스탬프={타임스탬프}"
서명 = 서명(쿼리)
url = f"{BASE_URL}/api/v1/account?{쿼리}&signature={서명}"
헤더 = {"X-MBX-APIKEY": API_KEY}
res = 요청.get(url, 헤더=헤더)
인쇄(res.json())
get_balances()
const WebSocket = require("ws");
const ws = new WebSocket("wss://ws.pionex.com/ws");
ws.on("열기", () => {
console.log("Pionex WebSocket에 연결되었습니다.");
// BTC/USDT 시세 구독
ws.send(JSON.stringify({
이벤트: "구독",
채널: "시장",
시장: "BTC_USDT"
}));
});
ws.on("메시지", (msg) => {
console.log("메시지 수신:", msg.toString());
});
웹소켓 가져오기
JSON 가져오기
데프 on_open(ws):
print("Pionex WebSocket에 연결되었습니다.")
sub_msg = {
"이벤트": "구독",
"채널": "시장",
"시장": "BTC_USDT"
}
ws.send(json.dumps(sub_msg))
def on_message(ws, 메시지):
print("메시지 수신:", message)
ws = websocket.WebSocketApp(
"wss://ws.pionex.com/ws",
on_open=on_open,
on_message=on_message
)
ws.run_forever()
사용 가능GET /api/v1/common/symbols지원되는 모든 거래 쌍과 최소 주문 규모, 가격 정확성, 거래 유형(현물 또는 계약) 등과 같은 Pionex의 세부 속성을 얻기 위해
GET https://api.pionex.com/api/v1/common/symbols
{
"code": 0,
"data": [
{
"symbol": "BTC_USDT",
"quoteCurrency": "USDT",
"baseCurrency": "BTC",
"minQty": "0.0001",
"minNotional": "5",
"pricePrecision": 2,
"quantityPrecision": 6,
"tradeEnable": true
},
{
"symbol": "ETH_USDT",
"quoteCurrency": "USDT",
"baseCurrency": "ETH",
"minQty": "0.001",
"pricePrecision": 2,
"quantityPrecision": 6,
"tradeEnable": true
}
]
}
수입요청
BASE_URL = "https://api.pionex.com"
def get_symbols():
url = f"{BASE_URL}/api/v1/common/symbols"
res = 요청.get(url)
데이터 = res.json()
data.get("코드") == 0인 경우:
기호 = data.get("데이터", [])
print(f"총 {len(symbols)}개의 거래 쌍을 얻었습니다")
for s in Symbol[:10]: # 처음 10개만 표시합니다.
print(f"{s['symbol']} ({s['baseCurrency']}/{s['quoteCurrency']})")
그 외:
print("획득 실패:", data)
__name__ == "__main__"인 경우:
get_symbols()
무기한 계약을 지원하는 거래 쌍만 제거하려면 다음과 같은 간단한 필터링 논리를 사용할 수 있습니다.
perp_symbols = [s for s in data["data"] if ".PERP" in s["symbol"]]
/api/v1/market/tickers즉시 가격을 확인하세요.다음 프로그램은https://api.pionex.com/api/v1/common/symbols를 사용하면 반환된 JSON의 구조(키 및 데이터 유형)가 자동으로 인쇄되므로 실제 형식을 더 쉽게 이해할 수 있습니다.
수입요청
JSON 가져오기
def print_json_structure(data, indent=0):
"""JSON 구조를 재귀적으로 인쇄"""
space = " " * 들여쓰기
isinstance(data, dict)인 경우:
data.items()의 k, v에 대해:
isinstance(v, (dict, list))인 경우:
print(f"{space}{k}: {type(v).__name__}")
print_json_structure(v, 들여쓰기 + 1)
그 외:
print(f"{space}{k}: {type(v).__name__}")
elif isinstance(data, list) 및 데이터:
print(f"{space}[list] 항목 유형: {type(data[0]).__name__}")
print_json_structure(data[0], 들여쓰기 + 1)
def get_pionex_symbols_format():
URL = "https://api.pionex.com/api/v1/common/symbols"
res = 요청.get(url)
res.raise_for_status()
데이터 = res.json()
print("루트 수준 구조:")
print_json_구조(데이터)
__name__ == "__main__"인 경우:
get_pionex_symbols_format()
루트 수준 구조:
코드: 정수
데이터: 목록
[목록] 항목 유형: dict
기호: str
기본통화: str
견적통화: str
가격정밀도: 정수
수량 정밀도: 정수
최소수량:str
최소 명목상: str
tradeEnable: 부울
json.dumps(data, indent=2)전체 콘텐츠를 이용할 수 있습니다.Pionex 공개 시장 데이터에서 특정 거래 쌍의 K-라인(캔들스틱/OHLCV) 데이터를 얻습니다.
| 매개변수 | 유형 | 필요한가요? | 설명하다 |
|---|---|---|---|
| symbol | string | 예 | 거래 쌍(예: BTC_USDT 또는 BTC_USDT.PERP) |
| interval | string | 예 | 1M, 5M, 15M, 30M, 60M, 4H, 8H, 12H, 1D와 같은 시간 간격 |
| endTime | 숫자(밀리초) | 아니요 | 종료 시간(밀리초 타임스탬프) |
| limit | number | 아니요 | 획득한 데이터 수, 기본값 100, 범위 1-500 |
{
"result": true,
"data": {
"klines": [
{
"time": 1691649240000,
"open": "1851.27",
"close": "1851.32",
"high": "1851.32",
"low": "1851.27",
"volume": "0.542"
}
]
},
"timestamp": 1691649271544
}
수입요청
BASE_URL = "https://api.pionex.com"
def get_klines(기호: str, 간격: str, end_time: int = 없음, 제한: int = 100):
매개변수 = {
"기호": 기호,
"간격": 간격,
"한계": 한도
}
end_time이 None이 아닌 경우:
params["endTime"] = end_time
응답 = 요청.get(f"{BASE_URL}/api/v1/market/klines", params=params)
결과 = response.json()
결과에 result.get("result") 및 "data"가 있는 경우:
결과 반환["data"]["klines"]
그 외:
raise Exception(f"K 라인을 얻지 못했습니다: {result}")
__name__ == "__main__"인 경우:
# 예시: BTC_USDT 무기한 계약의 최근 15분 K-라인 50개 획득
기호 = "BTC_USDT.PERP"
간격 = "15M"
klines = get_klines(기호, 간격, 제한=50)
klines의 k에 대해:
인쇄(k)
파이넥스에는 단 하나도 없습니다."그리드 거래 쌍에 대한 지원 받기"전용 API이지만 다음을 통해 액세스할 수 있습니다.GET /api/v1/market/tickers모든 거래 쌍을 가져와서 필터링하세요..PERPFutures Grid가 지원하는 거래 쌍 목록을 얻으려면 (USDT 무기한 계약)을 입력하세요.
수입요청
BASE_URL = "https://api.pionex.com"
def get_perp_pairs():
url = f"{BASE_URL}/api/v1/market/tickers"
res = 요청.get(url)
데이터 = res.json()
perp_pairs = []
데이터에 "데이터"가 있는 경우:
data["data"] 항목의 경우:
시장 = item.get("symbol", "")
# 무기한 계약 거래 쌍은 일반적으로 .PERP로 끝납니다.
시장에 ".PERP"가 있는 경우:
perp_pairs.append(시장)
perp_pairs 반환
__name__ == "__main__"인 경우:
쌍 = get_perp_pairs()
print("지원되는 무기한 계약 그리드 거래 쌍:")
쌍으로 된 p의 경우:
인쇄(p)
지원되는 무기한 계약 그리드 거래 쌍:
BTC_USDT.PERP
ETH_USDT.PERP
SOL_USDT.PERP
LINK_USDT.PERP
...
.PERP)은 Futures Grid Bot과 직접 사용할 수 있습니다.Max Coin API는 개발자가 프로그래밍 방식으로 암호화폐 거래 기능에 액세스할 수 있도록 Max Exchange에서 제공하는 애플리케이션 프로그래밍 인터페이스 세트입니다. 개발자는 API를 통해 거래를 자동화하고, 시장 데이터를 검색하고, 자산을 관리할 수 있습니다.
다음은 API를 통해 시장 데이터를 얻는 예입니다.
GET https://max-api.maicoin.com/api/v1/ticker?market=btctwd
이 요청은 가격, 거래량 등을 포함하여 BTC/TWD에 대한 실시간 시장 데이터를 반환합니다.
다음은 Python 언어를 사용하여 Max API를 호출하는 간단한 예입니다.
수입요청
BASE_URL = "https://max-api.maicoin.com"
def get_ticker(쌍):
엔드포인트 = "/api/v1/ticker"
params = {"시장": 쌍}
응답 = 요청.get(BASE_URL + 엔드포인트, params=params)
response.json() 반환
# BTC/TWD 시장 데이터 가져오기
ticker_data = get_ticker("btctwd")
인쇄(티커_데이터)
비트코인 사용작업 증명(PoW)분산형 회계 시스템을 달성하기 위한 합의 메커니즘입니다. PoW의 핵심 목표는 노드가 수학적 문제를 해결하기 위해 경쟁하여 누가 회계 권한을 가지고 있는지 결정하고 데이터가 마음대로 변조될 수 없도록 하는 것입니다.
채굴자들은 블록을 성공적으로 패키징하고 수수료를 받을 가능성을 높이기 위해 다음 기준에 따라 거래의 우선순위를 정합니다.
거래량이 너무 많으면 혼잡이 발생하고 처리 수수료가 상승합니다. 이 문제를 개선하기 위해 다양한 확장 솔루션이 제안됩니다.
| 필드 이름 | 크기(바이트) | 설명하다 |
|---|---|---|
| block size | 4 | 전체 블록(헤더 및 모든 거래 데이터 포함)의 총 크기(바이트) |
| block header | 80 | 블록의 헤더 정보는 이전 블록과 이후 블록을 검증하고 연결하는 데 사용됩니다. |
| transaction counter | 1 ~ 9 | 이 블록에 얼마나 많은 트랜잭션이 있는지 나타내는 가변 길이 정수(VarInt)로 표현되는 트랜잭션 수입니다. |
| transactions | 변하기 쉬운 | 모든 실제 거래 데이터, 각 거래에는 입력과 출력이 포함됩니다. |
길이는 80바이트로 고정되어 있으며 내용은 다음과 같습니다.
| 필드 이름 | 데이터 유형 | 길이 | 설명하다 |
|---|---|---|---|
| version | int32 | 4 | 허용 가능한 블록 확인 규칙을 나타내는 블록 버전 |
| previous block hash | char[32] | 32 | 이전 블록의 해시 값 |
| merkle root | char[32] | 32 | 모든 거래 해시의 머클 트리 루트 |
| timestamp | uint32 | 4 | 블록 생성 시간(UNIX 타임스탬프) |
| bits | uint32 | 4 | 목표 난이도의 압축 표현 |
| nonce | uint32 | 4 | 유효한 블록 해시의 변화하는 값을 찾기 위해 |
VarInt(가변 길이 정수) 형식을 사용하여 블록에 있는 트랜잭션 수를 나타냅니다.
각 거래 데이터에는 다음과 같은 주요 부분이 포함됩니다(길이는 다양함).
첫 번째 거래는 일반적으로코인베이스 거래, 이는 채굴자가 블록 보상을 받기 위한 특별한 거래이며 입력을 포함하지 않습니다.
수입 시간
클래스 트랜잭션:
def __init__(본인, 보낸 사람, 받는 사람, 금액, 수수료):
self.sender = 보낸 사람
self.receiver = 수신자
self.amount = 금액
self.fee = 수수료
self.timestamp = 시간.시간()
def __repr__(자체):
return f"[전송: {self.sender} → {self.receiver}, ${self.amount}, 수수료: {self.fee}]"
클래스 노드:
def __init__(자신, 이름):
self.name = 이름
self.peers = []
self.transaction_pool = []
def 연결(자체, 피어):
self.peers에 피어가 없는 경우:
self.peers.append(피어)
Peer.connect(self) # 양방향 연결
def receive_transaction(self, tx):
self.transaction_pool에 tx가 없는 경우:
self.transaction_pool.append(tx)
print(f"{self.name}이(가) 트랜잭션을 받았습니다: {tx}")
자기.방송(tx)
def 방송(자체, tx):
self.peers의 피어에 대해:
피어.수신_트랜잭션(tx)
classMiner(노드):
defmine_block(자체):
print(f"\n⛏️ {self.name} 블록 패킹을 시작합니다")
# 높은 수수료 순으로 정렬, 최대 5건의 거래 처리
sorted_txs = sorted(self.transaction_pool, key=lambda tx: tx.fee, reverse=True)
선택됨 = sorted_txs[:5]
print(f"{self.name} 패키지 트랜잭션:")
선택된 tx의 경우:
인쇄(f" - {tx}")
#처리된 거래 지우기
self.transaction_pool = [tx가 선택되지 않은 경우 self.transaction_pool의 tx에 대한 tx]
# 노드와 채굴자를 생성합니다
A = 노드("노드 A")
B = 노드("노드 B")
C = 광부("광부 C")
# 노드 네트워크 연결
A.커넥트(B)
B.커넥트(C)
# 사용자가 거래를 발행함
tx_list = [
트랜잭션("앨리스", "밥", 2.0, 0.0005),
트랜잭션("이브", "톰", 1.2, 0.0009),
트랜잭션("조", "메리", 3.5, 0.0002),
트랜잭션("릭", "샘", 0.8, 0.0015),
트랜잭션("앤", "릴리", 1.7, 0.0001)
]
tx_list의 tx에 대해:
print(f"\n사용자가 트랜잭션을 보냅니다: {tx}")
A.receive_transaction(tx)
시간.수면(0.2)
# 채굴자들이 포장을 시작합니다
C.광산_블록()
Ethereum Virtual Machine(약칭 EVM)은 Ethereum의 핵심 구성 요소이며 스마트 계약 실행을 담당합니다. EVM은 개발자가 Ethereum 네트워크의 다른 부분에 영향을 미칠 염려 없이 코드를 실행할 수 있는 샌드박스 환경을 제공합니다.
스마트 계약은 EVM에 의해 실행이 처리되는 자체 실행 불변 계약입니다. 개발자는 일반적으로 Solidity와 같은 고급 프로그래밍 언어를 사용하여 스마트 계약을 작성한 다음 EVM이 이해할 수 있는 바이트 코드로 컴파일합니다.
Solidity는 Ethereum에서 가장 일반적으로 사용되는 프로그래밍 언어로 JavaScript와 유사한 구문을 가지고 있습니다. 다음은 간단한 Solidity 스마트 계약 예시입니다.
pragma solidity ^0.8.0;
contract SimpleStorage {
uint public storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
위 계약에는 정수 데이터를 저장하는 데 사용되는 변수가 포함되어 있습니다.storedData, 해당 데이터를 설정하고 가져오는 기능이 있습니다.
사용자가 Ethereum 네트워크에서 스마트 계약을 실행하면 다음 단계가 발생합니다.
EVM의 컴퓨팅 리소스는 제한되어 있습니다. 네트워크 남용을 방지하기 위해 EVM은 다음을 사용합니다.Gas거래 수수료를 계산하고 청구하는 메커니즘입니다. 각 작업에는 해당하는 가스 비용이 있으며 사용자는 거래를 제출할 때 충분한 가스를 제공해야 합니다.
스마트 계약을 실행하는 데 필요한 컴퓨팅 리소스 비용을 지불합니다.
EVM은 이더리움 네트워크의 핵심이며 스마트 계약을 실행할 수 있는 강력한 환경을 제공합니다. 개발자는 Solidity와 같은 프로그래밍 언어를 사용하여 다양한 분산 애플리케이션(dApp)을 만들고 EVM의 기능을 활용하여 복잡한 논리 연산 및 트랜잭션 처리를 구현할 수 있습니다.
Node.js그리고npmHardhat:npm install --save-dev hardhatnpx hardhat, "기본 샘플 프로젝트 만들기"를 선택하세요.존재하다contracts폴더에 추가됨LendingProtocol.solSolidity 계약을 붙여넣으세요.
~에scripts폴더 생성deploy.js, 내용은 다음과 같습니다.
비동기 함수 main() {
const [배포자] = ethers.getSigners()를 기다립니다.
console.log("배포 계정:", 배포자.주소);
const TokenAddress = "0xYourTokenAddressHere";
const LendingProtocol = ethers.getContractFactory("LendingProtocol")를 기다립니다.
const 대출 = LendingProtocol.deploy(TokenAddress)를 기다립니다.
대출을 기다립니다.배치();
console.log("LendingProtocol이 성공적으로 배포되었습니다:", 대출.주소);
}
main().catch((오류) => {
console.error(오류);
process.exitCode = 1;
});
Hardhat 테스트 체인을 시작합니다.
npx hardhat node
배포하려면 다른 터미널을 엽니다.
npx hardhat run scripts/deploy.js --network localhost
hardhat.config.js추가:require("@nomiclabs/hardhat-ethers");
모듈.수출 = {
네트워크: {
괴에를리: {
URL: "https://goerli.infura.io/v3/귀하의 API 키",
계정: ["0x개인 키"]
}
},
견고성: "0.8.20"
};
그런 다음 배포합니다.
npx hardhat run scripts/deploy.js --network goerli
배포 후에는 프런트 엔드 통합 및 상호 작용에 사용할 수 있는 계약 주소가 출력됩니다.
이 대출 계약은 EVM(Ethereum Virtual Machine)에서 실행되는 스마트 계약입니다. 사용자는 본 계약을 통해 자산을 예치하여 이자를 얻거나 자산을 빌려 이자를 지불할 수 있습니다. 이 프로토콜은 ERC-20 토큰을 지원하며 대출, 저장, 청산과 같은 핵심 기능을 가지고 있습니다.
// SPDX-License-Identifier: MIT
프라그마 견고성 ^0.8.0;
인터페이스 IERC20 {
함수 transferFrom(발신자 주소, 수신자 주소, 단위 금액) 외부 반환(bool);
함수 전송(수신자 주소, 단위 금액) 외부 반환(bool);
function BalanceOf(address account) 외부 뷰 반환(단위);
함수 승인(주소 지출자, 단위 금액) 외부 반환(bool);
}
계약 LendingProtocol {
IERC20 공개 토큰;
공공 소유자에게 주소를 지정합니다.
단위 공익Rate = 5; // 연이자 5%
매핑(주소 => 단위) 공공 예금;
매핑(주소 => 단위) 공개 차용;
생성자(주소 _token) {
토큰 = IERC20(_token);
소유자 = msg.sender;
}
함수 입금액(단위 금액) 외부 {
require(금액 > 0, "금액은 0보다 커야 합니다.");
token.transferFrom(msg.sender, 주소(this), 금액);
예금[msg.sender] += 금액;
}
함수 빌림(단위 금액) 외부 {
require(금액 > 0, "금액은 0보다 커야 합니다.");
단위 담보 = 예금[msg.sender];
require(담보 >= 금액 * 2, "담보 부족");
차용[msg.sender] += 금액;
token.transfer(msg.sender, 금액);
}
함수 상환(단위 금액) 외부 {
require(금액 > 0, "금액은 0보다 커야 합니다.");
require(borrows[msg.sender] >= amount, "대출이 부족합니다.");
차입[msg.sender] -= 금액;
token.transferFrom(msg.sender, 주소(this), 금액);
}
함수 철회(단위 금액) 외부 {
require(deposits[msg.sender] >= amount, "잔액 부족");
require(borrows[msg.sender] == 0, "미지급 대출이 있습니다.");
예금[msg.sender] -= 금액;
token.transfer(msg.sender, 금액);
}
}
BSC(바이낸스 스마트 체인)는 EVM(이더리움 가상 머신)과 호환되는 퍼블릭 체인이므로 이더리움에 작성된 Solidity 스마트 계약을 BSC에 거의 직접 배포할 수 있습니다. 주요 차이점은 배포 중 네트워크 연결 및 가스 요금이 BNB로 가격이 책정된다는 것입니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint private value;
function setValue(uint _value) public {
value = _value;
}
function getValue() public view returns (uint) {
return value;
}
}
Hardhat을 사용하여 배포hardhat.config.js다음에서 BSC 네트워크를 구성합니다.
require("@nomiclabs/hardhat-ethers");
모듈.수출 = {
견고성: "0.8.20",
네트워크: {
bsc테스트넷: {
URL: "https://data-seed-prebsc-1-s1.binance.org:8545/",
체인 ID: 97,
가스가격: 20000000000,
계정: ["0x개인 키"]
},
bsc메인넷: {
URL: "https://bsc-dataseed.binance.org/",
체인 ID: 56,
가스가격: 20000000000,
계정: ["0x개인 키"]
}
}
};
비동기 함수 main() {
const [배포자] = ethers.getSigners()를 기다립니다.
console.log("배포 계정:", 배포자.주소);
const SimpleStorage = ethers.getContractFactory("SimpleStorage")를 기다립니다.
const 스토리지 = SimpleStorage.deploy()를 기다립니다.
기다립니다.storage.deployed();
console.log("배포된 계약:", Storage.address);
}
main().catch((오류) => {
console.error(오류);
process.exitCode = 1;
});
npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethersnpx hardhat run scripts/deploy.js --network bscTestnetPython과 랜덤 포레스트 모델을 사용하여 주식 상승 또는 하락 확률을 예측합니다. 이 예에서는 Yahoo Finance의 주식 데이터를 사용하고 기술 지표를 사용하여 모델을 훈련한 후 마지막으로 주식 상승 및 하락 확률을 출력합니다.
먼저 일부 Python 패키지를 설치하고 가져와야 합니다.
pip install yfinance scikit-learn pandas numpy
그런 다음 필요한 라이브러리를 가져옵니다.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import yfinance as yf
다음으로 Yahoo Finance에서 해당 주식의 과거 데이터를 다운로드하고 기술 지표인 단순 이동 평균(SMA)을 계산합니다.
# Yahoo Finance에서 Apple 주식 데이터 다운로드
기호 = 'AAPL'
data = yf.download(symbol, start='2020-01-01', end='2023-01-01')
# 10일 및 50일 단순 이동 평균(SMA) 계산
데이터['SMA_10'] = 데이터['닫기'].rolling(window=10).mean()
데이터['SMA_50'] = 데이터['닫기'].rolling(window=50).mean()
#증가 또는 감소 목표를 설정합니다. 익일 종가가 당일 종가보다 높으면 1(증가), 그렇지 않으면 0(감소)이 됩니다.
data['Target'] = np.where(data['Close'].shift(-1) > data['Close'], 1, 0)
# 누락된 값 제거
data.dropna(inplace=True)
이동 평균(SMA)과 종가를 기능으로 사용하고 데이터를 훈련 세트와 테스트 세트로 분할합니다.
# 기능 선택
기능 = ['SMA_10', 'SMA_50', '닫기']
X = 데이터[특징]
y = 데이터['대상']
# 훈련 세트와 테스트 세트를 분할합니다(80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
우리는 랜덤 포레스트 모델을 사용하여 데이터를 훈련하고 테스트 세트에서 주식의 상승 및 하락 확률을 예측합니다.
#랜덤 포레스트 분류기 초기화
모델 = RandomForestClassifier(n_estimators=100, random_state=42)
#기차모델
model.fit(X_train, y_train)
# 테스트 세트의 상승 및 하락을 예측합니다.
y_pred = 모델.예측(X_test)
y_prob = model.predict_proba(X_test) # 상승 및 하락 확률을 얻습니다.
모델의 정확도를 계산하고 매일의 상승 및 하락 확률을 표시할 수 있습니다.
# 모델 정확도 계산
정확도 = 정확도_점수(y_test, y_pred)
print(f"모델 정확도: {정확도:.2f}")
# 테스트 세트의 처음 5일 동안의 상승 및 하강 확률을 표시합니다.
범위 내의 i에 대해(5):
print(f"{i+1}일: 상승 확률={y_prob[i][1]:.2f}, 하락 확률={y_prob[i][0]:.2f}")
증가 확률에 따라 임계값을 설정하여 구매 여부를 결정할 수 있습니다. 예를 들어 상승 확률이 70%를 초과하면 매수합니다.
# 확률 상승에 대한 임계값을 설정합니다.
임계값=0.7
# 확률에 따라 구매 결정을 내립니다.
범위(len(y_prob))에 있는 i의 경우:
y_prob[i][1] > 임계값인 경우:
print(f"{i+1}일에 구매를 권장합니다. 예상 증가 확률={y_prob[i][1]:.2f}")
그 외:
print(f"{i+1}일에는 구매를 권장하지 않습니다. 예상 증가 확률={y_prob[i][1]:.2f}")
이 예에서는 랜덤 포레스트 모델을 사용하여 주식의 상승 또는 하락 확률을 예측하고 예측 결과에 따라 거래 결정을 내리는 방법을 보여줍니다. 이는 거래 결정의 정확성을 높이는 간단하면서도 효과적인 방법입니다.
대만 증권거래소의 공개 청약 공지 페이지는 다음 URL에서 액세스할 수 있습니다.
Python을 사용하여requests그리고BeautifulSoup, 페이지에서 공개 구독 정보를 확인할 수 있습니다.
수입요청
bs4에서 가져오기 BeautifulSoup
팬더를 PD로 가져오기
# 공개 구독 공지 페이지 캡처
URL = "https://www.twse.com.tw/zh/announcement/public.html"
헤더 = {"User-Agent": "Mozilla/5.0"}
응답 = 요청.get(url, 헤더=헤더)
response.status_code == 200인 경우:
수프 = BeautifulSoup(response.text, 'html.parser')
테이블 = pd.read_html(response.text)
테이블의 경우:
df = tables[0] # 첫 번째 테이블을 가져옵니다.
인쇄(df)
그 외:
print("테이블 데이터를 찾을 수 없습니다.")
그 외:
print("공개 구독 공지 페이지에 연결할 수 없습니다.")
Selenium브라우저 작업을 시뮬레이션합니다.MoneyAPI는 실시간 환율 정보를 제공합니다. 샘플 코드는 다음과 같습니다.
수입요청
URL = 'https://api.currencyapi.com/v3/latest'
매개변수 = {
'apikey': '귀하의 API 키',
'base_currency': 'USD',
'통화': 'TWD'
}
응답 = 요청.get(url, params=params)
데이터 = response.json()
usd_to_twd = 데이터['data']['TWD']['value']
print(f"1 미국 달러는 {usd_to_twd} 신대만 달러와 같습니다.")
알아채다:이를 사용하려면 먼저 MoneyAPI에 등록하고 API 키를 받아야 합니다.
ExchangeRatesAPI는 실시간 환율 쿼리 서비스도 제공합니다.
수입요청
url = 'https://api.exchangeratesapi.io/latest'
매개변수 = {
'access_key': '귀하의 API 키',
'기본': 'USD',
'기호': 'TWD'
}
응답 = 요청.get(url, params=params)
데이터 = response.json()
usd_to_twd = 데이터['rates']['TWD']
print(f"1 미국 달러는 {usd_to_twd} 신대만 달러와 같습니다.")
먼저 ExchangeRatesAPI에 등록하여 API 키를 얻고 코드에서 '귀하의 API 키'를 교체하세요.
API를 직접 호출하지 않으려면 타사 Python 패키지를 사용할 수 있습니다.forex-python:
forex_python.converter에서 통화 환율 가져오기
cr = 환율()
usd_to_twd = cr.get_rate('USD', 'TWD')
print(f"1 미국 달러는 {usd_to_twd} 신대만 달러와 같습니다.")
패키지 설치 명령:
pip install forex-python
API를 사용하지 않는 경우 웹 크롤러 기술을 사용하여 통화.위키(Currency.Wiki) 웹사이트에서 직접 대만 달러에 대한 미국 달러의 실시간 환율을 검색할 수 있습니다.
다음 Python 패키지를 설치해야 합니다.
pip install requests pip install beautifulsoup4
수입요청
bs4에서 가져오기 BeautifulSoup
# 도착 URL 설정
url = "https://currency.wiki/usd_twd"
#웹페이지 콘텐츠를 얻기 위해 GET 요청 보내기
응답 = 요청.get(url)
수프 = BeautifulSoup(response.text, 'html.parser')
# 특정 태그 및 카테고리 찾기
span_tag=soup.find('span', class_='unit_secondary_value')
비율 =span_tag.text
print(f"1 미국 달러는 {rate} 대만 달러와 같습니다.")
Python 크롤러 기술을 통해 실시간 환율 정보를 직접 얻을 수 있지만, 웹 페이지 구조 변경 및 규정 준수 문제에 주의해야 합니다. 소규모 응용프로그램이나 학습 목적에 적합합니다.
프로그램에서 생성된 거래 신호를 정기 보고서나 실시간 푸시 방송으로 패키지화하고 사용자에게 월별 또는 연간 요금을 청구합니다. 일반적인 플랫폼에는 Substack, Patreon 또는 자체 구축된 멤버십 시스템이 포함됩니다. 기능 수준에 따라 무료 버전과 유료 버전으로 구분됩니다. 무료 버전은 트래픽을 유도하고, 유료 버전은 실시간 신호, 기록 쿼리 및 세부 분석을 제공합니다.
예측 순위 논리를 웹 페이지나 앱으로 개발하여 사용자가 스스로 쿼리를 수행할 수 있도록 합니다. 과금 모델은 월간 구독, 종량제 또는 기능별 가격이 될 수 있습니다. 이 모델은 확장성이 뛰어나고 특정 기술 역량을 갖춘 개발자에게 적합합니다. 직접적인 투자 조언이 포함되지 않으며 규제 위험이 상대적으로 낮습니다.
폐쇄적인 투자 커뮤니티를 구축하세요. 회원은 회비를 지불한 후 주간 또는 일일 시장 순위, 토론 및 Q&A 서비스를 받을 수 있습니다. Discord, Telegram 또는 LINE 커뮤니티는 모두 일반적인 통신사이며 임계값이 낮고 시작이 빠르므로 콜드 스타트 단계에 적합합니다.
이메일 목록을 핵심 자산으로 하여 시장 분석 및 예측 순위 보고서를 정기적으로 보냅니다. 초기에는 무료 구독을 통해 잠재고객을 구축하고 일정 규모에 도달한 후 유료 버전 또는 광고 협력이 시작됩니다. Substack과 Beehiiv는 현재 주류 뉴스레터 수익 창출 플랫폼입니다.
예측 모델을 API로 캡슐화하고 통합 및 사용을 위해 브로커, 금융 정보 플랫폼 또는 기타 애플리케이션 개발자에게 권한을 부여합니다. 이 모델은 일반적으로 월별 라이선스 요금 또는 통화량에 따른 과금을 기반으로 하는 독특하고 안정적인 모델에 적합하며, 고객 충성도가 높고 안정적인 수입을 제공합니다.
전체 시스템을 투자자문사, 자산운용사, 증권사에 화이트 라벨 형태로 권한을 부여하면 상대방은 자신의 브랜드로 서비스를 제공하게 된다. 일반적으로 계약 가치는 더 높지만 협상을 지원하려면 검증 가능한 성과 기록과 전문 문서가 필요합니다.
프로그램 시그널을 운영의 기반으로 삼아 조달된 자금은 자체적으로 관리되거나 위탁 운영되며, 관리비 및 성과보수를 기준으로 보수를 징수합니다. 이 경로는 잠재력이 가장 높지만 대부분의 국가에서 금융 라이센스(예: 대만의 투자 자문 라이센스)가 필요하고 규제 기준이 가장 높으며 규정 준수 프레임워크 내에서 수행되어야 합니다.
프로그램 이면의 시장 선택 논리, 지표 설계 및 백테스팅 방법을 온라인 강좌나 실제 워크숍에 패키지화하고 지식 제품의 형태로 수익을 창출합니다. 이 모델은 금융 규제에 직접적으로 제한을 받지 않으며 동시에 개인 브랜드를 구축하는 동시에 다른 수익화 경로로 트래픽을 유도할 수 있습니다. Teachable, Hahow 또는 Udemy는 모두 상장에 적합한 플랫폼입니다.
자금이 있는 투자자나 거래자와 협력하며 신호를 제공하는 사람은 자본을 기부하지 않으며 이익은 실제 이익에 비례하여 공유됩니다. 이 모델은 모금 자격 없이도 거래 수익에 간접적으로 참여할 수 있지만, 계약 설계와 혜택 배분의 명확성에 주의를 기울여야 합니다.
어떤 수익화 경로를 채택하든 다음 사항에 따라 프로모션의 성공 또는 실패가 결정됩니다.
email: [email protected]