我们来看看我们如何使用无监督学习进行股票市场分析. 我们将以假设我们不知道有多少个群集来运作. 由于我们不知道簇的数量, 我们将使用一个称为亲和传播的算法进行聚类. 它尝试为我们的数据中的每个集群找到一个代表性的数据点. 它尝试找到数据点对之间的相似度, 并将我们的所有数据点视为各自集群的潜在代表, 也称为示例. 您可以在http://www.cs.columbia.edu/~delbert/docs/DDueck-thesis_small.pdf了解更多信息.

在这个食谱中, 我们会分析一段时间内公司的股票市场变化. 我们的目标是随着时间的推移, 找出公司在报价方面的表现.

怎么做...?

  • 该食谱的完整代码在stock_market.py文件中给出. 我们来看看它是如何构建的. 创建一个新的Python文件, 并导入以下软件包:
import json
import datetime

import numpy as np
# import matplotlib.pyplot as plt
from sklearn import covariance, cluster
from matplotlib.finance import quotes_historical_yahoo_ochl as quotes_yahoo
  • 我们需要一个包含所有符号和关联名称的文件. 此信息位于提供给您的symbol_map.json文件中. 我们来加载一下, 如下:
# Input symbol file
symbol_file = 'symbol_map.json'
  • 载入数据:
# Load the symbol map
with open(symbol_file, 'r') as f:
    symbol_dict = json.loads(f.read())
  • 我们分析指定的一个时间段. 我们将使用这些开始和结束日期来加载输入数据:
# Choose a time period
start_date = datetime.datetime(2004, 4, 5)
end_date = datetime.datetime(2007, 6, 2)
  • 读取输入数据
quotes = [
    quotes_yahoo(
        symbol,
        start_date,
        end_date,
        asobject=True
    ) for symbol in symbols
]
  • 由于我们需要一些特征点, 我们将每天使用开始和结束报价之间的差异来分析数据:
# Extract opening and closing quotes
opening_quotes = np.array([quote.open for quote in quotes]).astype(np.float)
closing_quotes = np.array([quote.close for quote in quotes]).astype(np.float)

# The daily fluctuations of the quotes
delta_quotes = closing_quotes - opening_quotes
  • 我们来构建一个图形模型
# Build a graph model from the correlations
edge_model = covariance.GraphLassoCV()
  • 我们需要在使用数据之前对其进行标准化
# Standardize the data
X = delta_quotes.copy().T
X /= X.std(axis=0)
  • 训练模型
# Train the model
with np.errstate(invalid='ignore'):
    edge_model.fit(X)
  • 现在构建分类模型
# Build clustering model using affinity propagation
_, labels = cluster.affinity_propagation(edge_model.covariance_)
num_labels = labels.max()

# Print the results of clustering
for i in range(num_labels + 1):
    print ("Cluster", i + 1, "-->", ', '.join(names[labels == i]))
  • 结果如下:

results matching ""

    No results matching ""