Инвестиционно-программное обеспечение



Прогноз цен с помощью ИИ

Прогнозы цен обычно сочетают в себе алгоритмы машинного и глубокого обучения, а также используют исторические данные и технические индикаторы рынка. Вот некоторые распространенные методы:

1. Анализ временных рядов

2. Алгоритм машинного обучения

3. Модель глубокого обучения

4. Смешанная модель

5. Технические индикаторы

6. Обучение с подкреплением

Интеллектуальные торговые системы, использующие обучение с подкреплением, могут учиться в моделируемой рыночной среде и со временем оптимизировать решения о покупке и продаже, постепенно улучшая торговые стратегии.

7. Большие данные и анализ настроений

Модели искусственного интеллекта могут судить о настроениях рынка посредством анализа настроений в новостях и социальных сетях, а также прогнозировать изменения цен на акции на основе внешних факторов.

8. Меры предосторожности

Сочетание нескольких алгоритмов с внешними данными (например, экономическими показателями, фундаментальным анализом компании) часто дает наиболее эффективные модели прогнозирования цен на акции с использованием ИИ.



Индикаторы и операционные стратегии

При использовании ИИ для прогнозирования цен на акции модель генерирует различные индикаторы, которые помогают инвесторам принимать решения. Эти индикаторы можно использовать для оценки рыночных тенденций и проведения соответствующих торговых операций на основе различных сценариев. Вот некоторые распространенные прогнозные индикаторы и стратегии их использования:

1. Прогнозируйте цену

Это будущая цена акций, непосредственно предсказанная моделью.

2. Вероятность подъема и падения

Модель может предсказать вероятность того, что цена акции вырастет или упадет.

3. Трендовые сигналы

Модель может предсказать направление тренда акции на основе технических индикаторов, таких как скользящие средние.

4. Сигналы перекупленности/перепроданности

Технические индикаторы, такие как RSI (индекс относительной силы), можно использовать для определения того, перекуплены или перепроданы акции.

5. Волатильность

Модель может предсказать будущий диапазон колебаний цен на акции.

6. Интенсивность торговли

Прогноз основан на силе покупателей и продавцов на рынке.

7. Точки стоп-лосса и тейк-профита

Модель может предлагать разумные точки стоп-лосса и тейк-профита на основе исторических данных.

Подвести итог

В соответствии с различными прогнозными индикаторами инвесторы могут принимать соответствующие торговые решения, такие как покупка, продажа или пребывание в стороне. Объединение нескольких индикаторов может помочь принять более разумные инвестиционные решения в различных рыночных сценариях.



Программа индикатора вращения

Среди множества индикаторов оценки ротации не все индикаторы обладают одинаковой предсказательной силой. Основываясь на рыночном опыте последних лет (с 2020 по 2025 год), нижеприведенная информация классифицируется по точности и практичности, а также объясняется, как сравнивать рынки, а также получать и рассчитывать посредством автоматизации процессов.

Опережающие индикаторы с высокой точностью за последние годы

индекс рейтинг точности Время выполнения Случаи проверки за последние годы
Кривая доходности (спред 2-10 лет) чрезвычайно высокий от 6 до 18 месяцев Инверсия в июле 2022 года — точное предупреждение о региональном банковском кризисе и замедлении экономического роста в 2023 году.
Индекс новых заказов ISM Manufacturing чрезвычайно высокий от 3 до 6 месяцев После падения ниже 42 в четвертом квартале 2022 года запасы промышленных и сырьевых товаров достигли дна в первом квартале 2023 года.
Спред по высокодоходным облигациям (HY-спред) чрезвычайно высокий от 2 до 4 месяцев В 2022 году спред процентных ставок расширится до более чем 500 б.п., что точно соответствует нижней точке рисковых активов.
Соотношение Медь/Золото высокий от 2 до 5 месяцев После того, как соотношение меди и золота достигло дна в марте 2020 года, мировые циклические акции начали годовой рост.
Потоки глобальных фондов (потоки фондов EPFR) высокий от 1 до 3 месяцев В конце 2023 года средства потекут в ETF развивающихся рынков, что приведет к восстановлению индекса EM примерно на два месяца.
Точечный график ФРС и подразумеваемые процентные ставки по фьючерсам высокий от 3 до 6 месяцев В конце 2023 года рынок прогнозирует снижение процентных ставок в 2024 году, и рост акций начнется раньше графика.
Различия PMI в разных странах высокий от 1 до 3 месяцев В 2024 году PMI США продолжит расти, в то время как Европа будет сокращаться, а американские акции продолжат превосходить европейские акции.
Индекс паники VIX середина Сразу ~ 1 месяц Эффективен как обратный индикатор, но множественные ложные прорывы в 2021 году снижают практичность.
Баланс финансирования и исследование настроений розничных инвесторов середина Сразу ~ 2 недели Экстремальные значения полезны, но в среднем интервале слишком много шума, поэтому его необходимо сопоставить с другими индикаторами.

Почему эти показатели стали более точными в последние годы?

Причина, по которой кривая доходности сохраняет высокую степень точности, заключается в том, что она отражает коллективное ценообразование рынка облигаций в будущей экономике. Среди участников рынка облигаций доминируют институциональные юридические лица, а эффективность информации значительно выше, чем на рынке, где доминируют розничные инвесторы. Новые заказы ISM напрямую отражают фактические изменения спроса со стороны предприятия и не зависят от настроений рынка. Спреды по высокодоходным облигациям являются «индикатором стресса» кредитного рынка. Когда риски корпоративного дефолта возрастут, фонды будут первыми выходить из активов с высоким уровнем риска. Этот сигнал обычно предшествует реакции фондового рынка.

Условно говоря, точность VIX и финансовых балансов за последние годы снизилась. Основная причина заключается в том, что опционы с истечением нулевого дня (0DTE) существенно изменили структуру опционного рынка и исказили VIX; Коллективное поведение розничных инвесторов через социальные сети также снизило качество сигналов традиционных индикаторов настроений.

Методология межрыночных сравнений

При проведении ротационного сравнения между различными рынками необходимо установить сопоставимую стандартизированную структуру:

Относительная сила

Сравните цены двух рынков или секторов и обратите внимание на направление тренда соотношения. Например, если «Индекс MSCI Emerging Markets/MSCI Developed Markets Index» нарисован на кривой, увеличение соотношения означает, что развивающиеся рынки опережают показатели. Этот метод может быть применен к любым двум сопоставимым активам:

Метод нормализации Z-показателя

Показатели разных рынков единообразно конвертируются в Z-Score (множество стандартных отклонений от среднего значения), а горизонтальные сравнения можно проводить только после устранения размерных различий. Формула такова: Z = (текущее значение – среднее значение за последние N периодов) / стандартное отклонение последних N периодов. Например, индекс PMI США равен 52, а индекс PMI еврозоны равен 47. На первый взгляд большой разницы нет. Однако если историческое среднее значение индекса деловой активности в США равно 53, стандартное отклонение равно 3, а Z-показатель равен -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)  # Информация за прошедший год
    }

# ==========================================
# 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') # Рост против стоимости
# относительная_сила('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')}

Кривая доходности (2-10 лет): {yc['spread']}% {yc['status']}
Z-Score спреда по высокодоходным облигациям: {hy['z_score']} ({hy['risk_level']})
Тенденция соотношения меди и золота: {cg['trend']}

Рейтинг трех крупнейших секторов по динамике:
{sectors.head(3).to_string(index=False)}

Динамика сектора занимает третье место:
{sectors.tail(3).to_string(index=False)}
"""
    print(report)
    # send_line_notify('YOUR_LINE_TOKEN', report)
    return report

# Выполняется в 18:00 каждый торговый день
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. Рекомендуется добавить пробные исключения и альтернативные источники (например, FinMind для тайваньских акций).
  4. Все индикаторы имеют применимые временные рамки. Кривая доходности подходит для оценки среднесрочной и долгосрочной перспективы (более 6 месяцев), а динамика сектора подходит для краткосрочной и среднесрочной перспективы (от 1 до 3 месяцев). При смешивании нужно обращать внимание на постоянство шкалы времени.
  5. Рекомендуется составлять полный отчет раз в неделю и каждый день отслеживать только аномальные изменения (например, увеличение спреда более чем на 20 пунктов за один день), чтобы избежать чрезмерной торговли.


Пакет Python yfinance

yfinance — это пакет Python с открытым исходным кодом, разработанный Раном Арусси для получения данных о финансовых рынках от Yahoo Finance. После того как Yahoo Finance закрыла свой официальный API в 2017 году, yfinance стал самым популярным инструментом для доступа к общедоступной информации. Последняя версия — 1.2.0 (выпущена в феврале 2026 г.), лицензирована Apache, полностью бесплатна и подходит для исследовательских и образовательных целей.

Установка и базовая настройка

# Установить
pip install yfinance

#Обновить до последней версии
pip install yfinance --upgrade

# Базовый импорт
import yfinance as yf

Пакеты зависимостей yfinance включают pandas, numpy, Requests и 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 (Tencent), 9988.HK (Алибаба)
Материковые запасы Код.SS(Шанхай)/Код.SZ(Шэньчжэнь) 600519.SS (Маотай), 000001.SZ
Европейские акции Код. Суффикс Exchange SAP.DE (Германия), MC.PA (Франция LVMH), AZN.L (Лондон)
индекс Начиная с ^ ^GSPC (S&P 500), ^DJI (Dow Jones), ^IXIC (Nasdaq), ^TWII (взвешенный индекс), ^N225 (Nikkei)
фьючерсы Код=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")        #почти год
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']

# ========================================
# Детализация по времени (параметр интервала)
# ========================================
# Минутный уровень: 1м, 2м, 5м, 15м, 30м, 60м, 90м
# Часовой уровень: 1 час
# Дневной уровень и выше: 1д, 5д, 1 нед, 1 мес, 3 мес.
#
# Обратите внимание на ограничения:
# 1 млн данных можно получить только за последние 7 дней.
# Внутридневные данные (интервал <1d) могут принимать только за последние 60 дней.
# Над ежедневной линией доступны десятилетия истории

# Получите 5-минутную K-линию (последние 5 дней)
intraday = yf.download("AAPL", period="5d", interval="5m")

Возвращенная структура DataFrame

И History(), и Download() возвращают DataFrame pandas, который содержит следующие поля:

поле иллюстрировать
Openцена открытия
Highсамая высокая цена
Lowсамая низкая цена
CloseЦена закрытия (по умолчанию с учетом дивидендов)
VolumeОбъем
DividendsДивиденды (есть только у .history())
Stock SplitsДробление акций (доступно только с помощью .history())

Информация о компании и финансовая отчетность

msft = yf.Ticker("MSFT")

# === Основная информация о компании (возвращаемый текст) ===
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. Техника .squeeze() для обработки MultiIndex
# ========================================
# При загрузке одной цели в поле «Закрыть» может быть DataFrame вместо Series.
# Используйте .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 = {
    'ТСМК': '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. Он использует общедоступный API Yahoo и может быть временно недействителен из-за пересмотра версии Yahoo. Постоянно обновляйтесь до последней версии; подготовить резервные источники данных (например, FinMind можно использовать для тайваньских акций)
предел частоты Большое количество запросов за короткий период времени может привести к временной блокировке IP-адреса Yahoo. Добавьте в цикл time.sleep(1); используйте Progress=False, чтобы уменьшить количество запросов; кэшировать данные локально
Крайний срок предоставления внутридневных данных Данные за 1 минуту сохраняются только в течение 7 дней; внутридневные данные хранятся до 60 дней Если требуются долгосрочные внутридневные данные, их следует регулярно загружать и хранить в локальной базе данных.
Качество данных Иногда встречаются пропущенные значения или выбросы; некоторые непопулярные цели имеют неполные данные Обязательно используйте .dropna() для очистки после загрузки; используйте перекрестную проверку из нескольких источников для важного анализа
Только для личного/исследовательского использования Условия использования Yahoo Finance ограничивают использование материалов для личного использования, а не для коммерческой перепродажи. Для коммерческого использования следует использовать платные API (такие как Bloomberg, Refinitiv, Polygon.io).
Некоторые методы используют веб-сканеры. Некоторые функции (например, некоторые поля .info) получаются путем сканирования веб-страниц Yahoo, что относительно нестабильно. Ядро .history() и download() используют формальные API и очень стабильны.

Сравнение альтернатив

Комплекты/Услуги расходы Преимущества Недостатки
yfinance бесплатно Простота использования, широкий спектр информации и активное сообщество. Неофициальный, иногда недействительный, не подходит для высокочастотной торговли.
Alpha Vantage Бесплатно (ограничено)/Платно Встроенный расчет технических индикаторов и официальный API-ключ. Бесплатная версия имеет ограничение 5 запросов в минуту.
FRED API(fredapi) бесплатно Наиболее авторитетные общеэкономические данные (ставка доходности, PMI, ВВП и т. д.) Только общие экономические данные, без цен на отдельные акции.
FinMind Бесплатно (ограничено) Самая полная информация об акциях Тайваня, включая фишки юридических лиц, финансовые облигации и т.д. Охватывает только рынок Тайваня
Polygon.io Бесплатно (с отсрочкой)/платно (мгновенно) Чрезвычайно низкая задержка (1 мс), подходит для транзакций в реальном времени. Данные бесплатной версии задерживаются на 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.

// Работаем каждый раз, когда запускается новый 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-код можно редактировать и компилировать с помощью встроенного в MetaEditor 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>
  <тип сценария="текст/javascript">
  новый TradingView.widget({
    «авторазмер»: правда,
    "symbol": "BINANCE:BTCUSDT",
    "интервал": "Ч",
    "часовой пояс": "И т. д./UTC",
    "тема": "темная",
    "стиль": "1",
    "locale": "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-anaанализ.js" async>
  {
    "interval": "1m",
    «ширина»: 425,
    «isTransparent»: ложь,
    «высота»: 450,
    "символ": "NASDAQ:TSLA",
    «showIntervalTabs»: правда,
    "locale": "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»: правда,
    "locale": "zh_TW",
    "ширина": "100%",
    "высота": "400",
    "вкладки": [
      {
        "title": "индекс",
        "символы": [
          {"s": "FOREXCOM:SPX500", "d": "S&P 500"},
          {"s": "FOREXCOM:NSXUSD", "d": "Nasdaq 100"}
        ]
      }
    ]
  }
  </скрипт>
</div>

Как получить индивидуальный код

Хотя можно написать JavaScript вручную, TradingView предоставляет официальный графический генератор, который рекомендуется использовать во избежание синтаксических ошибок:

Часто задаваемые вопросы

вопрос Решение
Диаграмма не может быть загружена исследоватьcontainer_idТочно ли он соответствует идентификатору HTML.
ходовая версия по ширине Воляwidthустановлен на"100%"И убедитесь, что внешний div имеет фиксированную ширину.
задержка данных Данные виджета бесплатной версии обычно задерживаются на 15-20 минут, в зависимости от биржи.


Разработка криптовалютной программы

Binance API – Введение в спотовую систему и клиент

Binance — ведущая глобальная криптовалютная биржа, предоставляющая разработчикам богатую поддержку API, включаяSpot APIиClient API, чтобы облегчить пользователям проведение автоматических транзакций и сбор данных.

Binance Spot API

Binance Spot API — это API, разработанный Binance для трейдеров спотового рынка. Его можно использовать для запроса рыночной информации, размещения ордеров, отмены ордеров и других операций. Этот API обычно используется для разработки торговых ботов, автоматических торговых стратегий и мониторинга колебаний рынка.

Основные функции

Binance Client API

Клиентский API Binance предоставляет удобный способ доступа к различным методам API Binance. Разработчики могут использоватьbinance.clientAPI библиотеки Аутентификация и управление, а также удобный вызов функций различных спотовых и контрактных рынков.

Основные функции клиентского API

Как использовать Binance Spot с клиентским API

  1. Во-первых, вам необходимо подать заявку на получение ключа API и секретного ключа на Binance и правильно их хранить.
  2. Установите Binance API Python SDK:pip install binance
  3. использоватьbinance.clientПодключитесь к API и позвонитеbinance.spotметод.
из клиента импорта binance.client

    #Инициализировать клиент
    client = Client(api_key='your_api_key', api_secret='your_secret_key')

    # Получить текущую цену
    цена = client.get_symbol_ticker(symbol="BTCUSDT")
    печать (цена)


Bybit API

иллюстрировать

Bybit предоставляет API-интерфейсы REST и WebSocket, которые можно использовать для запроса рыночных условий, размещения заказов, проверки ставок финансирования, управления счетами и т. д. Ниже показано, как использовать Python.requestsПакет вызывает общедоступный API Bybit.

Установочный комплект


pip install requests

Запросить список торговых пар

запросы на импорт

BASE_URL = "https://api.bybit.com"

защита get_symbols():
    url = f"{BASE_URL}/v5/market/instruments-info?category=linear"
    рез = request.get(url)
    res.raise_for_status()
    данные = res.json()
    символы = [s["символ"] для s в данных["результат"]["список"]]
    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 и подписи.

запросы на импорт, время, hmac, hashlib

API_KEY = "ваш_api_key"
API_SECRET = "ваш_api_secret"

Защиту 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()

защита get_wallet_balance():
    конечная точка = "/v5/аккаунт/баланс кошелька"
    URL = BASE_URL + конечная точка
    временная метка = str(int(time.time() * 1000))

    параметры = {
        "accountType": "ЕДИНЫЙ",
        «метка времени»: отметка времени,
        «api_key»: API_KEY,
    }
    params["sign"] =sign_request(params, API_SECRET)

    res = Requests.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(обратный контракт) достигает того же эффекта.

Пример Python

запросы на импорт

классBybitAPI:
    BASE_URL = "https://api.bybit.com"

    @classmethod
    Защиту get_symbols (cls, категория = "линейный"):
        """
        Получите определенный тип торговой пары
        категория может быть:
          - линейный → бессрочный USDT (PERP)
          - инверсный → Инверсный бессрочный/поставочный контракт
          - пятно → пятно
        """
        конечная точка = "/v5/market/instruments-info"
        url = f"{cls.BASE_URL}{конечная точка}"
        параметры = {"категория": категория}
        
        res = Requests.get(url, params=params)
        res.raise_for_status()
        данные = res.json()

        если data.get("retCode") == 0:
            символы = [s["символ"] для s в данных["результат"]["список"]]
            print(f"Всего получено торговых пар типа {len(symbols)} {category}")
            для s в символах[:10]:
                печать(и)
        еще:
            print("Ошибка получения:", data)

если __name__ == "__main__":
    BybitAPI.get_symbols("линейный")

Таблица сравнения параметров

PionexBybitиллюстрировать
type=PERPcategory=linearБессрочный контракт USDT
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Укажите тип рынка (например.linearПредставляет бессрочный контракт USDT) и может быть передан вsymbolintervallimitendTimeи другие параметры.

Пример функции Python

запросы на импорт
время импорта

классBybitAPI:
    BASE_URL = "https://api.bybit.com"

    @classmethod
    def get_klines (cls, символ: str, интервал: str, end_time: int = None, предел: int = 100):
        """
        Запросить информацию Bybit K-линии
        Символ :param: торговая пара, например «BTCUSDT».
        :param интервал: временной интервал (1, 3, 5, 15, 30, 60, 120, 240, 360, 720, D, W, M)
        :param end_time: время окончания (в миллисекундах Unix), по умолчанию — сейчас.
        :param limit: Количество возвращаемых транзакций, максимум 1000
        """
        конечная точка = "/v5/market/kline"
        url = f"{cls.BASE_URL}{конечная точка}"

        параметры = {
            "category": "linear", # USDT Бессрочный
            «символ»: символ,
            «интервал»: интервал,
            «лимит»: лимит
        }

        если конечное_время:
            параметры["конец"] = конечное_время
        еще:
            параметры["конец"] = int(time.time() * 1000)

        res = Requests.get(url, params=params)
        res.raise_for_status()
        данные = res.json()

        если data.get("retCode") == 0:
            klines = данные["результат"]["список"]
            print(f"Пользователь {symbol} получил в общей сложности {len(klines)} K строк")
            # Отображение первых трех корневых данных
            для k в клинах[:3]:
                время открытия, цена_открытия, максимум, минимум, закрытие, объем, оборот = k
                print(f"Открытие:{open_price} Закрытие:{закрытие} Максимум:{высокий} Минимальный:{низкий} Объем:{объем}")
        еще:
            print("Ошибка получения:", data)

если __name__ == "__main__":
    BybitAPI.get_klines(symbol="BTCUSDT", интервал="60", предел=5)

Пример возвращаемых данных

{
  «ретКод»: 0,
  "результат": {
    "символ": "BTCUSDT",
    "категория": "линейный",
    "список": [
      [
        "1735119600000", // время начала (миллисекунды)
        "98342.5", // цена открытия
        "98350.0", // самая высокая цена
        "98285.0", // самая низкая цена
        "98290.5", // цена закрытия
        "12.304", // объем торгов
        "1210000.5" // Объем сделки (USDT)
      ]
    ]
  }
}

Пополнить



Ускорьте пакетное приобретение K линий

иллюстрировать

Ниже приведен непосредственно воспроизводимый пример Python с использованием ThreadPoolExecutor со встроенными повторными попытками, ограничением скорости и кешем. Процесс: сначала загрузите захваченную K-линию (если таковая имеется) из кэша и отправляйте запросы только на отсутствующие или недостаточные торговые пары; используйте пул потоков для одновременного выполнения нескольких запросов и используйте семафор для управления количеством параллелизма, чтобы избежать ограничений; в случае неудачи для повторной попытки будет использована экспоненциальная отсрочка.

Программный код (пример Bybit /v5/market/kline)

# Требования: запросы на установку pip
запросы на импорт
время импорта
импортировать JSON
импортировать ОС
из 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 # Количество секунд ожидания первой повторной попытки
КАТЕГОРИЯ = «линейный» # линейный -> устойчивый USDT; спот/инверсия может быть изменена
LIMIT_PER_CALL = 200 # Ограничение API каждого клина (в зависимости от настройки верхнего предела API)
DATASET_ALLDAYS = 24 * 6 # Пример: Определите, как минимум, сколько K строк необходимо (можно изменить)

# Загрузка/доступ к кешу
защита load_cache():
    если os.path.exists(CACHE_FILE):
        попробуйте:
            return json.load(open(CACHE_FILE, "r",coding="utf-8"))
        кромеИсключение:
            вернуть {}
    вернуть {}

защита save_cache (кэш):
    json.dump(cache, open(CACHE_FILE, "w",coding="utf-8"), обеспечения_ascii=False, отступ=2)

# Захват API одного символа, включая повтор и контроль скорости (количество одновременных исполнений контролируется семафором)
def fetch_klines_for_symbol(symbol, интервал="60", end_time=None, limit=LIMIT_PER_CALL, sem: Семафор = Нет):
    параметры = {
        "категория": КАТЕГОРИЯ,
        «символ»: символ,
        «интервал»: интервал,
        «лимит»: лимит
    }
    если конечное_время:
        параметры["конец"] = int(end_time)
    откат = INITIAL_BACKOFF
    последнее_исх = Нет

    # Получить семафор (если есть)
    если Сэм:
        sem.acquire()
    попробуйте:
        для попытки в диапазоне(1, RETRY + 1):
            попробуйте:
                resp = Requests.get(BASE_URL, params=params, timeout=10)
                соотв.raise_for_status()
                данные = соотв.json()
                # Bybit v5 возвращает retCode == 0, указывая на успех.
                if data.get("retCode", 0) == 0 и "результат" в данных:
                    klines = data["результат"].get("список", [])
                    возвратные клины
                еще:
                    Last_exc = Exception(f «Ошибка API: {данные}»)
            кроме запросов.исключения.RequestException как e:
                последнее_исх = е
            #откат
            time.sleep(отсрочка)
            откат *= 2
    наконец:
        если Сэм:
            сем.релиз()
    # В случае неудачи выдать последнюю ошибку или вернуть None
    поднять последнее_exc

# Пакетная обработка: передача парами (список символов), возврат dict {symbol: klines}
def get_klines_batch(pairs, интервал="60", dataset_alldays=DATASET_ALLDAYS, limit=LIMIT_PER_CALL, max_workers=MAX_WORKERS, max_concurrent=MAX_CONCURRENT):
    кэш = load_cache() # формат кэша: { символ: [kline_list] }
    результаты = {}
    to_fetch = []

    # Определите, какие символы необходимо захватить (не существуют в кеше или имеют недостаточную длину)
    для s в парах:
        кэшировано = кэш.получить (ы)
        если кэшировано и len(кэшировано) >= dataset_alldays:
            результаты [s] = кэшированы
        еще:
            to_fetch.append(ы)

    # Если нечего брать, просто верните это напрямую
    если не to_fetch:
        вернуть результаты

    sem = Семафор (max_concurrent)
    с ThreadPoolExecutor(max_workers=max_workers) в качестве exe:
        Futures = {exe.submit(fetch_klines_for_symbol, sym, интервал, None, limit, sem): sym для sym в to_fetch}
        для будущего в as_completed(futures):
            sym = фьючерс[фут]
            попробуйте:
                кл = fut.result()
                # Если возврат API хранится в формате списка (согласно примеру Bybit [время, открытие, максимум, минимум, закрытие, объём, оборот])
                кэш[сим] = кл
                результаты[сим] = кл
            кроме исключения как e:
                # Запишите сбой, но не блокируйте всю программу
                print(f"[Ошибка] Не удалось получить {sym}: {e}")
                результаты[сим] = Нет

    # Архивируем кеш (необязательно: сохраняйте только успешные)
    save_cache (кэш)
    вернуть результаты

# Пример использования
если __name__ == "__main__":
    # Предположим, что имеется 500 пар (ориентировочно)
    пары = ["BTCUSDT", "ETHUSDT", "SOLUSDT"] # ... 500
    # Выполняем пакетную выборку
    all_klines = get_klines_batch(pairs, интервал="60", dataset_alldays=100, предел=200)
    # Отфильтровать символы, соответствующие требованиям к длине
    хорошо = [s для s, kl в all_klines.items(), если kl и len(kl) >= 100]
    print(f"Количество торговых пар, совпадающих более 100: {len(good)}")
    распечатать(хорошо[:20])

Рекомендации и лучшие практики



Pionex API

Введение

Pionex предоставляет официальный API, который позволяет разработчикам автоматизировать транзакции, запрашивать рыночные данные и управлять активами аккаунта с помощью программ. API поддерживает методы REST и WebSocket.

Подать заявку на ключ API

  1. Войдите в свою учетную запись Pionex.
  2. ВходитьУправление APIстраница
  3. Создайте новый ключ API и установите разрешения (чтение, торговля, вывод монет и т. д.).
  4. записатьAPI KeyиSecret, показано только один раз

Пример REST API (Node.js)

// Используйте Node.js axios для запроса API Pionex
const axios = require("аксиос");
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() {
  константная временная метка = Date.now();
  const query = `timestamp=${timestamp}`;
  константная подпись = знак (запрос);

  const res = await axios.get(`${baseUrl}/api/v1/account?${query}&signature=${signature}`, {
    заголовки: { "X-MBX-APIKEY": apiKey }
  });
  console.log(res.data);
}

Получить Балансы();

Пример REST API (Python)

время импорта
импортировать hmac
импортировать хеш-библиотеку
запросы на импорт

API_KEY = "Ваш API_KEY"
СЕКРЕТ = "вашAPI_SECRET"
BASE_URL = "https://api.pionex.com"

знак def (запрос: ул) -> ул:
    return hmac.new(SECRET.encode(), query.encode(), hashlib.sha256).hexdigest()

защита get_balances():
    временная метка = str(int(time.time() * 1000))
    запрос = f"timestamp={timestamp}"
    подпись = знак (запрос)

    url = f"{BASE_URL}/api/v1/account?{query}&signature={signature}"
    заголовки = {"X-MBX-APIKEY": API_KEY}
    res = Requests.get(url, заголовки=заголовки)
    печать (res.json())

get_balances()

Пример WebSocket (Node.js)

const WebSocket = require("ws");

const ws = новый 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")
    суб_сообщение = {
        "событие": "подписаться",
        "канал": "рынок",
        "рынок": "BTC_USDT"
    }
    ws.send(json.dumps(sub_msg))

Защиту on_message (WS, сообщение):
    print("Получить сообщение:", сообщение)

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

Пример Python

запросы на импорт

BASE_URL = "https://api.pionex.com"

защита get_symbols():
    URL = f"{BASE_URL}/api/v1/common/symbols"
    рез = request.get(url)
    данные = res.json()
    
    если data.get("код") == 0:
        символы = data.get("данные", [])
        print(f"Всего получено {len(symbols)} торговых пар")
        for s в символах[: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, что упрощает понимание фактического формата.

Пример Python

запросы на импорт
импортировать JSON

Защиту print_json_structure (данные, отступ = 0):
    """Рекурсивная печать структуры JSON"""
    пробел = " " * отступ
    если isinstance(данные, dict):
        для k, v в data.items():
            если isinstance(v, (dict, list)):
                print(f"{пробел}{k}: {type(v).__name__}")
                print_json_structure (v, отступ + 1)
            еще:
                print(f"{пробел}{k}: {type(v).__name__}")
    elif isinstance(данные, список) и данные:
        print(f"{пробел}[список] тип элемента: {type(data[0]).__name__}")
        print_json_structure (данные [0], отступ + 1)

защита get_pionex_symbols_format():
    URL = "https://api.pionex.com/api/v1/common/symbols"
    рез = request.get(url)
    res.raise_for_status()
    данные = res.json()
    print("Структура корневого уровня:")
    print_json_structure (данные)

если __name__ == "__main__":
    get_pionex_symbols_format()

Пример вывода

Структура корневого уровня:
код: интервал
данные: список
  [список] тип элемента: dict
    символ: ул
    базовая валюта: ул
    quoteВалюта: str
    ценаТочность: int
    количествоТочность: int
    minQty:str
    minNotional: ул
    tradeEnable: bool

Пополнить



Pionex REST API Get Klines

Описание API

Получите данные K-линии (свеча / OHLCV) указанной торговой пары, полученные из данных публичного рынка Pionex.

GET /api/v1/market/klines

Параметры запроса

параметртипЭто необходимоиллюстрировать
symbolstringдаТорговая пара (пример: BTC_USDT или BTC_USDT.PERP)
intervalstringдаВременной интервал, например 1M, 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
}

Пример Python

запросы на импорт

BASE_URL = "https://api.pionex.com"

def get_klines (символ: str, интервал: str, end_time: int = None, предел: int = 100):
    параметры = {
        «символ»: символ,
        «интервал»: интервал,
        «лимит»: лимит
    }
    если end_time не равно None:
        параметры["endTime"] = конечное_время
    ответ = запросы.get(f"{BASE_URL}/api/v1/market/klines", params=params)
    результат = ответ.json()
    если result.get("результат") и "данные" в результате:
        вернуть результат["данные"]["Клайнс"]
    еще:
        поднять исключение (f «Не удалось получить строку K: {result}»)

если __name__ == "__main__":
    # Пример: Получите последние 50 15-минутных K-линий бессрочного контракта BTC_USDT.
    символ = "BTC_USDT.PERP"
    интервал = "15M"
    klines = get_klines (символ, интервал, предел = 50)
    для k в клинах:
        печать (к)


Запрос Pionex REST API поддерживает торговые пары с сеткой контрактов

иллюстрировать

У Pionex нет ни одного«Получите поддержку сеточных торговых пар»выделенный API, но доступ к нему можно получить черезGET /api/v1/market/tickersПолучите все торговые пары и отфильтруйте их..PERPВведите (USDT Perpetual Contract), чтобы получить список торговых пар, поддерживаемых Futures Grid.

Примеры программ на Python

запросы на импорт

BASE_URL = "https://api.pionex.com"

защита get_perp_pairs():
    URL = f"{BASE_URL}/api/v1/market/tickers"
    рез = request.get(url)
    данные = res.json()
    
    perp_pairs = []
    если «данные» в данных:
        для элемента данных["данные"]:
            market = item.get("символ", "")
            # Торговые пары с бессрочными контрактами обычно заканчиваются на .PERP
            если ".PERP" на рынке:
                perp_pairs.append(рынок)
    вернуть perp_pairs

если __name__ == "__main__":
    пары = get_perp_pairs()
    print("Поддерживаемые торговые пары с сеткой бессрочных контрактов:")
    для p в парах:
        распечатать(п)

Пример результата выполнения

Поддерживаемые торговые пары с сеткой бессрочных контрактов:
BTC_USDT.PERP
ETH_USDT.PERP
SOL_USDT.PERP
LINK_USDT.PERP
...

Пополнить



Max Coin API

Что такое API Max Coin?

API Max Coin — это набор интерфейсов прикладного программирования, предоставляемых Max Exchange, который позволяет разработчикам программно получать доступ к функциям торговли криптовалютой. Разработчики могут автоматизировать транзакции, получать рыночные данные и управлять активами через API.

Как использовать API Max Coin?

  1. Зарегистрируйте аккаунт Макса:доступОфициальный сайт Максаи зарегистрируйте аккаунт.
  2. Получить ключ API:После входа в систему перейдите в настройки своей учетной записи, сгенерируйте новый ключ API и установите необходимые разрешения.
  3. Справочная документация API:Прочтите официальную документацию API, чтобы понять функциональность и использование каждой конечной точки.

Основные функции, поддерживаемые API

Образец запроса API

Ниже приведен пример получения рыночных данных через API:

GET https://max-api.maicoin.com/api/v1/ticker?market=btctwd
    

Этот запрос вернет рыночные данные BTC/TWD в режиме реального времени, включая цену, объем и т. д.

Пример кода

Ниже приведен простой пример вызова Max API с использованием языка Python:

запросы на импорт

BASE_URL = "https://max-api.maicoin.com"

защита get_ticker (пара):
    конечная точка = "/api/v1/тикер"
    параметры = {"рынок": пара}
    ответ = запросы.get(BASE_URL + конечная точка, параметры = параметры)
    вернуть ответ.json()

# Получите рыночные данные BTC/TWD
тикер_данные = get_ticker("btctwd")
печать (тикер_данные)

Примечания по использованию API Max Coin

Связанные ресурсы



Процесс учета биткойнов 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 используется для моделирования упрощенного процесса отправки транзакций пользователями, широковещательной передачи узлов, а майнеры выбирают транзакции и упаковывают их в блоки. Это моделирование не охватывает криптографические подписи и полную реализацию блокчейна, а только логические операции «транзакция → трансляция → упаковка».

Основной процесс

Код Python

время импорта

Классовая транзакция:
    def __init__(я, отправитель, получатель, сумма, комиссия):
        self.sender = отправитель
        self.receiver = получатель
        self.amount = сумма
        самостоятельная плата = плата
        self.timestamp = time.time()

    защита __repr__(сам):
        return f"[Tx: {self.sender} → {self.receiver}, ${self.amount}, комиссия: {self.fee}]"


класс Узел:
    def __init__(я, имя):
        self.name = имя
        self.peers = []
        self.transaction_pool = []

    def Connect(собственный, одноранговый):
        если пир не в self.peers:
            self.peers.append(одноранговый узел)
            Peer.connect(self) # Двустороннее соединение

    Защиту получения_транзакции (сам, передача):
        если передача не в self.transaction_pool:
            self.transaction_pool.append(TX)
            print(f"{self.name} получил транзакцию: {tx}")
            self.broadcast (TX)

    def Broadcast(self, tx):
        для однорангового узла в self.peers:
            одноранговый узел.receive_transaction(TX)


классMiner (узел):
    защита mine_block (сам):
        print(f"\n⛏️ {self.name} начинает упаковку блока")
        # Сортировать по высокой комиссии за обработку, принимать до 5 транзакций
        sorted_txs = sorted(self.transaction_pool, key=lambda tx: tx.fee,verse=True)
        выбрано = sorted_txs[:5]
        print(f"Упакованная транзакция {self.name}:")
        для передачи в выбранном:
            печать(f" - {tx}")
        #Очистить обработанные транзакции
        self.transaction_pool = [передача для передачи в self.transaction_pool, если передача не выбрана]


# Создаём узлы и майнеры
А = Узел («Узел А»)
B = Узел («Узел Б»)
C = Майнер("Шахтер 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:
    print(f"\nПользователь отправляет транзакцию: {tx}")
    A.receive_transaction(TX)
    время.сон(0.2)

# Майнеры начинают упаковывать
C.mine_block()

Инструкции по выполнению

Расширяемое направление



Программа для записи виртуальной машины Ethereum

1. Что такое Эфириум ВМ

Виртуальная машина Ethereum (сокращенно 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. Как работает ЭВМ

Когда пользователь выполняет смарт-контракт в сети Ethereum, происходят следующие шаги:

5. Вычислительные ресурсы EVM и газ

Вычислительные ресурсы EVM ограничены. Чтобы предотвратить злоупотребление сетью, EVM используетGasМеханизм расчета и взимания комиссий за транзакции. Каждая операция имеет соответствующую стоимость газа, и пользователи должны предоставить достаточное количество газа при отправке транзакций. Для оплаты вычислительных ресурсов, необходимых для выполнения смарт-контрактов.

6. Резюме

EVM является ядром сети Ethereum и обеспечивает мощную среду для запуска смарт-контрактов. Используя такие языки программирования, как Solidity, разработчики могут создавать разнообразные децентрализованные приложения (dApps) и использовать возможности EVM для реализации сложных логических операций и обработки транзакций.



Процесс развертывания EVM

Подготовка

Написать контракт

существоватьcontractsДобавлено в папкуLendingProtocol.solи вставьте свой контракт Solidity.

Настройка сценария развертывания

ВscriptsСоздание папкиdeploy.js, содержание следующее:

асинхронная функция main() {
  const [deployer] = ждут ethers.getSigners();
  console.log("Учетная запись развертывания:", Deployer.address);

  const TokenAddress = "0xYourTokenAddressHere";
  const LendingProtocol = await ethers.getContractFactory("LendingProtocol");
  const кредитование = ожидание LendingProtocol.deploy(TokenAddress);

  дождитесь кредитования.развернуто();
  console.log("Протокол LendingProtocol развернут успешно:", Lending.address);
}

main().catch((ошибка) => {
  console.error(ошибка);
  процесс.код выхода = 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

Развертывание завершено

После развертывания будет выведен адрес контракта, который можно использовать для внешней интеграции и взаимодействия.



кредитный договор

Введение контракта

Это кредитное соглашение представляет собой смарт-контракт, работающий на виртуальной машине Ethereum (EVM). Пользователи могут вносить активы, чтобы получать проценты, или одалживать активы для выплаты процентов по этому контракту. Этот протокол поддерживает токены ERC-20 и имеет основные функции, такие как кредитование, сохранение и клиринг.

Основные функции

Пример смарт-контракта (Solidity)

// Идентификатор лицензии SPDX: MIT
прагма солидность ^0.8.0;

интерфейс IERC20 {
    функция TransferFrom(адрес отправителя, адрес получателя, сумма uint) внешний возврат (bool);
    функция Transfer(адрес получателя, сумма uint) внешний возврат (bool);
    функция BalanceOf(адрес учетной записи) возвращает внешнее представление (uint);
    функция Approv(адрес отправителя, сумма uint) внешние доходы (bool);
}

контракт LendingProtocol {
    общедоступный токен IERC20;
    адрес публичного владельца;
    uint publicinterestRate = 5; // годовая процентная ставка 5%

    отображение(адрес => uint) государственных депозитов;
    отображение (адрес => uint) публичных заимствований;

    конструктор (адрес _token) {
        токен = IERC20(_токен);
        владелец = msg.sender;
    }

    функция депозит(сумма uint) внешняя {
        require(сумма > 0, «Сумма должна быть больше 0»);
        token.transferFrom(msg.sender, адрес(это), сумма);
        депозиты[msg.sender] += сумма;
    }

    функция заем(сумма uint) внешний {
        require(сумма > 0, «Сумма должна быть больше 0»);
        uint залог = депозиты[msg.sender];
        require(залог >= сумма * 2, «Недостаточное обеспечение»);
        занимает[msg.sender] += сумма;
        token.transfer(msg.sender, сумма);
    }

    функция погашения (сумма uint) внешняя {
        require(сумма > 0, «Сумма должна быть больше 0»);
        require(borrows[msg.sender] >= sum, «Недостаточное заимствование»);
        занимает[msg.sender] -= сумма;
        token.transferFrom(msg.sender, адрес(это), сумма);
    }

    функция вывода (сумма uint) внешний {
        require(deposits[msg.sender] >= сумма, «Недостаточный баланс»);
        require(borrows[msg.sender] == 0, "Есть неоплаченные кредиты");
        депозиты[msg.sender] -= сумма;
        token.transfer(msg.sender, сумма);
    }
}

соображения безопасности

будущее расширение



BSC Contract

Введение

BSC (Binance Smart Chain) — это публичная цепочка, совместимая с EVM (виртуальной машиной Ethereum), поэтому смарт-контракты Solidity, написанные на Ethereum, можно практически напрямую развертывать в 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",
  сети: {
    bscTestnet: {
      URL: "https://data-seed-prebsc-1-s1.binance.org:8545/",
      идентификатор цепи: 97,
      Цена газа: 20000000000,
      аккаунты: ["0xваш личный ключ"]
    },
    bscMainnet: {
      URL: "https://bsc-dataseed.binance.org/",
      идентификатор цепи: 56,
      Цена газа: 20000000000,
      аккаунты: ["0xваш личный ключ"]
    }
  }
};

Скрипт развертывания

асинхронная функция main() {
  const [deployer] = ждут ethers.getSigners();
  console.log("Учетная запись развертывания:", Deployer.address);

  const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
  константное хранилище = ждут SimpleStorage.deploy();

  ожидайте Storage.Deployed();
  console.log("Контракт развернут:", Storage.address);
}

main().catch((ошибка) => {
  console.error(ошибка);
  процесс.код выхода = 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) в качестве технического индикатора.

# Загрузите данные об акциях Apple с Yahoo Finance
символ = 'AAPL'
data = yf.download(symbol, start='2020-01-01', end='2023-01-01')

# Рассчитать 10-дневные и 50-дневные простые скользящие средние (SMA)
data['SMA_10'] = data['Close'].rolling(window=10).mean()
data['SMA_50'] = data['Close'].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. Используйте модель случайного леса для обучения и прогнозирования.

Мы используем модель случайного леса для обучения данных и прогнозирования вероятностей роста и падения акций в тестовом наборе.

#Инициализируем случайный классификатор леса модель = RandomForestClassifier(n_estimators=100, random_state=42) #Модель поезда model.fit(X_train, y_train) # Прогнозируем рост и падение тестового набора y_pred = model.predict(X_test) y_prob = model.predict_proba(X_test) # Получаем вероятность роста и падения

Шаг 5. Рассчитайте точность модели и отобразите вероятность роста и падения.

Мы можем рассчитать точность модели и отобразить вероятность роста и падения для каждого дня.

# Рассчитать точность модели точность = точность_оценка (y_test, y_pred) print(f"Точность модели: {accuracy:.2f}") # Отображение вероятностей роста и падения за первые 5 дней в тестовом наборе для меня в диапазоне (5): print(f"День {i+1}: вероятность роста = {y_prob[i][1]:.2f}, вероятность падения = {y_prob[i][0]:.2f}")

Шаг 6. Принимайте торговые решения, исходя из вероятности роста и падения.

Исходя из вероятности повышения, вы можете установить порог принятия решения о совершении операции покупки. Например, если вероятность роста превышает 70%, покупайте.

# Установите порог повышения вероятности порог = 0,7 # Принимайте решения о покупке, основываясь на вероятности для меня в диапазоне (len(y_prob)): если 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"
заголовки = {"Агент пользователя": "Mozilla/5.0"}
ответ = запросы.get(url, заголовки=заголовки)

если ответ.код_статуса == 200:
    суп = BeautifulSoup(response.text, 'html.parser')
    таблицы = pd.read_html(response.text)
    если таблицы:
        df = table[0] # Получаем первую таблицу
        печать (дф)
    еще:
        print("Данные таблицы не найдены")
еще:
    print("Невозможно подключиться к публичной странице объявления о подписке")

На что следует обратить внимание



Разработка программ Форекс

Получить курс доллара США к тайваньскому доллару

Способ 1. Используйте CurrencyAPI.

CurrencyAPI предоставляет информацию о курсах валют в режиме реального времени. Вот пример кода:

запросы на импорт

URL = 'https://api.currencyapi.com/v3/latest'
параметры = {
    'apikey': 'Ваш ключ API',
    'base_currency': 'USD',
    «валюты»: «TWD»
}
ответ = запросы.get(url, params=params)
данные = ответ.json()
usd_to_twd = данные['данные']['TWD']['значение']
print(f"1 доллар США равен {usd_to_twd} новым тайваньским долларам")

Уведомление:Вам необходимо зарегистрироваться в CurrencyAPI и получить ключ API, прежде чем вы сможете его использовать.

Способ 2. Используйте ExchangeRatesAPI.

ExchangeRatesAPI также предоставляет услуги запроса обменного курса в реальном времени:

запросы на импорт

URL = 'https://api.exchangeratesapi.io/latest'
параметры = {
    'access_key': 'Ваш ключ API',
    «база»: «доллар США»,
    «символы»: «TWD»
}
ответ = запросы.get(url, параметры=параметры)
данные = ответ.json()
usd_to_twd = данные['ставки']['TWD']
print(f"1 доллар США равен {usd_to_twd} новым тайваньским долларам")

Пожалуйста, сначала зарегистрируйтесь на ExchangeRatesAPI, чтобы получить ключ API и заменить «ваш ключ API» в коде.

Способ 3: используйте пакет forex-python

Если вы не хотите напрямую вызывать API, вы можете использовать сторонний пакет Python.forex-python

из forex_python.converter импортировать CurrencyRates

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 для получения содержимого веб-страницы
ответ = запросы.получить (URL)
суп = BeautifulSoup(response.text, 'html.parser')

# Найдите определенные теги и категории
span_tag = суп.find('span', class_='unit_вторичное_значение')
ставка = span_tag.text
print(f"1 доллар США равен {rate} тайваньским долларам")

Объяснение кода

На что следует обратить внимание

в заключение

Вы можете напрямую получать информацию о курсе валют в режиме реального времени с помощью технологии сканера Python, но вам необходимо обращать внимание на изменения структуры веб-страницы и проблемы соответствия. Он подходит для небольших приложений или учебных целей.



Продажа инвестиционного программного обеспечения

Продажи программы прогнозирования рынка

Абонентская сигнализация

Объедините торговые сигналы, генерируемые программой, в регулярные отчеты или push-трансляции в реальном времени и взимайте с пользователей ежемесячную или годовую плату. Распространенные платформы включают Substack, Patreon или самостоятельно созданные системы членства. Он разделен на бесплатную версию и платную версию в зависимости от функционального уровня. Бесплатная версия привлекает трафик, а платная версия предоставляет сигналы в реальном времени, исторические запросы и подробный анализ.

Платформа инструментов SaaS

Разработайте логику прогнозного ранжирования на веб-странице или в приложении, чтобы пользователи могли выполнять запросы самостоятельно. Модель оплаты может представлять собой ежемесячную подписку, оплату по факту использования или ценообразование по уровням функций. Эта модель хорошо масштабируется и подходит разработчикам с определенными техническими возможностями. Он не требует консультаций по прямым инвестициям и имеет относительно низкие регуляторные риски.

Платные сообщества и каналы Discord

Создать закрытое инвестиционное сообщество. Участники могут получать еженедельные или ежедневные рыночные рейтинги, обсуждения и услуги вопросов и ответов после оплаты членских взносов. Сообщества Discord, Telegram или LINE являются распространенными носителями информации, имеют низкие пороговые значения и быстрый запуск, что делает их подходящими для этапа холодного запуска.

Информационный бюллетень

Регулярно отправляйте отчеты об анализе рынка и прогнозах рейтинга, используя список адресов электронной почты в качестве основного актива. Первоначальная бесплатная подписка для набора аудитории, а после достижения определенного масштаба будет запущена платная версия или рекламное сотрудничество. Substack и Beehiiv в настоящее время являются основными платформами монетизации информационных бюллетеней.

Лицензирование API третьим лицам

Инкапсулируйте модель прогнозирования в API и разрешите ее брокерам, платформам финансовой информации или другим разработчикам приложений для интеграции и использования. Эта модель подходит для уникальных и стабильных моделей, обычно основанных на ежемесячной лицензионной плате или выставлении счетов в зависимости от объема вызовов, с высокой лояльностью клиентов и стабильным доходом.

Лицензирование White Label для организаций

Авторизуйте всю систему инвестиционно-консалтинговым компаниям, управляющим активами или фирмам по ценным бумагам в форме «white label», и другая сторона будет предоставлять услуги под своим собственным брендом. Стоимость контракта обычно выше, но для поддержки переговоров необходимы поддающиеся проверке отчеты о результатах деятельности и профессиональная документация.

Самостоятельные фонды или агентство управления

Используя сигналы программы в качестве основы для операций, собранные средства управляются самими собой или поручаются действовать от их имени, а вознаграждение взимается на основе комиссий за управление и гонораров за результативность. Этот путь имеет самый высокий потенциал, но в большинстве стран он требует финансовой лицензии (например, тайваньской лицензии на консультирование по инвестициям), нормативный порог является самым высоким, и он должен осуществляться в рамках соблюдения требований.

Образовательные курсы и семинары

Объедините логику выбора рынка, разработку индикаторов и методы бэктестинга, лежащие в основе программы, в онлайн-курсы или физические семинары и монетизируйте их в форме продуктов знаний. Эта модель не ограничена напрямую финансовыми правилами и может одновременно создать личный бренд и привлечь трафик к другим путям монетизации. Teachable, Hahow или Udemy — подходящие платформы для листинга.

Сотрудничество по распределению прибыли

Сотрудничайте с инвесторами или трейдерами, у которых есть средства, и те, кто подает сигналы, не будут вносить капитал, а прибыль будет распределяться пропорционально фактической прибыли. Эта модель может косвенно участвовать в прибылях от транзакций без необходимости квалификации по сбору средств, но необходимо уделять внимание ясности конструкции контракта и распределения выгод.

Основные элементы продвижения

Независимо от того, какой путь монетизации будет выбран, успех или неудачу продвижения определяют следующие моменты:




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