Skip to content

跨界学习必备!如何利用金融数据训练ML 模型

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:机器学习(ML)已成为获得洞察力、进行预测和加强金融决策的关键。高质量的金融数据对有效的 ML 模型至关重要,而 EODHD 凭借其强大的金融数据 API 套件提供了这一基础。本文将探讨利用 EODHD 数据训练 ML 模型的实用策略,以及在实际市场环境中的应用。我想,无论您是在开发一种新的交易算法,还是在进行定量金融研究,有效利用 EODHD 的数据都能极大地促进您的项目。

今天聊一个热门话题:如何利用金融数据训练机器学习(ML)模型。我在不少文章中都写过调用 Yahoo Finance、Bloomberg、EODHD、Polygon等金融数据 API的文章,但在训练ML模型的单元,我用的最顺手的还是 EODHD。它为用户提供了丰富的金融数据接口(API),涵盖了股票、外汇、指数等多个金融领域,数据集包括历史股价、实时数据、基本面、技术指标和情绪数据等,覆盖了全球 70 多个交易所的 150,000 多个股票代码。并且提供了长达30年的历史数据和实时数据,而且这个 EODHD.COM 在国内能正常访问,API调用响应速度也很快。

需要声明的是,我和 EODHD 没有任何利益往来,本文也不是广告软文 !它吸引我的地方就是比 Yahoo Finance 方便,比Bloomberg 这些便宜,比国内的金融品种多。在开始试用时免费,后面19.99 美元/月可获得大部分的数据访问,也无需长期合约。对于学生和学术目的,还最高可享受 50% 的折扣。

我在我的不少文章中都介绍过 EODHD API ,大家可以用关键词 EODHD在我的网站、公众号上搜索都可以找到。言归正传,开始我们今天的主题。

点击下面的链接,您可以找到包含本文所有示例代码的 Google 笔记本。

https://colab.research.google.com/drive/1JAVuecGM1uGqD_yUSj5JR_0W58qeHCg_?usp=sharing

一、金融数据在机器学习中的作用

在金融行业中,金融数据对机器学习(ML)模型至关重要。这些模型的有效性高度依赖于它们所训练的数据的质量,因此金融数据的准确性和完整性至关重要。让我们探讨一下 金融数据类型及其与 ML 应用的相关性:

  • 历史股票价格:许多金融 ML 模型的基本组成部分,使其能够从过去的市场行为中学习并识别趋势。
  • 实时市场数据:对于需要即时决策的模型(如高频交易中使用的模型)至关重要。
  • 基本数据:对于评估公司内在价值或预测长期业绩的模型来说至关重要,其中包含资产负债表、损益表和现金流的详细信息。
  • 技术指标:EODHD 提供预先计算的指标,可节省开发时间,并确保不同应用中的模型输入统一。
  • 情绪数据:另一种数据源,可增加对市场情绪的洞察力,帮助预测潜在的短期价格变化。

在训练 ML 模型时,数据质量和粒度对实现准确性至关重要。EODHD 的数据经过了严格的验证,并包含细粒度信息(如特定市场的 tick-level 数据),因此可以进行精确的模型训练。

二、EODHD 应用程序接口使用示例

下面的示例展示了如何使用 EODHD 的 End-of-Day API 检索历史股票数据:

import requests
import pandas as pd

def get_stock_data(symbol, start_date, end_date, api_key):
    url = f"https://eodhistoricaldata.com/api/eod/{symbol}"
    params = {
        "from": start_date,
        "to": end_date,
        "api_token": api_key,
        "fmt": "json"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = pd.DataFrame(response.json())
        data['date'] = pd.to_datetime(data['date'])
        return data.set_index('date')
    else:
        raise Exception(f"API request failed with status code {response.status_code}")

# Usage
api_key = "demo"
apple_data = get_stock_data("AAPL", "2024-01-01", "2024-09-31", api_key)
print(apple_data.head())

该代码展示了 EODHD 数据如何无缝集成到 Python 环境中,为进一步的数据分析和模型训练奠定了基础。此外,EODHD 自身的库可用于更快的开发和集成。

注意:将 “demo “替换为您仪表板上的实际 EODHD API 密钥。demo 密钥仅提供 AAPL、TSLA、AMZN 和 MSFT 股票的数据。

三、金融数据机器学习模型的类型

金融部门利用各种机器学习 (ML) 模型,为特定任务和数据类型量身定制。以下是一些常见的 ML 模型,以及如何使用 EODHD 的金融数据来应用这些模型:

3.1 监督学习模型(SL)

监督学习模型(Supervised Learning Models)通常用于股票价格预测、市场趋势预测和信用评分等任务。这些模型从标注的历史数据中学习,从而做出预测或分类。

例如:

  • 线性回归:适用于预测简单趋势。
  • 随机森林:适用于处理金融数据中复杂的非线性关系。
  • 支持向量机(SVM):非常适合二元分类和回归任务,如预测市场方向。

3.2 股票价格预测-随机森林模型示例

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import numpy as np
import requests
import pandas as pd

def get_stock_data(symbol, start_date, end_date, api_key):
    url = f"https://eodhistoricaldata.com/api/eod/{symbol}"
    params = {
        "from": start_date,
        "to": end_date,
        "api_token": api_key,
        "fmt": "json"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = pd.DataFrame(response.json())
        data['date'] = pd.to_datetime(data['date'])
        return data.set_index('date')
    else:
        raise Exception(f"API request failed with status code {response.status_code}")

def prepare_data(df, look_back=30):
    X, y = [], []
    for i in range(len(df) - look_back):
        X.append(df.iloc[i:i+look_back]['close'].values)
        y.append(df.iloc[i+look_back]['close'])
    return np.array(X), np.array(y)

#loading data
api_key = "demo"
apple_data = get_stock_data("AAPL", "2024-01-01", "2024-09-31", api_key)
print(apple_data.head())

X, y = prepare_data(apple_data)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

print(f"Model Score: {model.score(X_test, y_test)}")

3.3 预测模型结果可视化

使用 AAPL 股票数据训练模型后,预测价格与实际收盘价格的对比图有助于直观地显示模型的准确性。

预测模型结果:该图显示了预测收盘价与实际值的吻合程度。

残差图Residual Plot):显示误差的大小和分布情况,有助于深入了解模型的预测可靠性。


3.4 无监督学习模型(UL)

无监督学习模型(Unsupervised Learning Models)通过分析无标注数据来识别模式,因此对市场细分、欺诈检测和风险评估非常有价值。

无监督模型实例:

  • K-Means 聚类:适用于市场细分。
  • 异常检测:帮助识别可能预示欺诈或市场操纵的异常模式。

3.5 强化学习模型(RL)

强化学习模型(Reinforcement Learning Models)通过与环境的互动来学习,因此非常适合算法交易和投资组合优化等动态金融任务。

化学习模型实例:

  • 深度 Q 网络(DQN):常用于算法交易。
  • 政策梯度法:通常应用于投资组合优化。

3.6 深度学习模型(DNN)


深度学习神经网络(Deep learning neural networks)在处理大量金融数据方面非常有效,通常应用于时间序列预测、情感分析和高频交易。

深度学习模型实例:

  • 递归神经网络(RNN):适用于时间序列预测。
  • 长短期记忆(LSTM):可有效捕捉金融数据中的长期依赖关系。

下面是一个使用 TensorFlow 预测股票价格的 LSTM 模型示例:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import requests
import pandas as pd

def get_stock_data(symbol, start_date, end_date, api_key):
    url = f"https://eodhistoricaldata.com/api/eod/{symbol}"
    params = {
        "from": start_date,
        "to": end_date,
        "api_token": api_key,
        "fmt": "json"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = pd.DataFrame(response.json())
        data['date'] = pd.to_datetime(data['date'])
        return data.set_index('date')
    else:
        raise Exception(f"API request failed with status code {response.status_code}")

def prepare_data(df, look_back=30):
    X, y = [], []
    for i in range(len(df) - look_back):
        X.append(df.iloc[i:i+look_back]['close'].values)
        y.append(df.iloc[i+look_back]['close'])
    return np.array(X), np.array(y)

#loading data
api_key = "demo"
apple_data = get_stock_data("AAPL", "2024-01-01", "2024-09-31", api_key)
print(apple_data.head())

# Prepare data
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(apple_data[['close']])

X, y = prepare_data(pd.DataFrame(scaled_data, columns=['close']))
X = X.reshape((X.shape[0], X.shape[1], 1))

# Build model
model = Sequential([
    LSTM(50, return_sequences=True, input_shape=(30, 1)),
    LSTM(50, return_sequences=False),
    Dense(25),
    Dense(1)
])

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, y, batch_size=32, epochs=100)

print("Model trained successfully")

可视化模型性能


四、利用情绪数据进行金融预测

机器学习模型可以帮助预测从股票价格到利率等经济指标的各种金融指标。

下面是一个利用 EODHD 情绪数据的直接股价预测模型示例。

import requests
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from datetime import datetime, timedelta

def get_stock_data(symbol, start_date, end_date, api_key):
    """Fetch stock price data"""
    url = f"https://eodhistoricaldata.com/api/eod/{symbol}"
    params = {
        "from": start_date,
        "to": end_date,
        "api_token": api_key,
        "fmt": "json"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = pd.DataFrame(response.json())
        data['date'] = pd.to_datetime(data['date'])
        return data.set_index('date')
    else:
        raise Exception(f"API request failed with status code {response.status_code}")

def get_sentiment_data(symbol, start_date,end_date, api_key):
    """Fetch sentiment data"""
    url = f"https://eodhistoricaldata.com/api/sentiments?s={symbol}"
    params = {
        "from": start_date,
        "to": end_date,
        "api_token": api_key,
        "fmt": "json"
    }
    
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        symbol_key = f"{symbol}.US"
        if symbol_key not in data:
            raise KeyError(f"No sentiment data found for symbol {symbol}")
        
        sentiment_df = pd.DataFrame(data[symbol_key])
        sentiment_df['date'] = pd.to_datetime(sentiment_df['date'])
        sentiment_df = sentiment_df.set_index('date')
        
        # Calculate additional sentiment metrics
        sentiment_df['sentiment_strength'] = abs(sentiment_df['normalized'] - 0.5) * 200
        
        return sentiment_df
    else:
        raise Exception(f"API request failed with status code {response.status_code}")

def prepare_data_with_sentiment(price_df, sentiment_df, look_back=30):
    """Prepare data with both price and sentiment features"""
    # Ensure sentiment_df has same dates as price_df
    combined_df = price_df.join(sentiment_df, how='left')
    
    # Forward fill sentiment values for missing dates
    combined_df['normalized'] = combined_df['normalized'].ffill()
    combined_df['count'] = combined_df['count'].ffill()
    combined_df['sentiment_strength'] = combined_df['sentiment_strength'].ffill()
    
    # Fill any remaining NaN values with median values
    combined_df = combined_df.fillna(combined_df.median())
    
    X, y = [], []
    feature_names = ['close', 'normalized', 'count', 'sentiment_strength']
    
    for i in range(len(combined_df) - look_back):
        features = []
        for feature in feature_names:
            features.extend(combined_df.iloc[i:i+look_back][feature].values)
        X.append(features)
        y.append(combined_df.iloc[i+look_back]['close'])
    
    return np.array(X), np.array(y)

# Modified training and prediction code to include dates
def train_model_with_dates(X, y, dates, test_size=0.2):
    """Train model and return results with corresponding dates"""
    # Split the data
    split_idx = int(len(X) * (1 - test_size))
    X_train, X_test = X[:split_idx], X[split_idx:]
    y_train, y_test = y[:split_idx], y[split_idx:]
    test_dates = dates[split_idx:]
    
    # Train model
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    
    # Make predictions
    y_pred = model.predict(X_test)
    score = model.score(X_test, y_test)
    
    return model, X_test, y_test, y_pred, test_dates, score

# Example usage
api_key = "demo"
symbol = "AAPL"
end_date = datetime.now()
start_date = end_date - timedelta(days=365)

# Get data
stock_data = get_stock_data(symbol, start_date.strftime('%Y-%m-%d'), 
                            end_date.strftime('%Y-%m-%d'), api_key)
sentiment_data = get_sentiment_data(symbol, start_date.strftime('%Y-%m-%d'),end_date.strftime('%Y-%m-%d'), api_key)

# Prepare data
X, y = prepare_data_with_sentiment(stock_data, sentiment_data)
dates = stock_data.index[30:]  # Adjust for lookback period

# Train model and get predictions with dates
model, X_test, y_test, y_pred, test_dates, score = train_model_with_dates(X, y, dates)

print(f"Model Score with Sentiment Features: {score:.4f}")

# Calculate error metrics
mse = np.mean((y_test - y_pred) ** 2)
rmse = np.sqrt(mse)
mae = np.mean(np.abs(y_test - y_pred))

print(f"Root Mean Square Error: ${rmse:.2f}")
print(f"Mean Absolute Error: ${mae:.2f}")

使用 EODHDs 情感数据的预测模型结果:

这些应用凸显了 ML 模型与 EODHD 高质量财务数据相结合的多功能性和优势。

五、EODHD 数据在机器学习项目中的实际应用

为了说明 EODHD 数据在机器学习项目中的实际应用,下面将介绍一些公司如何利用这些数据为其金融技术解决方案提供动力。

5.1 Eccuity

金融科技公司 Eccuity 利用 EODHD 的全面数据进行高级分析和风险管理:

  • 市场风险评估:Eccuity 采用来自 EODHD 的历史价格数据和波动性指标来训练评估各类资产风险的模型。
  • 投资组合优化:通过结合 EODHD 的基本面数据和技术指标,Eccuity 的多层面模型可帮助客户优化其投资组合配置。

5.2 Korzo

算法交易平台 Korzo 整合了 EODHD 数据,以提高交易效率:

  • 信号生成:Korzo 的模型使用 EODHD 的实时和历史数据来识别交易信号。
  • 回溯测试:EODHD 广泛的历史数据使 Korzo 能够对交易策略进行严格的回溯测试和验证。

5.3 Quinetics

Quinetics 专注于定量交易策略,其 ML 模型在很大程度上依赖于 EODHD 数据:

  • 技术分析:Quinetics 的模型使用 EODHD 的技术指标来确定交易机会。
  • 基本面分析:EODHD 的基本面数据使 Quinetics 能够评估股票的内在价值。
  • 情绪分析:EODHD 的情绪数据为 Quinetics 的市场情绪模型提供信息,以调整策略。
  • 经济预测:EODHD 的宏观经济数据为 Quinetics 预测更广泛市场趋势的模型提供支持。

六、EODHD 数据在机器学习项目中的优势

EODHD 的数据提供精确性和可访问性,在覆盖全球 70 多个交易所的数据集上实现了四位数的精确度,从而改变了金融机器学习的开发方式。EODHD 的应用程序接口支持标准格式,使金融 ML 模型开发可以轻松访问高质量数据。

EODHD 通过经过验证的预清理数据集( data preparation )简化了数据准备工作,减少了数据处理和验证所需的资源。开发人员可以利用深度历史数据进行模式识别,同时利用实时数据进行当前分析,从而在 ML 模型中实现长期战略和短期响应的平衡。

除市场数据外,EODHD 的平台还提供全面的公司级信息和情感分析( company-level information),增加了模型开发的深度。这种数据基础设施使企业能够简化 ML 开发,同时优先考虑高数据质量。EODHD 使企业能够专注于其主要目标–构建创新、有效的金融 ML 解决方案,从而提升竞争优势。

七、机器学习 EODHD 入门课程

EODHD 提供了一套强大的金融 API,非常适合各种机器学习项目。以下是关键 API 的简要概述,以及如何在 ML 应用程序中利用这些 API:

7.1 每日收盘(EOD)历史数据

提供大量历史定价数据,这些数据对于侧重于长期趋势分析和交易策略回溯测试的模型至关重要。将其与基本面指标相结合,有助于建立更具弹性的预测模型。

地址:https://eodhd.com/financial-apis/api-for-historical-data-and-volumes

7.2 实时数据

通过 WebSockets 将美国市场的实时金融数据、1100 多种外汇对、1000 多种数字货币纳入,延迟不到50 毫秒

地址:https://eodhd.com/financial-apis/new-real-time-data-api-websockets

7.3 基本数据

提供详细的公司财务指标,是价值投资和公司业绩预测模型的理想选择。将这些数据与情感分析相结合,可全面了解公司的前景。

地址:https://eodhd.com/financial-apis/stock-etfs-fundamental-data-feeds

7.4 日内历史数据

提供详细的时间序列数据,适用于高频交易模型和短期价格走势分析。与技术指标搭配使用时,该 API 可提高交易信号的准确性。

地址:https://eodhd.com/financial-apis/intraday-historical-data-api

7.5 其他数据

  • 实时(延迟)股票价格 API:支持实时模型推断,实现动态投资组合再平衡。

地址:https://eodhd.com/financial-apis/live-realtime-stocks-api

  • 技术指标 API:提供预先计算的技术指标,对交易模型很有价值。试验各种指标组合有助于优化模型性能。

地址:https://eodhd.com/financial-apis/technical-indicators-api

  • 另类数据应用程序接口(包括情感分析):包括经济事件数据、经新闻提要和股票新闻情绪数据、宏观指标和宏观经济数据。强烈建议使用 NLP 技术来进一步分析所提供的文本数据。

地址:https://eodhd.com/financial-apis/category/alternative-data-financial-api

  • 有关 API 使用和最佳实践的完整详情,请查阅 EODHD 的官方文档。

地址:https://eodhd.com/financial-apis/

八、观点总结

本文介绍了金融领域的机器学习,展示了 EODHD 的综合 API 如何支撑先进的金融技术应用。从股票价格预测到复杂的算法交易系统,高质量的金融数据对于创建准确可靠的 ML 模型至关重要。随着金融科技的发展,机器学习与详细的金融数据相结合将继续成为核心。无论是构建个人交易算法、金融分析平台,还是下一个创新金融技术应用,EODHD 都是值得一试的选择。

  • 金融数据的质量对于训练有效的 ML 模型至关重要。EODHD 提供的数据集具有高准确性和广泛的覆盖范围,是构建高质量 ML 模型的基础。
  • EODHD 数据的多样性和全面性 使得它能够支持多种金融 ML 应用,包括股票价格预测、市场趋势分析、风险管理、算法交易和投资组合优化等。
  • 结合 EODHD 的情绪数据可以增强 ML 模型的预测能力,因为它提供了市场情绪的量化指标,这对于理解市场动态和调整交易策略至关重要。
  • EODHD 的 API 简化了数据的获取和处理,使得开发者能够更快地进行数据分析和模型训练,从而提高了开发效率。
  • 金融科技的发展趋势表明,机器学习与详尽的金融数据相结合将继续在金融领域中发挥核心作用,推动创新和竞争力的提升。
  • 开发者和独立交易者都应该利用 EODHD 的数据和资源,以构建更加创新和有效的金融 ML 解决方案,从而在竞争激烈的金融市场中获得优势。

点击下面的链接,您可以找到包含本文所有示例代码的 Google 笔记本。

https://colab.research.google.com/drive/1JAVuecGM1uGqD_yUSj5JR_0W58qeHCg_?usp=sharing

感谢您阅读到最后,希望本文能给您带来新的收获。祝您投资顺利!如果对文中的内容有任何疑问,请给我留言,必复。


本文内容仅仅是技术探讨和学习,并不构成任何投资建议。

Published inAI&Invest专栏

Be First to Comment

发表回复