楼主: Elizabeth1314
343 0

[其他] 26、股票数据建模:从数据处理到模型应用 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

19%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
80 点
帖子
7
精华
0
在线时间
0 小时
注册时间
2018-7-17
最后登录
2018-7-17

楼主
Elizabeth1314 发表于 2025-11-27 16:42:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

股票数据建模:从数据处理到模型应用

1. 核心函数与基础定义

在构建股票预测模型的过程中,评估分类器性能是关键环节。针对每个分类器,通过计算误差平方和(SSE)并取其平均值,来衡量特定参数组合下的分类效果。

为此,首先定义了一系列核心函数:

(defn accum
  ([] [])
  ([v x] (conj v x)))

(defn x-validate [vocab-size hidden-count period coll]
  (v/k-fold #(make-train vocab-size hidden-count period %)
            #(test-on %1 period %2)
            accum
            10
            coll))
accum

其中一个函数用于将每次计算得到的误差逐步累积至一个向量中,便于后续分析。

x-validate

另一个函数则负责利用指定方法

make-train

创建并训练一个新的神经网络模型,随后使用测试集进行验证,并借助

test-on
accum

完成误差率的收集工作。

2. 参数优化:寻找最优配置

为了提升模型表现,需对两个主要超参数进行调优:隐藏层中的神经元数量以及预测的时间步长(即未来周期)。这两个变量构成了庞大的参数搜索空间,虽然无法穷举所有组合,但可通过采样部分配置进行实验,从而逼近最佳结果。

为此引入以下辅助函数:

(defn explore-point [vocab-count period hidden-count training]
  (println period hidden-count)
  (let [error (x-validate
                vocab-count hidden-count period training)]
    (println period hidden-count
             '=> \tab (u/mean error) \tab error)
    (println)
    error))

(def ^:dynamic *hidden-counts* [5 10 25 50 75])

(defn final-eval [vocab-size period hidden-count
                  training-set test-set]
  (let [nnet (make-train
               vocab-size hidden-count period training-set)
        error (test-on nnet period test-set)]
    {:period period
     :hidden-count hidden-count
     :nnet nnet
     :error error}))

(defn explore-params
  ([error-ref vocab-count training]
   (explore-params
     error-ref vocab-count training *hidden-counts* 0.2))
  ([error-ref vocab-count training hidden-counts test-ratio]
   (let [[test-set dev-set] (u/rand-split training test-ratio)
         search-space (for [p periods, h hidden-counts] [p h])]
     (doseq [pair search-space]
       (let [[p h] pair,
             error (explore-point vocab-count p h dev-set)]
         (dosync
           (commute error-ref assoc pair error))))
     (println "Final evaluation against the test set.")
     (let [[period hidden-count]
           (first (min-key #(u/mean (second %)) @error-ref))
           final (final-eval
                   vocab-count period hidden-count
                   dev-set test-set)]
       (dosync
         (commute error-ref assoc :final final))))
   @error-ref))
explore-point

其中某函数专门用于测试一组具体的参数组合;而

explore-params

则在整个预设范围内遍历不同参数对,循环调用

explore-point

并将各次运行产生的误差记录下来,形成完整的性能对比数据。

3. 数据加载与预处理流程

建模前的数据准备阶段包括两大模块:股票价格信息与相关新闻文本的获取与清洗。

加载股票价格数据

通过如下方式从本地 CSV 文件读取历史股价,并以日期作为索引字段:

user=> (require
         [me.raynes.fs :as fs]
         [financial]
         [financial.types :as t]
         [financial.nlp :as nlp]
         [financial.nn :as nn]
         [financial.oanc :as oanc]
         [financial.csv-data :as csvd]
         [financial.utils :as u])

user=> (def stocks (csvd/read-stock-prices "d/d-1996-2001.csv"))
user=> (def stock-index (nn/index-by :date stocks))

导入并处理新闻文章

新闻数据加载后,需进一步处理其内容,主要包括提取关键词、计算 TF-IDF 权重,并构建词汇表供后续向量化使用:

user=> (def slate (doall
                    (map oanc/load-article
                         (oanc/find-slate-files
                           (io/file "d/OANC-GrAF")))))
user=> (def corpus (nlp/process-articles slate))
user=> (def freqs (nlp/tf-idf-all corpus))
user=> (def vocab (nlp/get-vocabulary corpus))

4. 构建训练与测试数据集

将经过处理的新闻数据与对应的股票价格序列进行融合,生成可用于监督学习的样本集合:

user=> (def training
         (nn/make-training-set stock-index vocab freqs))

此时,每篇新闻对应一个输入特征向量,同时关联着多个时间点上的股价变化序列作为输出目标。

5. 探索神经网络的最佳参数组合

基于已构建的训练集和设定的参数范围,开始系统性地探索最优网络结构:

user=> (def error-rates (ref {}))
user=> (nn/explore-params error-rates (count vocab) training)

该过程计算开销较大,运行一段时间后可观察到模型在超过一两天的长期预测上表现不佳,因此可以提前终止任务。由于采用引用传递机制,中断操作不会丢失已有中间结果。

最终汇总各参数组合下的平均误差并输出:

user=> (def error-means
         (into {}
               (map #(vector (first %) (u/mean (second %)))
                    @error-rates)))
user=> (pprint (sort-by second error-means))

结果显示如下:

未来时间周期 - 隐藏节点数 平均误差
[[#10] 1.0435393
[[#5] 1.5253379
[[#25] 5.0099998
[[#50] 32.00977
[[#100] 34.264244
[[#200] 60.73007
[[#300] 100.29568

根据上述误差表现,选择“预测未来一天”且“隐藏层含10个节点”的配置作为最终训练方案。

6. 模型训练与验证过程

使用选定参数对神经网络进行完整训练:

user=> (def nn (nn/make-network (count vocab) 10))
user=> (def day1 (first nn/periods))
user=> (nn/train-for nn day1 training)

训练期间会实时打印每一迭代轮次的误差值:

Iteration # 1 Error: 22.025400% Target-Error: 1.000000%
Iteration # 2 Error: 19.332094% Target-Error: 1.000000%
Iteration # 3 Error: 14.241920% Target-Error: 1.000000%
Iteration # 4 Error: 6.283643% Target-Error: 1.000000%
Iteration # 5 Error: 0.766110% Target-Error: 1.000000%

完成训练后,获得一个具备预测能力的成熟模型。

7. 在新数据上的实际应用

为检验模型泛化能力,需准备新的新闻文本与最新的股票行情数据:

(def idf-cache (nlp/get-idf-cache corpus))
(def sample-day (time/date-time 2014 3 20 0 0 0))
(def used-vocab (set (map first idf-cache)))

(def articles (doall
                (->> "d/slate/"
                  fs/list-dir
                  (map #(str "d/slate/" %))
                  (map #(oanc/load-text-file sample-day %))
                  (nlp/load-text-files used-vocab idf-cache))))

(def recent-stocks (csvd/read-stock-prices "d/d-2013-2014.csv"))
(def recent-index (nn/index-by :date recent-stocks))

(def inputs
  (map #(nn/make-feature-vector recent-index used-vocab %)
       articles))

user=> (pprint
         (flatten
           (map vec
                (map #(nn/run-network nn %) inputs))))

执行预测后的输出结果如下:

(0.5046613110846201
 0.5046613110846201
 0.5046613135395166
 0.5046613110846201
 0.5046613110846201
 0.5046613110846201
 0.5046613110846201
 0.5046613110846201
 0.5046613112651592
 0.5046613110846201)

结果表现出较高一致性。从 sigmoid 激活函数的输出来看,模型认为未来一天内股价变动较小。实际情况也印证了这一点:3月20日收盘价为69.77美元,次日收盘价为70.06美元,仅上涨0.29美元,与模型预测趋势相符。

8. 分析局限性及反思

尽管模型取得一定成效,但仍存在多方面限制,需引起重视:

数据层面的挑战

  • 依赖单一来源的新闻可能造成信息偏差,应整合多个渠道的数据。
  • 现有文章覆盖的时间跨度有限,难以反映长期市场规律。
  • 某些时间段内新闻发布密度较低,影响特征连续性。

机器学习与金融市场建模的复杂性

  • 简单套用机器学习技术于股市预测存在重大风险,不应将其视为稳赚策略。
  • 新闻内容与股价波动之间的关联较弱,市场价格本身受多重因素驱动,难以仅凭文本准确推断。

要实现更有效的建模,必须同时掌握金融理论知识与机器学习方法,才能设计出更具解释力和实用性的系统。

9. 关键步骤总览

为清晰呈现整个建模流程,以下是各主要阶段的操作总结:

步骤 操作内容 代码示例
1 加载必要的命名空间
(require [me.raynes.fs :as fs] [financial] [financial.types :as t] [financial.nlp :as nlp] [financial.nn :as nn] [financial.oanc :as oanc] [financial.csv-data :as csvd] [financial.utils :as u])
2 加载股票价格数据
(def stocks (csvd/read-stock-prices "d/d-1996-2001.csv")) (def stock-index (nn/index-by :date stocks))
3 加载新闻文章数据
(def slate (doall (map oanc/load-article (oanc/find-slate-files (io/file "d/OANC-GrAF"))))) (def corpus (nlp/process-articles slate)) (def freqs (nlp/tf-idf-all corpus)) (def vocab (nlp/get-vocabulary corpus))
4 创建训练集
(def training (nn/make-training-set stock-index vocab freqs))
5 寻找最佳参数
(def error-rates (ref {})) (nn/explore-params error-rates (count vocab) training)
6 训练神经网络
(def nn (nn/make-network (count vocab) 10)) (def day1 (first nn/periods)) (nn/train-for nn day1 training)
7 准备新数据
(def idf-cache (nlp/get-idf-cache corpus)) (def sample-day (time/date-time 2014 3 20 0 0 0)) (def used-vocab (set (map first idf-cache))) (def articles (doall (->> "d/slate/" fs/list-dir (map #(str "d/slate/" %)) (map #(oanc/load-text-file sample-day %)) (nlp/load-text-files used-vocab idf-cache)))) (def recent-stocks (csvd/read-stock-prices "d/d-2013-2014.csv")) (def recent-index (nn/index-by :date recent-stocks)) (def inputs (map #(nn/make-feature-vector recent-index used-vocab %) articles))
8 运行网络
(pprint (flatten (map vec (map #(nn/run-network nn %) inputs))))

10. 核心函数逻辑解析

在整个流程中,若干函数承担了关键角色,下面对其内部逻辑进行深入剖析:

x-validate

该函数主要用于协调数据流与模型交互过程,确保输入输出格式匹配,并支持误差反馈机制,是连接数据处理与模型训练的重要桥梁。

整体流程回顾

graph LR
    A[加载股票价格和新闻文章数据] --> B[创建训练和测试集]
    B --> C[寻找神经网络最佳参数]
    C --> D[训练和验证神经网络]
    D --> E[在新数据上运行网络]
    E --> F[分析结果并考虑局限性]

如上图所示,股票数据建模涵盖了从原始数据采集、清洗整合、特征工程、参数调优、模型训练到新场景部署的全流程。各个环节环环相扣,任何一步的疏漏都可能影响最终预测质量。

综上所述,股票数据建模是一项高度复杂的跨学科任务,要求研究者兼具数据科学技能与金融领域认知。只有持续优化方法、正视模型局限,才能逐步提升预测的可靠性。同时必须清醒认识到资本市场的不确定性,绝不能完全依赖算法做出投资决策。

进行 K 折交叉验证时,该函数使用如下方式实现:

v/k-fold

其中,设置为 10 折交叉验证,意味着数据将被划分为十个子集,依次轮流作为验证集,其余用于训练。此过程通过以下操作完成:

10
(defn x-validate [vocab-size hidden-count period coll]
  (v/k-fold #(make-train vocab-size hidden-count period %)
            #(test-on %1 period %2)
            accum
            10
            coll))

在网络构建与训练阶段,系统会创建一个新的神经网络模型并进行训练:

#(make-train vocab-size hidden-count period %)

训练完成后,使用独立的测试集对网络性能进行评估:

#(test-on %1 period %2)

在训练和验证过程中,误差值会被持续记录和累积,以便后续分析:

accum

参数优化流程

相关函数定义如下:

explore-params
(defn explore-params
  ([error-ref vocab-count training]
   (explore-params
     error-ref vocab-count training *hidden-counts* 0.2))
  ([error-ref vocab-count training hidden-counts test-ratio]
   (let [[test-set dev-set] (u/rand-split training test-ratio)
         search-space (for [p periods, h hidden-counts] [p h])]
     (doseq [pair search-space]
       (let [[p h] pair,
             error (explore-point vocab-count p h dev-set)]
         (dosync
           (commute error-ref assoc pair error))))
     (println "Final evaluation against the test set.")
     (let [[period hidden-count]
           (first (min-key #(u/mean (second %)) @error-ref))
           final (final-eval
                   vocab-count period hidden-count
                   dev-set test-set)]
       (dosync
         (commute error-ref assoc :final final))))
   @error-ref))

该函数的主要执行逻辑包括:首先将原始数据集划分为测试集与开发集;随后遍历预设的参数搜索空间,针对每一组超参数组合调用以下函数进行性能测试:

explore-point

每次测试所得的误差率将被保存至指定存储结构中:

error-ref

在所有参数组合评估完成后,系统会选择平均误差最低的一组参数,并以此配置进行最终模型的评估与确认。

实际应用中的关键注意事项

  • 数据质量:确保所使用的股票价格及新闻文本数据具备高准确性和完整性。任何数据缺失或异常都可能显著影响模型效果。
  • 模型泛化能力:尽管交叉验证和参数调优有助于提升模型表现,但仍需警惕过拟合现象。应确保模型在未见数据上也能保持稳定性能。
  • 市场动态性:股票市场具有高度时变特性,模型的有效性可能随时间推移而减弱。因此,建议定期更新训练数据并重新训练模型,以适应新的市场环境。

未来发展趋势展望

  • 多源数据融合:除现有新闻与股价数据外,未来可引入社交媒体情绪、宏观经济指标等多元信息源,进一步增强预测能力。
  • 复杂模型探索:可尝试采用更先进的深度学习架构,如循环神经网络(RNN)、长短期记忆网络(LSTM)等,以更好地捕捉时间序列中的长期依赖关系。
  • 实时预测系统建设:推动模型向实时化方向发展,支持流式数据处理与在线学习机制,从而提供更快速、更及时的预测服务。

mermaid 流程图展示整体建模流程:

graph LR
    A[数据质量检查] --> B[模型训练与优化]
    B --> C[实际应用与监控]
    C --> D{性能是否满足要求?}
    D -- 是 --> E[继续应用]
    D -- 否 --> F[调整模型或数据]
    F --> B

综上所述,通过对股票数据建模方法的系统分析,我们对其技术路径与应用场景有了更深刻的认识。在实践中,应结合具体需求灵活选用合适的技术方案,并持续迭代优化模型。同时,也必须意识到金融市场的复杂性与不确定性,模型结果仅作为辅助参考,不宜作为唯一决策依据。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:股票数据 数据建模 数据处理 Evaluation Vocabulary

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-5 13:18