Прогнозы цен обычно сочетают в себе алгоритмы машинного и глубокого обучения, а также используют исторические данные и технические индикаторы рынка. Вот некоторые распространенные методы:
Интеллектуальные торговые системы, использующие обучение с подкреплением, могут учиться в моделируемой рыночной среде и со временем оптимизировать решения о покупке и продаже, постепенно улучшая торговые стратегии.
Модели искусственного интеллекта могут судить о настроениях рынка посредством анализа настроений в новостях и социальных сетях, а также прогнозировать изменения цен на акции на основе внешних факторов.
Сочетание нескольких алгоритмов с внешними данными (например, экономическими показателями, фундаментальным анализом компании) часто дает наиболее эффективные модели прогнозирования цен на акции с использованием ИИ.
При использовании ИИ для прогнозирования цен на акции модель генерирует различные индикаторы, которые помогают инвесторам принимать решения. Эти индикаторы можно использовать для оценки рыночных тенденций и проведения соответствующих торговых операций на основе различных сценариев. Вот некоторые распространенные прогнозные индикаторы и стратегии их использования:
Это будущая цена акций, непосредственно предсказанная моделью.
Модель может предсказать вероятность того, что цена акции вырастет или упадет.
Модель может предсказать направление тренда акции на основе технических индикаторов, таких как скользящие средние.
Технические индикаторы, такие как RSI (индекс относительной силы), можно использовать для определения того, перекуплены или перепроданы акции.
Модель может предсказать будущий диапазон колебаний цен на акции.
Прогноз основан на силе покупателей и продавцов на рынке.
Модель может предлагать разумные точки стоп-лосса и тейк-профита на основе исторических данных.
В соответствии с различными прогнозными индикаторами инвесторы могут принимать соответствующие торговые решения, такие как покупка, продажа или пребывание в стороне. Объединение нескольких индикаторов может помочь принять более разумные инвестиционные решения в различных рыночных сценариях.
Среди множества индикаторов оценки ротации не все индикаторы обладают одинаковой предсказательной силой. Основываясь на рыночном опыте последних лет (с 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-Score (множество стандартных отклонений от среднего значения), а горизонтальные сравнения можно проводить только после устранения размерных различий. Формула такова: Z = (текущее значение – среднее значение за последние N периодов) / стандартное отклонение последних N периодов. Например, индекс PMI США равен 52, а индекс PMI еврозоны равен 47. На первый взгляд большой разницы нет. Однако если историческое среднее значение индекса деловой активности в США равно 53, стандартное отклонение равно 3, а Z-показатель равен -0,33;
Индекс экономических сюрпризов Citi измеряет отклонение фактических экономических данных от ожиданий рынка. Сравнивая этот индекс по странам, можно определить, в каком регионе основные показатели улучшаются или ухудшаются сверх ожиданий. Средства, как правило, перетекают на рынки, где индекс неожиданности улучшается.
Ниже приведена полная архитектура и пример программы использования Python для создания автоматизированной системы мониторинга.
| Тип данных | бесплатный источник | Пакет Python/API | частота обновления |
|---|---|---|---|
| Цена акций, цена ETF | Yahoo Finance | yfinance | линия реального времени/ежедневно |
| Доходность казначейских облигаций США | FRED (База данных Федеральной резервной системы) | fredapi | ежедневно |
| PMI、GDP、CPI | FRED / OECD | fredapi / pandas-datareader | месяц/квартал |
| спред по высокодоходным облигациям | FRED(BAMLH0A0HYM2) | fredapi | ежедневно |
| Цены на медь и золото | Yahoo Finance | yfinance(HG=F, GC=F) | линия реального времени/ежедневно |
| Индекс VIX | Yahoo Finance / CBOE | yfinance(^VIX) | немедленный |
| Поток средств | Предполагаемые изменения в активах ETF | yfinance (объем торгов + изменение собственного капитала) | ежедневно |
| Подразумеваемая процентная ставка по фьючерсам | CME FedWatch (требуется сканер) | requests + BeautifulSoup | немедленный |
# === Установить необходимые пакеты === # pip install yfinance fredapi pandas numpy schedule import yfinance as yf import pandas as pd import numpy as np from fredapi import Fred from datetime import datetime, timedelta # Ключ FRED API (перейдите на https://fred.stlouisfed.org/docs/api/api_key.html, чтобы подать бесплатную заявку) fred = Fred(api_key='YOUR_FRED_API_KEY') # ========================================== № 1. Кривая доходности: спред процентных ставок на 2-10 лет. # ========================================== def get_yield_curve_spread(): gs10 = fred.get_series('DGS10') # Доходность 10-летних казначейских облигаций gs2 = fred.get_series('DGS2') # Доходность по 2-летним казначейским облигациям spread = gs10 - gs2 spread = spread.dropna() latest = spread.iloc[-1] status = «Перевернутый (предупреждение о рецессии)» if latest < 0 else "нормальный" return { 'spread': round(latest, 3), 'status': status, 'series': spread.tail(252) # Информация за прошедший год } # ========================================== # 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)
Основная ценность программного мониторинга заключается не в замене человеческого суждения, а в устранении эмоционального вмешательства и обеспечении дисциплины. При построении системы особого внимания требуют следующие моменты:
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")
И 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.
Язык MetaQuotes (сокращенно MQL) — это язык программирования, разработанный специально для торговли на финансовых рынках и используемый для создания автоматических торговых стратегий (советников), пользовательских индикаторов, скриптов и библиотек функций на платформах MetaTrader (таких как MT4 и MT5).
// Работаем каждый раз, когда запускается новый K-джойстик
интервал начала () {
if (OrdersTotal() == 0 && Volume[0] == 1) {
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Ордер на покупку", 0, 0, clrGreen);
}
вернуть 0;
}
#property indicator_separate_window
#property indicator_buffers 1
double Buffer[];
int OnInit() {
SetIndexBuffer(0, Buffer);
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total, const int prev_calculated,
const datetime &time[], const double &open[],
const double &high[], const double &low[],
const double &close[], const long &tick_volume[],
const long &volume[], const int &spread[]) {
for (int i = 0; i < rates_total; i++) {
Buffer[i] = close[i] - open[i];
}
return(rates_total);
}
MQL-код можно редактировать и компилировать с помощью встроенного в MetaEditor MetaEditor, а также тестировать и оптимизировать в тестере стратегий.
MetaQuotes Language — профессиональный язык, созданный для автоматизации торговли. Как новички, так и профессиональные количественные трейдеры могут использовать его мощные функции для реализации сложных торговых стратегий.
Это наиболее полная версия, включающая несколько индикаторов, инструменты рисования и полный торговый интерфейс (при подключении к брокеру).
<!-- Расширенный контейнер диаграмм -->
<div class="tradingview-widget-container">
<div id="tradingview_adv"></div>
<script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>
<тип сценария="текст/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, включаяSpot APIиClient API, чтобы облегчить пользователям проведение автоматических транзакций и сбор данных.
Binance Spot API — это API, разработанный Binance для трейдеров спотового рынка. Его можно использовать для запроса рыночной информации, размещения ордеров, отмены ордеров и других операций. Этот API обычно используется для разработки торговых ботов, автоматических торговых стратегий и мониторинга колебаний рынка.
Клиентский API Binance предоставляет удобный способ доступа к различным методам API Binance. Разработчики могут использоватьbinance.clientAPI библиотеки
Аутентификация и управление, а также удобный вызов функций различных спотовых и контрактных рынков.
pip install binancebinance.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-интерфейсы 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()
import requests
def get_klines(symbol="BTCUSDT", interval="60", limit=5):
url = f"{BASE_URL}/v5/market/kline?category=linear&symbol={symbol}&interval={interval}&limit={limit}"
res = requests.get(url)
res.raise_for_status()
data = res.json()
for k in data["result"]["list"]:
print(k)
if __name__ == "__main__":
get_klines()
Частные конечные точки Bybit, такие как размещение заказов и запрос активов, требуют ключа API и подписи.
запросы на импорт, время, 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()
Пионекс использует/api/v1/common/symbols?type=PERPДля получения торговой пары «бессрочный контракт»; на Bybit вы можете использовать/v5/market/instruments-infoи укажитеcategory=linear(бессрочный USDT) илиinverse(обратный контракт) достигает того же эффекта.
запросы на импорт
класс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("линейный")
| Pionex | Bybit | иллюстрировать |
|---|---|---|
type=PERP | category=linear | Бессрочный контракт USDT |
type=SPOT | category=spot | спотовый рынок |
| — | category=inverse | Обратные бессрочные или поставочные контракты |
{
"retCode": 0,
"result": {
"list": [
{
"symbol": "BTCUSDT",
"contractType": "LinearPerpetual",
"status": "Trading",
"lotSizeFilter": {
"minOrderQty": "0.001",
"maxOrderQty": "100",
"qtyStep": "0.001"
},
"priceFilter": {
"tickSize": "0.5"
}
}
]
}
}
category=linearТо есть соответствует торговой паре «PERP» компании Pionex.priceFilter、lotSizeFilterи другие ограничения.В наличии в Пионексе/api/v1/market/klinesПроверить ситуацию на рынке; соответствующая конечная точка Bybit/v5/market/kline. черезcategoryУкажите тип рынка (например.linearПредставляет бессрочный контракт USDT) и может быть передан вsymbol、interval、limit、endTimeи другие параметры.
запросы на импорт
время импорта
класс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)
]
]
}
}
categoryМожно изменить наspotилиinverseСоответствуют различным рынкам.endАргументом является временная метка в миллисекундах (эпоха Unix × 1000).Ниже приведен непосредственно воспроизводимый пример Python с использованием ThreadPoolExecutor со встроенными повторными попытками, ограничением скорости и кешем. Процесс: сначала загрузите захваченную K-линию (если таковая имеется) из кэша и отправляйте запросы только на отсутствующие или недостаточные торговые пары; используйте пул потоков для одновременного выполнения нескольких запросов и используйте семафор для управления количеством параллелизма, чтобы избежать ограничений; в случае неудачи для повторной попытки будет использована экспоненциальная отсрочка.
# Требования: запросы на установку 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])
MAX_WORKERSиMAX_CONCURRENT. Если у вас есть ключ API, вы обычно можете увеличить квоту скорости.Pionex предоставляет официальный API, который позволяет разработчикам автоматизировать транзакции, запрашивать рыночные данные и управлять активами аккаунта с помощью программ. API поддерживает методы REST и WebSocket.
API KeyиSecret, показано только один раз// Используйте 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);
}
Получить Балансы();
время импорта
импортировать 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()
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());
});
импортировать веб-сокет
импортировать 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()
доступныйGET /api/v1/common/symbolsЧтобы получить все поддерживаемые торговые пары и подробные атрибуты Pionex, такие как минимальный размер ордера, точность цены, тип транзакции (спот или контракт) и т. д.
GET https://api.pionex.com/api/v1/common/symbols
{
"code": 0,
"data": [
{
"symbol": "BTC_USDT",
"quoteCurrency": "USDT",
"baseCurrency": "BTC",
"minQty": "0.0001",
"minNotional": "5",
"pricePrecision": 2,
"quantityPrecision": 6,
"tradeEnable": true
},
{
"symbol": "ETH_USDT",
"quoteCurrency": "USDT",
"baseCurrency": "ETH",
"minQty": "0.001",
"pricePrecision": 2,
"quantityPrecision": 6,
"tradeEnable": true
}
]
}
запросы на импорт
BASE_URL = "https://api.pionex.com"
защита 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"]]
/api/v1/market/tickersПолучите мгновенные цены.Следующая программа вызоветhttps://api.pionex.com/api/v1/common/symbols, автоматически распечатывает структуру (ключ и тип данных) возвращаемого JSON, что упрощает понимание фактического формата.
запросы на импорт
импортировать 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
json.dumps(data, indent=2)Доступен полный контент.Получите данные K-линии (свеча / OHLCV) указанной торговой пары, полученные из данных публичного рынка Pionex.
| параметр | тип | Это необходимо | иллюстрировать |
|---|---|---|---|
| symbol | string | да | Торговая пара (пример: BTC_USDT или BTC_USDT.PERP) |
| interval | string | да | Временной интервал, например 1M, 5M, 15M, 30M, 60M, 4H, 8H, 12H, 1D. |
| endTime | число (миллисекунды) | нет | время окончания (временная метка в миллисекундах) |
| limit | number | нет | Количество полученных данных, по умолчанию 100, диапазон 1–500. |
{
"result": true,
"data": {
"klines": [
{
"time": 1691649240000,
"open": "1851.27",
"close": "1851.32",
"high": "1851.32",
"low": "1851.27",
"volume": "0.542"
}
]
},
"timestamp": 1691649271544
}
запросы на импорт
BASE_URL = "https://api.pionex.com"
def get_klines (символ: str, интервал: str, end_time: int = 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 нет ни одного«Получите поддержку сеточных торговых пар»выделенный API, но доступ к нему можно получить черезGET /api/v1/market/tickersПолучите все торговые пары и отфильтруйте их..PERPВведите (USDT Perpetual Contract), чтобы получить список торговых пар, поддерживаемых Futures Grid.
запросы на импорт
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
...
.PERP) можно использовать напрямую с Futures Grid Bot.API Max Coin — это набор интерфейсов прикладного программирования, предоставляемых Max Exchange, который позволяет разработчикам программно получать доступ к функциям торговли криптовалютой. Разработчики могут автоматизировать транзакции, получать рыночные данные и управлять активами через 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")
печать (тикер_данные)
Использование биткойновДоказательство работы (PoW)В качестве механизма консенсуса для достижения децентрализованной системы бухгалтерского учета. Основная цель PoW — позволить узлам конкурировать за решение математических задач, чтобы определить, кто имеет права на учет, гарантируя, что данные не могут быть подделаны по желанию.
Майнеры будут определять приоритетность транзакций на основе следующих критериев, чтобы увеличить шансы на успешную упаковку блоков и получение комиссий:
Когда объем транзакций слишком велик, возникают перегрузки и возрастают комиссии за обработку. Для решения этой проблемы предлагаются различные решения расширения:
| Имя поля | Размер (байты) | иллюстрировать |
|---|---|---|
| block size | 4 | Общий размер всего блока (включая заголовок и все данные транзакции) (в байтах) |
| block header | 80 | Информация заголовка блока используется для проверки и связывания предыдущего и последующих блоков. |
| transaction counter | 1 ~ 9 | Количество транзакций, выраженное как целое число переменной длины (VarInt), указывающее, сколько транзакций содержится в этом блоке. |
| transactions | переменная | Все фактические данные транзакции, каждая транзакция включает входы и выходы. |
Длина фиксирована и составляет 80 байт, а содержимое следующее:
| Имя поля | тип данных | длина | иллюстрировать |
|---|---|---|---|
| version | int32 | 4 | Версия блока, представляющая приемлемые правила проверки блоков. |
| previous block hash | char[32] | 32 | Хэш-значение предыдущего блока |
| merkle root | char[32] | 32 | Корень дерева Меркла всех хэшей транзакций |
| timestamp | uint32 | 4 | Время создания блока (временная метка UNIX) |
| bits | uint32 | 4 | Сжатое представление целевой сложности. |
| nonce | uint32 | 4 | Чтобы найти изменяющееся значение действительного хеша блока |
Используйте формат VarInt (целое число переменной длины), чтобы указать, сколько транзакций находится в блоке:
Данные каждой транзакции содержат следующие основные части (длина варьируется):
Первая транзакция обычноторговля монетами, которая представляет собой специальную транзакцию для майнеров для получения вознаграждения за блок и не включает ввод.
время импорта
Классовая транзакция:
def __init__(я, отправитель, получатель, сумма, комиссия):
self.sender = отправитель
self.receiver = получатель
self.amount = сумма
самостоятельная плата = плата
self.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 (сокращенно EVM) является основным компонентом Ethereum и отвечает за выполнение смарт-контрактов. EVM предоставляет среду песочницы, которая позволяет разработчикам запускать на ней код, не беспокоясь о том, что это повлияет на другие части сети Ethereum.
Смарт-контракты — это самоисполняющиеся неизменяемые контракты, исполнением которых управляет EVM. Разработчики обычно пишут смарт-контракты, используя языки программирования высокого уровня, такие как Solidity, которые затем компилируются в байт-код, понятный EVM.
Solidity — наиболее часто используемый язык программирования на Ethereum, синтаксис которого похож на JavaScript. Вот простой пример смарт-контракта Solidity:
pragma solidity ^0.8.0;
contract SimpleStorage {
uint public storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
Приведенный выше контракт содержит переменную, используемую для хранения целочисленных данных.storedDataи функции для установки и получения этих данных.
Когда пользователь выполняет смарт-контракт в сети Ethereum, происходят следующие шаги:
Вычислительные ресурсы EVM ограничены. Чтобы предотвратить злоупотребление сетью, EVM используетGasМеханизм расчета и взимания комиссий за транзакции. Каждая операция имеет соответствующую стоимость газа, и пользователи должны предоставить достаточное количество газа при отправке транзакций.
Для оплаты вычислительных ресурсов, необходимых для выполнения смарт-контрактов.
EVM является ядром сети Ethereum и обеспечивает мощную среду для запуска смарт-контрактов. Используя такие языки программирования, как Solidity, разработчики могут создавать разнообразные децентрализованные приложения (dApps) и использовать возможности EVM для реализации сложных логических операций и обработки транзакций.
Node.jsиnpmHardhat:npm install --save-dev hardhatnpx hardhat, выберите «Создать базовый образец проекта»существовать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
hardhat.config.jsДобавьте:require("@nomiclabs/hardhat-ethers");
модуль.экспорт = {
сети: {
герли: {
URL: "https://goerli.infura.io/v3/ваш ключ API",
аккаунты: ["0xваш личный ключ"]
}
},
прочность: "0.8.20"
};
Затем разверните:
npx hardhat run scripts/deploy.js --network goerli
После развертывания будет выведен адрес контракта, который можно использовать для внешней интеграции и взаимодействия.
Это кредитное соглашение представляет собой смарт-контракт, работающий на виртуальной машине Ethereum (EVM). Пользователи могут вносить активы, чтобы получать проценты, или одалживать активы для выплаты процентов по этому контракту. Этот протокол поддерживает токены ERC-20 и имеет основные функции, такие как кредитование, сохранение и клиринг.
// Идентификатор лицензии 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 (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;
});
npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethersnpx hardhat run scripts/deploy.js --network bscTestnetИспользуйте Python и модель случайного леса, чтобы предсказать вероятность роста или падения акций. В этом примере используются данные об акциях из Yahoo Finance, а для обучения модели используются технические индикаторы и, наконец, выводятся вероятности роста и падения акций.
Во-первых, нам нужно установить и импортировать несколько пакетов Python:
pip install yfinance scikit-learn pandas numpy
Затем импортируйте эти необходимые библиотеки:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import yfinance as yf
Затем мы загружаем исторические данные об акциях из Yahoo Finance и рассчитываем простое скользящее среднее (SMA) в качестве технического индикатора.
# Загрузите данные об акциях 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)
Мы будем использовать скользящие средние (SMA) и цены закрытия в качестве функций и разделим данные на обучающий и тестовый наборы.
# Выберите функции
функции = ['SMA_10', 'SMA_50', 'Закрыть']
X = данные [функции]
y = данные['Цель']
# Разделите обучающий набор и тестовый набор (80 % обучение, 20 % тестирование)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,2, shuffle=False)
Мы используем модель случайного леса для обучения данных и прогнозирования вероятностей роста и падения акций в тестовом наборе.
#Инициализируем случайный классификатор леса
модель = RandomForestClassifier(n_estimators=100, random_state=42)
#Модель поезда
model.fit(X_train, y_train)
# Прогнозируем рост и падение тестового набора
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test) # Получаем вероятность роста и падения
Мы можем рассчитать точность модели и отобразить вероятность роста и падения для каждого дня.
# Рассчитать точность модели
точность = точность_оценка (y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")
# Отображение вероятностей роста и падения за первые 5 дней в тестовом наборе
для меня в диапазоне (5):
print(f"День {i+1}: вероятность роста = {y_prob[i][1]:.2f}, вероятность падения = {y_prob[i][0]:.2f}")
Исходя из вероятности повышения, вы можете установить порог принятия решения о совершении операции покупки. Например, если вероятность роста превышает 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}")
В этом примере показано, как использовать модель случайного леса для прогнозирования вероятности роста или падения акций и принятия торговых решений на основе результатов прогнозирования. Это простой, но эффективный способ повысить точность ваших торговых решений.
Доступ к публичной странице объявлений о подписке Тайваньской фондовой биржи можно получить по следующему URL-адресу:
Публичное объявление о подписке
Использование 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("Невозможно подключиться к публичной странице объявления о подписке")
SeleniumИмитировать работу браузера.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, прежде чем вы сможете его использовать.
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» в коде.
Если вы не хотите напрямую вызывать 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
Если вы не используете 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 или самостоятельно созданные системы членства. Он разделен на бесплатную версию и платную версию в зависимости от функционального уровня. Бесплатная версия привлекает трафик, а платная версия предоставляет сигналы в реальном времени, исторические запросы и подробный анализ.
Разработайте логику прогнозного ранжирования на веб-странице или в приложении, чтобы пользователи могли выполнять запросы самостоятельно. Модель оплаты может представлять собой ежемесячную подписку, оплату по факту использования или ценообразование по уровням функций. Эта модель хорошо масштабируется и подходит разработчикам с определенными техническими возможностями. Он не требует консультаций по прямым инвестициям и имеет относительно низкие регуляторные риски.
Создать закрытое инвестиционное сообщество. Участники могут получать еженедельные или ежедневные рыночные рейтинги, обсуждения и услуги вопросов и ответов после оплаты членских взносов. Сообщества Discord, Telegram или LINE являются распространенными носителями информации, имеют низкие пороговые значения и быстрый запуск, что делает их подходящими для этапа холодного запуска.
Регулярно отправляйте отчеты об анализе рынка и прогнозах рейтинга, используя список адресов электронной почты в качестве основного актива. Первоначальная бесплатная подписка для набора аудитории, а после достижения определенного масштаба будет запущена платная версия или рекламное сотрудничество. Substack и Beehiiv в настоящее время являются основными платформами монетизации информационных бюллетеней.
Инкапсулируйте модель прогнозирования в API и разрешите ее брокерам, платформам финансовой информации или другим разработчикам приложений для интеграции и использования. Эта модель подходит для уникальных и стабильных моделей, обычно основанных на ежемесячной лицензионной плате или выставлении счетов в зависимости от объема вызовов, с высокой лояльностью клиентов и стабильным доходом.
Авторизуйте всю систему инвестиционно-консалтинговым компаниям, управляющим активами или фирмам по ценным бумагам в форме «white label», и другая сторона будет предоставлять услуги под своим собственным брендом. Стоимость контракта обычно выше, но для поддержки переговоров необходимы поддающиеся проверке отчеты о результатах деятельности и профессиональная документация.
Используя сигналы программы в качестве основы для операций, собранные средства управляются самими собой или поручаются действовать от их имени, а вознаграждение взимается на основе комиссий за управление и гонораров за результативность. Этот путь имеет самый высокий потенциал, но в большинстве стран он требует финансовой лицензии (например, тайваньской лицензии на консультирование по инвестициям), нормативный порог является самым высоким, и он должен осуществляться в рамках соблюдения требований.
Объедините логику выбора рынка, разработку индикаторов и методы бэктестинга, лежащие в основе программы, в онлайн-курсы или физические семинары и монетизируйте их в форме продуктов знаний. Эта модель не ограничена напрямую финансовыми правилами и может одновременно создать личный бренд и привлечь трафик к другим путям монетизации. Teachable, Hahow или Udemy — подходящие платформы для листинга.
Сотрудничайте с инвесторами или трейдерами, у которых есть средства, и те, кто подает сигналы, не будут вносить капитал, а прибыль будет распределяться пропорционально фактической прибыли. Эта модель может косвенно участвовать в прибылях от транзакций без необходимости квалификации по сбору средств, но необходимо уделять внимание ясности конструкции контракта и распределения выгод.
Независимо от того, какой путь монетизации будет выбран, успех или неудачу продвижения определяют следующие моменты:
email: [email protected]