투자-소프트웨어 개발



AI 가격 예측

가격 예측은 일반적으로 머신러닝과 딥러닝 알고리즘을 결합하고 과거 데이터와 시장 기술 지표를 사용합니다. 다음은 몇 가지 일반적인 방법입니다.

1. 시계열 분석

2. 머신러닝 알고리즘

3. 딥러닝 모델

4. 혼합 모델

5. 기술적 지표

6. 강화 학습

강화 학습을 사용하는 지능형 거래 시스템은 시뮬레이션된 시장 환경에서 학습하고 시간이 지남에 따라 구매 및 판매 결정을 최적화하여 점차적으로 거래 전략을 개선할 수 있습니다.

7. 빅데이터와 감성분석

AI 모델은 뉴스와 소셜미디어의 정서 분석을 통해 시장 정서를 판단하고, 외부 요인에 따른 주가 변동을 예측할 수 있습니다.

8. 주의사항

여러 알고리즘을 외부 데이터(예: 경제 지표, 회사 기본 분석)와 결합하면 가장 효과적인 AI 주가 예측 모델이 생성되는 경우가 많습니다.



지표 및 운영 전략

주가 예측에 AI를 사용할 때 모델은 투자자의 의사 결정을 돕기 위해 다양한 지표를 생성합니다. 이러한 지표는 시장 동향을 판단하고 다양한 시나리오에 따라 해당 거래 작업을 수행하는 데 사용될 수 있습니다. 다음은 이를 운영하기 위한 몇 가지 일반적인 예측 지표와 전략입니다.

1. 가격 예측

모델이 직접 예측한 미래 주가 가치입니다.

2. 상승 및 하락 확률

모델은 주식 가격이 오르거나 내릴 확률을 예측할 수 있습니다.

3. 추세 신호

모델은 이동 평균과 같은 기술 지표를 기반으로 주식의 추세 방향을 예측할 수 있습니다.

4. 과매수/과매도 신호

RSI(상대 강도 지수)와 같은 기술 지표를 사용하여 주식이 과매수 또는 과매도 상태인지 확인할 수 있습니다.

5. 변동성

이 모델은 주식의 미래 가격 변동 범위를 예측할 수 있습니다.

6. 거래강도

시장의 구매자와 판매자의 강점을 기반으로 예측합니다.

7. 손실을 멈추고 이익을 얻으세요.

모델은 과거 데이터를 기반으로 합리적인 손절매 및 이익 실현 지점을 제안할 수 있습니다.

요약

다양한 예측 지표에 따라 투자자는 매수, 매도, 방관 등 상응하는 거래 결정을 내릴 수 있습니다. 여러 지표를 결합하면 다양한 시장 시나리오에서 보다 합리적인 투자 결정을 내리는 데 도움이 될 수 있습니다.



회전 표시 프로그램

수많은 회전 판정 지표 중 모든 지표가 동일한 예측력을 갖는 것은 아닙니다. 다음은 최근(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-점수 정규화 방법

다양한 시장의 지표는 Z-Score(평균과의 표준편차의 배수)로 균일하게 변환되며, 수평적 비교는 차원적 차이를 제거한 후에만 가능합니다. 공식은 다음과 같습니다. Z = (현재 가치 - 지난 N 기간의 평균값) / 지난 N 기간의 표준 편차. 예를 들어 미국 PMI는 52이고 유로존 PMI는 47입니다. 표면적으로는 큰 차이가 없습니다. 그러나 미국 PMI 과거 평균이 53이면 표준 편차는 3이고 Z-Score는 -0.33입니다.

경제 서프라이즈 지수 비교 방법

Citi 경제 서프라이즈 지수는 실제 경제 데이터가 시장 기대치와 얼마나 다른지 측정합니다. 이 지수를 국가별로 비교하면 어느 지역의 펀더멘털이 기대 이상으로 개선되거나 악화되고 있는지 확인할 수 있습니다. 자금은 서프라이즈 지수가 개선되는 시장으로 흘러가는 경향이 있습니다.

프로그래밍된 자동 데이터 수집 및 지표 계산

다음은 Python을 사용하여 자동화된 모니터링 시스템을 구축하는 전체 아키텍처 및 프로그램 예제입니다.

데이터 소스 및 해당 API

데이터 유형 무료 소스 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)

실용적인 제안

프로그래밍된 모니터링의 핵심 가치는 인간의 판단을 대체하는 것이 아니라 정서적 간섭을 제거하고 규율을 보장하는 것입니다. 시스템을 구축할 때 다음 사항에 특별한 주의가 필요합니다.

  1. 단일 지표의 승률은 55~65% 정도이며, 신뢰도를 70% 이상으로 높이기 위해서는 여러 지표에 대한 교차검증이 필요하다.
  2. FRED API의 일일 통화 한도는 120(무료 버전)입니다. 반복되는 요청을 피하기 위해 획득한 데이터를 로컬 SQLite 또는 CSV에 저장하는 것이 좋습니다.
  3. yfinance는 공식 API가 아니며 Yahoo 개정으로 인해 때때로 유효하지 않을 수 있습니다. Try-Exception 및 대체 소스(예: 대만 주식의 경우 FinMind)를 추가하는 것이 좋습니다.
  4. 모든 지표에는 적용 가능한 기간이 있습니다. 수익률곡선은 중장기(6개월 이상)를 판단하기에 적합하고, 업종 모멘텀은 단기(1~3개월)를 판단하기에 적합하다. 혼합 시에는 시간 척도의 일관성에 주의해야 합니다.
  5. 일주일에 한 번 완전한 보고서를 작성하고, 과도한 거래를 피하기 위해 매일 비정상적인 변화(예: 하루에 스프레드가 20bp 이상 확대되는 등)만 모니터링하는 것이 좋습니다.


Python yfinance 패키지

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")

반환된 DataFrame 구조

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로 전환할 수 있습니다.



거래시장을 위한 데이터베이스 설계

1. 데이터베이스 구조

erDiagram User { int UserID string Username string Password string Email datetime CreatedAt } Product { int ProductID string ProductName decimal Price int StockQuantity int SellerID } Order { int OrderID int BuyerID datetime OrderDate decimal TotalAmount } OrderItem { int OrderItemID int OrderID int ProductID int Quantity decimal Subtotal } Payment { int PaymentID int OrderID datetime PaymentDate decimal Amount string PaymentMethod } User ||--o{ Product : sells User ||--o{ Order : places Product ||--o{ OrderItem : is_included_in Order ||--o{ OrderItem : contains Order ||--o| Payment : is_paid_by

2. 관계 설명



공개 거래 시장을 위한 데이터베이스 설계

1. 데이터베이스 구조

erDiagram Asset { int AssetID string AssetName string AssetType string BaseAsset string QuoteAsset decimal CurrentPrice datetime LastUpdated } MarketData { int MarketDataID int AssetID decimal OpeningPrice decimal ClosingPrice decimal HighPrice decimal LowPrice bigint Volume datetime DataDate } OrderBook { int OrderBookID int AssetID decimal PriceLevel int BuyVolume int SellVolume datetime SnapshotTime } HistoricalTrade { int TradeID int AssetID decimal TradePrice int TradeVolume datetime TradeTime } Asset ||--o{ MarketData : "has" Asset ||--o{ OrderBook : "has" Asset ||--o{ HistoricalTrade : "has"

2. 관계 설명

3. 주요 기능



MetaQuotes Language (MQL)

언어 개요

MetaQuotes 언어(MQL)는 금융 시장 거래를 위해 특별히 개발된 프로그래밍 언어이며 MetaTrader 플랫폼(예: MT4 및 MT5)에서 자동화된 거래 전략(전문가 조언자), 맞춤형 지표, 스크립트 및 기능 라이브러리를 생성하는 데 사용됩니다.

MQL4 및 MQL5

애플리케이션 유형

문법적 특징

간단한 예: MQL4용 EA

// 새로운 K 스틱이 시작될 때마다 동작
정수 시작() {
    if (OrdersTotal() == 0 && Volume[0] == 1) {
        OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "주문 구매", 0, 0, clrGreen);
    }
    0을 반환합니다.
}

간단한 예: MQL5에 대한 표시기

#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는 거래 자동화를 위해 만들어진 전문 언어입니다. 초보자와 전문 퀀트 트레이더 모두 강력한 기능을 사용하여 정교한 트레이딩 전략을 구현할 수 있습니다.



TradingView 가젯

고급 실시간 차트

이는 여러 지표, 그리기 도구 및 완전한 거래 인터페이스(브로커에 연결된 경우)를 포함하는 가장 완벽한 버전입니다.

<!-- 고급 차트 컨테이너 -->
<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 - 스팟 및 클라이언트 소개

바이낸스는 개발자에게 다음을 포함하여 풍부한 API 지원을 제공하는 선도적인 글로벌 암호화폐 거래소입니다.Spot API그리고Client API, 사용자가 자동 ​​거래 및 데이터 수집을 수행할 수 있도록 지원합니다.

Binance Spot API

바이낸스 현물 API는 현물 시장 거래자를 위해 바이낸스가 설계한 API입니다. 시장 정보 쿼리, 주문, 주문 취소 및 기타 작업에 사용할 수 있습니다. 이 API는 일반적으로 거래 봇, 자동화된 거래 전략을 설계하고 시장 변동을 모니터링하는 데 사용됩니다.

주요 기능

Binance Client API

바이낸스 클라이언트 API는 바이낸스의 다양한 API 방법에 액세스할 수 있는 편리한 방법을 제공합니다. 개발자는 다음을 사용할 수 있습니다.binance.client라이브러리 API 다양한 현물시장과 계약시장의 인증 및 관리, 편리한 호출 기능을 제공합니다.

클라이언트 API의 주요 기능

클라이언트 API로 바이낸스 스팟을 사용하는 방법

  1. 먼저, 바이낸스에서 API Key와 Secret Key를 신청하고 올바르게 보관해야 합니다.
  2. 바이낸스 API Python SDK를 설치합니다:pip install binance
  3. 사용binance.clientAPI 연결 및 호출binance.spot방법.
binance.client에서 클라이언트 가져오기

    #클라이언트 초기화
    클라이언트 = 클라이언트(api_key='your_api_key', api_secret='your_secret_key')

    # 현재 가격을 가져옵니다
    가격 = client.get_symbol_ticker(symbol="BTCUSDT")
    인쇄(가격)


Bybit API

설명하다

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()

K라인 정보 조회


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()

서명이 필요한 비공개 API

주문 접수, 자산 조회 등 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()

다시 채우다



Bybit는 특정 유형의 거래 쌍을 얻습니다.

설명하다

파이오넥스가 사용하는/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("선형")

매개변수 비교표

PionexBybit설명하다
type=PERPcategory=linearUSDT 무기한 계약
type=SPOTcategory=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"
        }
      }
    ]
  }
}

다시 채우다



Bybit REST API 쿼리 K-라인 데이터

설명하다

파이넥스에서 사용 가능/api/v1/market/klines시장 상황을 확인하세요. Bybit의 해당 엔드포인트는 다음과 같습니다./v5/market/kline. ~을 통해category시장 유형을 지정하세요(예:linearUSDT 무기한 계약을 나타냄)에 전달될 수 있습니다.symbolintervallimitendTime그리고 다른 매개변수.

Python 예제 함수

수입요청
수입 시간

클래스바이비트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)
      ]
    ]
  }
}

다시 채우다



K 라인 일괄 확보 가속화

설명하다

다음은 재시도, 속도 제한 및 캐시가 내장된 ThreadPoolExecutor를 사용하여 직접 재현 가능한 Python 예제입니다. 프로세스: 먼저 캐시에서 캡처된 K-라인(있는 경우)을 로드하고 누락되거나 부족한 거래 쌍에 대한 요청만 발행합니다. 스레드 풀을 사용하여 동시에 여러 요청을 실행하고 세마포어를 사용하여 제한을 피하기 위해 동시성 수를 제어합니다. 실패할 경우 지수 백오프를 사용하여 재시도합니다.

프로그램 코드 (Bybit /v5/market/kline 예시)

# 요구사항: 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])

고려 사항 및 모범 사례



Pionex API

소개

Pionex는 개발자가 프로그램을 통해 거래를 자동화하고, 시장 데이터를 쿼리하고, 계정 자산을 관리할 수 있는 공식 API를 제공합니다. API는 REST 및 WebSocket 메소드를 모두 지원합니다.

API 키 신청

  1. 파이넥스 계정에 로그인하세요
  2. 입력하다API 관리페이지
  3. 새로운 API Key 생성 및 권한 설정(읽기, 거래, 코인 출금 ​​등)
  4. 적다API Key그리고Secret, 한 번만 표시됨

REST API 예제(Node.js)

// 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();

REST API 예제(Python)

수입 시간
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()

WebSocket 예(Node.js)

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());
});

WebSocket 예(Python)

웹소켓 가져오기
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()

일반적으로 사용되는 기능

주의할 점



Pionex REST API 거래 쌍 목록 가져오기

API 설명

사용 가능GET /api/v1/common/symbols지원되는 모든 거래 쌍과 최소 주문 규모, 가격 정확성, 거래 유형(현물 또는 계약) 등과 같은 Pionex의 세부 속성을 얻기 위해

HTTP 요청


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"]]

사용



Pionex 반환 형식 구문 분석

설명하다

다음 프로그램은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: 부울

다시 채우다



Pionex REST API Get Klines

API 설명

Pionex 공개 시장 데이터에서 특정 거래 쌍의 K-라인(캔들스틱/OHLCV) 데이터를 얻습니다.

GET /api/v1/market/klines

요청 매개변수

매개변수유형필요한가요?설명하다
symbolstring거래 쌍(예: BTC_USDT 또는 BTC_USDT.PERP)
intervalstring1M, 5M, 15M, 30M, 60M, 4H, 8H, 12H, 1D와 같은 시간 간격
endTime숫자(밀리초)아니요종료 시간(밀리초 타임스탬프)
limitnumber아니요획득한 데이터 수, 기본값 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)


Pionex REST API 쿼리는 계약 그리드 거래 쌍을 지원합니다.

설명하다

파이넥스에는 단 하나도 없습니다."그리드 거래 쌍에 대한 지원 받기"전용 API이지만 다음을 통해 액세스할 수 있습니다.GET /api/v1/market/tickers모든 거래 쌍을 가져와서 필터링하세요..PERPFutures Grid가 지원하는 거래 쌍 목록을 얻으려면 (USDT 무기한 계약)을 입력하세요.

Python 샘플 프로그램

수입요청

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
...

다시 채우다



Max Coin API

맥스코인 API란 무엇인가요?

Max Coin API는 개발자가 프로그래밍 방식으로 암호화폐 거래 기능에 액세스할 수 있도록 Max Exchange에서 제공하는 애플리케이션 프로그래밍 인터페이스 세트입니다. 개발자는 API를 통해 거래를 자동화하고, 시장 데이터를 검색하고, 자산을 관리할 수 있습니다.

Max Coin API를 사용하는 방법은 무엇입니까?

  1. Max 계정 등록:입장맥스 공식 홈페이지그리고 계정을 등록하세요.
  2. API 키 받기:로그인한 후 계정 설정으로 이동하여 새 API 키를 생성하고 필요한 권한을 설정하세요.
  3. 참조 API 문서:각 엔드포인트의 기능과 사용법을 이해하려면 공식 API 문서를 읽어보세요.

API에서 지원하는 주요 기능

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")
인쇄(티커_데이터)

Max Coin API 사용 시 주의사항

관련 자료



비트코인 PoW 회계 프로세스

분산회계의 핵심

비트코인 사용작업 증명(PoW)분산형 회계 시스템을 달성하기 위한 합의 메커니즘입니다. PoW의 핵심 목표는 노드가 수학적 문제를 해결하기 위해 경쟁하여 누가 회계 권한을 가지고 있는지 결정하고 데이터가 마음대로 변조될 수 없도록 하는 것입니다.

거래수요의 생성 및 확산

거래선택 우선순위

채굴자들은 블록을 성공적으로 패키징하고 수수료를 받을 가능성을 높이기 위해 다음 기준에 따라 거래의 우선순위를 정합니다.

블록 포장 및 회계권 경쟁

검증 및 체인 선택

블록 제한 및 생성 빈도

회계혼잡과 해결방법

거래량이 너무 많으면 혼잡이 발생하고 처리 수수료가 상승합니다. 이 문제를 개선하기 위해 다양한 확장 솔루션이 제안됩니다.



BTC 블록의 데이터 구조

블록의 주요 구조

필드 이름 크기(바이트) 설명하다
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(가변 길이 정수) 형식을 사용하여 블록에 있는 트랜잭션 수를 나타냅니다.

업무

각 거래 데이터에는 다음과 같은 주요 부분이 포함됩니다(길이는 다양함).

첫 번째 거래는 일반적으로코인베이스 거래, 이는 채굴자가 블록 보상을 받기 위한 특별한 거래이며 입력을 포함하지 않습니다.



거래수요 창출 및 전파 프로세스 구현

프로그램 소개

다음 예에서는 Python을 사용하여 사용자가 트랜잭션을 보내고, 노드를 브로드캐스팅하고, 채굴자가 트랜잭션을 선택하고 이를 블록으로 패키징하는 단순화된 프로세스를 시뮬레이션합니다. 이 시뮬레이션은 암호화 서명 및 완전한 블록체인 구현을 다루지 않고 "트랜잭션 → 브로드캐스트 → 패키징"의 논리적 작업만 다룹니다.

주요 공정

파이썬 코드

수입 시간

클래스 트랜잭션:
    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 VM 작성 프로그램

1. 이더리움 VM이란?

Ethereum Virtual Machine(약칭 EVM)은 Ethereum의 핵심 구성 요소이며 스마트 계약 실행을 담당합니다. EVM은 개발자가 Ethereum 네트워크의 다른 부분에 영향을 미칠 염려 없이 코드를 실행할 수 있는 샌드박스 환경을 제공합니다.

2. 스마트 계약과 EVM

스마트 계약은 EVM에 의해 실행이 처리되는 자체 실행 불변 계약입니다. 개발자는 일반적으로 Solidity와 같은 고급 프로그래밍 언어를 사용하여 스마트 계약을 작성한 다음 EVM이 이해할 수 있는 바이트 코드로 컴파일합니다.

3. EVM 프로그래밍 언어: Solidity

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, 해당 데이터를 설정하고 가져오는 기능이 있습니다.

4. EVM 작동 방식

사용자가 Ethereum 네트워크에서 스마트 계약을 실행하면 다음 단계가 발생합니다.

5. EVM 컴퓨팅 리소스 및 가스

EVM의 컴퓨팅 리소스는 제한되어 있습니다. 네트워크 남용을 방지하기 위해 EVM은 다음을 사용합니다.Gas거래 수수료를 계산하고 청구하는 메커니즘입니다. 각 작업에는 해당하는 가스 비용이 있으며 사용자는 거래를 제출할 때 충분한 가스를 제공해야 합니다. 스마트 계약을 실행하는 데 필요한 컴퓨팅 리소스 비용을 지불합니다.

6. 요약

EVM은 이더리움 네트워크의 핵심이며 스마트 계약을 실행할 수 있는 강력한 환경을 제공합니다. 개발자는 Solidity와 같은 프로그래밍 언어를 사용하여 다양한 분산 애플리케이션(dApp)을 만들고 EVM의 기능을 활용하여 복잡한 논리 연산 및 트랜잭션 처리를 구현할 수 있습니다.



EVM 배포 프로세스

준비

계약서 작성

존재하다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

테스트넷에 배포(예: Goerli)

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 Contract

소개

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;
});

배포 방법

  1. 종속 패키지를 설치합니다.
    npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethers
  2. 배포 시작:
    npx hardhat run scripts/deploy.js --network bscTestnet
  3. 계약주소 확인 후 이동하시면 됩니다.BscScan 테스트 네트워크또는BscScan 메인넷계약서를 확인하세요.

주의할 점



주식 시장 프로그램 개발

주가 상승 및 하락 확률 구현

Python과 랜덤 포레스트 모델을 사용하여 주식 상승 또는 하락 확률을 예측합니다. 이 예에서는 Yahoo Finance의 주식 데이터를 사용하고 기술 지표를 사용하여 모델을 훈련한 후 마지막으로 주식 상승 및 하락 확률을 출력합니다.

1단계: 필요한 패키지 설치 및 가져오기

먼저 일부 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
    

2단계: 주식 데이터 다운로드 및 기술 지표 생성

다음으로 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)

3단계: 학습 및 테스트 데이터 세트 준비

이동 평균(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)

4단계: 학습 및 예측을 위해 Random Forest 모델 사용

우리는 랜덤 포레스트 모델을 사용하여 데이터를 훈련하고 테스트 세트에서 주식의 상승 및 하락 확률을 예측합니다.

#랜덤 포레스트 분류기 초기화 모델 = RandomForestClassifier(n_estimators=100, random_state=42) #기차모델 model.fit(X_train, y_train) # 테스트 세트의 상승 및 하락을 예측합니다. y_pred = 모델.예측(X_test) y_prob = model.predict_proba(X_test) # 상승 및 하락 확률을 얻습니다.

5단계: 모델 정확도 계산 및 상승 및 하강 확률 표시

모델의 정확도를 계산하고 매일의 상승 및 하락 확률을 표시할 수 있습니다.

# 모델 정확도 계산 정확도 = 정확도_점수(y_test, y_pred) print(f"모델 정확도: {정확도:.2f}") # 테스트 세트의 처음 5일 동안의 상승 및 하강 확률을 표시합니다. 범위 내의 i에 대해(5): print(f"{i+1}일: 상승 확률={y_prob[i][1]:.2f}, 하락 확률={y_prob[i][0]:.2f}")

6단계: 상승 및 하락 확률을 기반으로 거래 결정을 내립니다.

증가 확률에 따라 임계값을 설정하여 구매 여부를 결정할 수 있습니다. 예를 들어 상승 확률이 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}")

요약

이 예에서는 랜덤 포레스트 모델을 사용하여 주식의 상승 또는 하락 확률을 예측하고 예측 결과에 따라 거래 결정을 내리는 방법을 보여줍니다. 이는 거래 결정의 정확성을 높이는 간단하면서도 효과적인 방법입니다.



대만증권거래소 공개청약 공고-주식 추첨 및 확보

1단계: 공개 구독 공지 페이지로 이동

대만 증권거래소의 공개 청약 공지 페이지는 다음 URL에서 액세스할 수 있습니다.

공개 구독 발표

2단계: 프로그램을 통해 자동으로 캡처

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("공개 구독 공지 페이지에 연결할 수 없습니다.")

주의할 점



외환 프로그램 개발

미국 달러에서 대만 달러로 환율 알아보기

방법 1: 통화API 사용

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 키를 받아야 합니다.

방법 2: ExchangeRatesAPI 사용

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 키'를 교체하세요.

방법 3: forex-python 패키지 사용

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

주의할 점



크롤러를 사용하여 통화.위키(Currency.Wiki)에서 미국 달러-대만 달러 환율을 알아보세요.

머리말

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 또는 자체 구축된 멤버십 시스템이 포함됩니다. 기능 수준에 따라 무료 버전과 유료 버전으로 구분됩니다. 무료 버전은 트래픽을 유도하고, 유료 버전은 실시간 신호, 기록 쿼리 및 세부 분석을 제공합니다.

SaaS 도구 플랫폼

예측 순위 논리를 웹 페이지나 앱으로 개발하여 사용자가 스스로 쿼리를 수행할 수 있도록 합니다. 과금 모델은 월간 구독, 종량제 또는 기능별 가격이 될 수 있습니다. 이 모델은 확장성이 뛰어나고 특정 기술 역량을 갖춘 개발자에게 적합합니다. 직접적인 투자 조언이 포함되지 않으며 규제 위험이 상대적으로 낮습니다.

유료 커뮤니티 및 디스코드 채널

폐쇄적인 투자 커뮤니티를 구축하세요. 회원은 회비를 지불한 후 주간 또는 일일 시장 순위, 토론 및 Q&A 서비스를 받을 수 있습니다. Discord, Telegram 또는 LINE 커뮤니티는 모두 일반적인 통신사이며 임계값이 낮고 시작이 빠르므로 콜드 스타트 ​​단계에 적합합니다.

회람 신문

이메일 목록을 핵심 자산으로 하여 시장 분석 및 예측 순위 보고서를 정기적으로 보냅니다. 초기에는 무료 구독을 통해 잠재고객을 구축하고 일정 규모에 도달한 후 유료 버전 또는 광고 협력이 시작됩니다. Substack과 Beehiiv는 현재 주류 뉴스레터 수익 창출 플랫폼입니다.

제3자에게 API 라이선스 제공

예측 모델을 API로 캡슐화하고 통합 및 사용을 위해 브로커, 금융 정보 플랫폼 또는 기타 애플리케이션 개발자에게 권한을 부여합니다. 이 모델은 일반적으로 월별 라이선스 요금 또는 통화량에 따른 과금을 기반으로 하는 독특하고 안정적인 모델에 적합하며, 고객 충성도가 높고 안정적인 수입을 제공합니다.

조직에 대한 화이트 라벨 라이선스

전체 시스템을 투자자문사, 자산운용사, 증권사에 화이트 라벨 형태로 권한을 부여하면 상대방은 자신의 브랜드로 서비스를 제공하게 된다. 일반적으로 계약 가치는 더 높지만 협상을 지원하려면 검증 가능한 성과 기록과 전문 문서가 필요합니다.

자체 운영 펀드 또는 대리점 관리

프로그램 시그널을 운영의 기반으로 삼아 조달된 자금은 자체적으로 관리되거나 위탁 운영되며, 관리비 및 성과보수를 기준으로 보수를 징수합니다. 이 경로는 잠재력이 가장 높지만 대부분의 국가에서 금융 라이센스(예: 대만의 투자 자문 라이센스)가 필요하고 규제 기준이 가장 높으며 규정 준수 프레임워크 내에서 수행되어야 합니다.

교육 과정 및 워크숍

프로그램 이면의 시장 선택 논리, 지표 설계 및 백테스팅 방법을 온라인 강좌나 실제 워크숍에 패키지화하고 지식 제품의 형태로 수익을 창출합니다. 이 모델은 금융 규제에 직접적으로 제한을 받지 않으며 동시에 개인 브랜드를 구축하는 동시에 다른 수익화 경로로 트래픽을 유도할 수 있습니다. Teachable, Hahow 또는 Udemy는 모두 상장에 적합한 플랫폼입니다.

성과이익공유 협력

자금이 있는 투자자나 거래자와 협력하며 신호를 제공하는 사람은 자본을 기부하지 않으며 이익은 실제 이익에 비례하여 공유됩니다. 이 모델은 모금 자격 없이도 거래 수익에 간접적으로 참여할 수 있지만, 계약 설계와 혜택 배분의 명확성에 주의를 기울여야 합니다.

프로모션의 핵심요소

어떤 수익화 경로를 채택하든 다음 사항에 따라 프로모션의 성공 또는 실패가 결정됩니다.




email: [email protected]
T:0000
資訊與搜尋 | 回dev首頁
email: Yan Sa [email protected] Line: 阿央
電話: 02-27566655 ,03-5924828
阿央
泱泱科技
捷昱科技泱泱企業