七月在线机器学习量化交易笔记-全-

七月在线机器学习量化交易笔记(全)

001:课程概述与算法交易入门 🚀

在本节课中,我们将学习机器学习与量化交易项目班的整体框架,并初步了解算法交易的核心概念。课程旨在将机器学习、量化交易和项目实战三个领域有机结合,帮助大家构建一个完整的知识体系。

课程目标与结构 📚

本课程分为三个核心部分:机器学习、量化交易和项目实战。这三个领域各自独立,但在实际应用中紧密相连。课程的目标是让大家不仅理解理论知识,还能从代码层面实现相关功能,从而更高效地使用现有平台或搭建自己的系统。

为什么需要自己搭建交易系统?

现有平台(如优矿、聚宽等)虽然方便,但在处理大规模数据或复杂模型时可能存在计算力不足的问题。此外,如果平台缺乏某些特定数据,你可能需要自行搭建数据库和交易平台。因此,掌握系统搭建的能力至关重要。

课程内容概览

  1. 交易系统开发与设计:学习如何设计和实现一个可扩展的自动化交易平台。
  2. 量化交易与策略开发:包括时间序列分析、机器学习在金融中的应用、策略回测和风险管理。
  3. 项目实战:通过实际案例,掌握如何将理论知识转化为可运行的代码。

算法交易简介 🤖

算法交易是指利用自动化平台执行预先设计的一系列规则完成的交易行为。只要交易行为由机器自动执行,且背后有明确的规则,都可以称为算法交易。

算法交易 vs. 量化交易

在本课程中,我们主要关注量化交易。量化交易是算法交易的一个子集,其核心特点是交易决策基于数学模型,而非主观经验或“老中医式”的规则。我们的规则是通过数据学习得到的。

算法交易的优势与劣势

以下是算法交易的主要优势:

  • 数据驱动:基于大量历史数据建模,用数据说话。
  • 高效执行:基于事件驱动,满足条件即自动下单,效率远高于人工操作。
  • 无主观干预:策略完全基于规则,不受情绪影响。
  • 可度量评价:策略好坏可以通过科学的回测指标(如夏普比率)量化评估。
  • 高频交易能力:计算机可以处理极高频率的重复性工作。

算法交易也存在一些挑战:

  • 成本较高:需要投入一定的时间和金钱成本。
  • 技巧要求高:需要较强的数学和编程背景。

算法交易的基本流程 🔄

算法交易的建模流程通常包含以下四个步骤:

  1. 提出假设:基于观察或理论,提出一个可验证的交易想法(例如:“当5日均线上穿10日均线时,股价可能上涨”)。
  2. 建立模型:将假设转化为具体的数学模型或规则。
  3. 回测验证:在历史数据上测试模型的表现,验证其有效性。科学的回测方法至关重要,错误的方法会导致实盘交易失败。
  4. 执行交易:在实盘环境中应用通过验证的模型进行交易。


交易策略的来源 💡

交易策略主要有三个来源:

  1. 市场微观结构:基于限价订单簿等市场深度信息,对超短期(秒级)价格进行预测,常用于高频交易。
  2. 基金结构套利:分析大型机构的交易行为模式,设计套利算法。
  3. 基于历史数据的机器学习模型:利用大量历史数据,通过机器学习算法挖掘规律,指导交易。这是目前应用最广泛的方法。

市场微观结构示例

假设当前某股票的限价订单簿如下:

  • 买一:99.95元,100股
  • 买二:99.90元,50股
  • 卖一:100.00元,1000股
  • 卖二:100.05元,500股

此时,若有一笔以市价卖出100股的订单,它会与买一(99.95元)撮合,导致成交价下降。通过分析订单簿的买卖压力,可以预测短期价格走势。


机器学习核心概念速览 🧠

机器学习可以看作一个黑箱函数 f(X) = Y。其中,X 是输入特征(例如:股票的各种技术指标),Y 是输出(例如:预测下一时刻涨跌或价格)。函数内部有许多参数 W,学习算法的目标就是根据历史数据找到最优的 W

公式表示Y ≈ f_W(X)

机器学习流程

  1. 准备数据:收集历史数据,构建训练集 { (X_i, Y_i) }
  2. 选择模型:确定函数 f 的形式(如线性模型、神经网络)。
  3. 训练模型:使用学习算法,调整参数 W,使模型在训练集上表现最好。
  4. 预测:对于新的输入 X_new,使用训练好的模型 f_W 输出预测结果 Y_pred

机器学习的主要流派

  • 连接主义:以神经网络为代表,通过神经元连接和加权来学习。
  • 符号主义:以决策树、规则学习为代表,模型可解释性强。
  • 频率学派贝叶斯学派:两种不同的统计推断框架。

机器学习在量化交易中的应用场景 🎯

在量化交易中,机器学习主要有以下几种应用方式:

  1. 基于市场微观结构的建模:使用限价订单簿数据预测极短期价格变动。
  2. 基于价格特征的分类/回归模型:输入是价格衍生指标(如均线、MACD),输出是买卖信号或未来价格。
  3. 基于文本分析的模型:利用新闻、社交媒体文本,通过自然语言处理技术(如词向量)提取信息,用于选股或市场情绪判断。
  4. 强化学习:将交易过程视为智能体与环境的交互,通过不断试错学习最优交易策略。

注意:构建训练集时,必须确保输入特征 X_t 仅包含 t 时刻及之前的信息,绝不能包含未来信息,否则会导致“时间旅行”错误,使回测结果虚假乐观。


策略评估与回测 ⚖️

评估一个交易策略需要综合多方面的指标,不能只看收益率。

常见评估指标

  • 夏普比率:衡量风险调整后的收益。
  • 最大回撤:策略运行中可能出现的最大亏损幅度。
  • 胜率:盈利交易次数占总交易次数的比例。

科学回测的重要性

回测是在历史数据上验证策略的过程,必须科学进行,避免以下常见错误:

  • 乐观主义偏差:精心选择对策略有利的历史时段进行测试。
  • 时间旅行:在特征中无意引入了未来信息。
  • 过拟合:模型在训练集上表现完美,但在未见过的新数据(测试集)上表现糟糕。必须将数据分为训练集和测试集
  • 幸存者偏差:回测时只使用了最终存活下来的股票数据,忽略了已退市股票,导致结果有偏。

工具与实战:事件驱动架构 ⚙️

本课程将使用 Python 作为主要编程语言,因其在数据科学和机器学习领域有丰富的库(如 pandas, scikit-learn)。

从工程角度,一个典型的自动化交易系统采用事件驱动架构。其核心是一个主循环,不断监听和处理事件(如新的行情数据、订单成交回报)。

伪代码描述核心逻辑

while True:
    new_event = get_new_event() # 获取新事件
    if new_event.type == "MARKET_DATA":
        handle_market_data(new_event)
    elif new_event.type == "ORDER_FILLED":
        handle_order_filled(new_event)
    # ... 处理其他类型事件
    time.sleep(cycle_interval) # 等待下一个周期

系统主要模块包括:事件队列、数据处理器、策略模块、风险控制模块和订单执行模块。理解这一架构,有助于更好地使用现有平台或自行开发系统。


总结 📝

本节课我们一起学习了机器学习与量化交易项目班的整体框架。我们明确了算法交易(尤其是量化交易)的定义、优势与流程,探讨了交易策略的来源,并快速理解了机器学习的基本概念及其在金融领域的几种应用模式。同时,我们强调了科学回测的极端重要性,并初步了解了构建交易系统所需的事件驱动架构思想。

从下节课开始,我们将深入细节,学习必要的金融知识、Python编程基础,并逐步将今天提到的每个概念付诸实践。

002:课程概述与Python基础准备 🎯

在本节课中,我们将要学习课程的整体安排、Python编程环境的搭建与核心库的学习路径,并从机器学习的视角重新审视一个经典的金融模型——资本资产定价模型。

课程目标与安排 📅

上一节我们介绍了金融、编程和机器学习三个领域的知识如何交互。本节中我们来看看接下来课程的具体任务目标。

本次课与下次课是一个有机的整体,旨在将理论知识落实到代码层面。本次课的主要目标是:

  1. 明确课后自学任务:利用国庆假期,编程基础薄弱的同学需要系统学习Python。
  2. 建立机器学习视角:从一个经典的金融模型入手,理解机器学习如何介入技术分析框架。

从下次课开始,我们将进入实战阶段,课程内容会非常密集,每周的编程作业预计需要5-8小时。下次课的核心内容包括:

  • 使用Python爬取金融数据。
  • 使用Python(特别是Pandas库)进行金融数据的清洗、处理和特征提取。
  • 使用Python进行数据可视化。
  • 建立第一个基于机器学习的简单量化模型,并完成第一次编程作业。

过渡:明确了课程目标后,我们首先需要为后续的编程实战打下坚实的基础。接下来,我们看看需要掌握哪些Python知识。

Python与核心库学习指南 🐍

为了高效地进行量化交易开发,我们需要熟练掌握Python及其在数据分析领域的核心库。以下是具体的学习要求和建议。

开发环境与Python版本

  • 推荐平台:Anaconda。它集成了绝大多数常用的Python包,能免去大量安装烦恼。
  • 实验环境:课程上半学期主要在Jupyter Notebook中进行实验和数据分析。
  • 操作系统:首选Linux或macOS,Windows也可用但可能遇到更多环境配置问题。
  • Python版本:课程主要使用Python 2.7。若你只会Python 3,可单独与讲师沟通。

Python语言基础

我不希望学员花费高昂学费来学习基础的语法。因此,大家需要利用假期自学Python基础。一个高效的学习网站是“Learn X in Y Minutes”(例如Learn Python in Y Minutes)。你需要掌握以下核心知识点:

以下是需要掌握的核心知识点列表:

  • 数据类型与基本语法:字符串、整型等数据类型,以及分支、循环、函数定义等。
  • 核心数据结构:熟练操作list(列表)和dictionary(字典)。
  • 内置函数:学会利用Python丰富的内置函数库,避免重复“造轮子”。例如,一行代码实现字符串逆序输出:s[::-1]
  • 面向对象编程:理解类、对象、方法等概念,因为量化交易平台通常是事件驱动和面向对象的。

核心数据分析库

掌握了Python基础后,需要深入学习以下在量化交易中至关重要的库:

  1. NumPy:用于高性能数值计算,特别是矩阵(数组)操作。

    • 关键技能:创建矩阵/向量、熟练进行矩阵索引(例如,提取特定行、列或满足条件的元素)。
    • 学习资源:推荐书籍《利用Python进行数据分析》第四章。
  2. Pandas:基于NumPy构建,专为处理表格数据和时间序列设计,效率极高。

    • 关键技能:熟练使用其内置函数进行数据读取、清洗、转换和分析。在编写函数前,建议先通过Google搜索(英文关键词)查看是否已有现成的Pandas方法。
  3. Scikit-learn:机器学习库。除了深度学习和强化学习,大多数传统机器学习模型的算法都已实现。

    • 实践目标:在下次课前,学会使用sklearn拟合一个线性回归模型。关键操作是model.fit()model.predict()

学习建议:遇到编程问题时,首先推荐在 Stack Overflow 网站用英文搜索,绝大多数常见问题都有解答。这比在群里提问更高效,也是业界提倡的做法。

过渡:掌握了工具之后,我们如何用机器学习的思维来解决金融问题呢?让我们从一个最经典的模型开始。

从机器学习视角看CAPM模型 🤖

技术分析的核心是寻找价格变化的规律。本节我们将一个经典的金融模型——资本资产定价模型,转化为一个机器学习问题。

什么是CAPM模型?

CAPM模型描述的是单个资产(或资产组合)的收益与市场整体收益之间的关系。

对于单一股票 i,在时刻 t 的模型表示为:
r_i(t) = β_i * r_m(t) + α_i(t)
其中:

  • r_i(t):股票 it 时刻的收益率。
  • r_m(t):市场(如沪深300指数)在 t 时刻的收益率。
  • β_i:股票 i 的贝塔系数,衡量其相对于市场的波动性。
  • α_i(t):阿尔法值,代表超额收益,在有效市场假说下其期望值为零。

从机器学习角度看,我们可以这样理解:

  • 预测目标:我们想预测的变量 y 是股票 i 的收益率 r_i(t)
  • 输入特征:模型认为,影响 y 的唯一特征是市场收益率 r_m(t),即 x
  • 模型形式:模型假设 yx线性关系,即 y = β * x + α
  • 噪声项α_i(t) 可以看作是模型未捕捉的噪声,理想情况下期望为零。

图形化解释:如果我们以 r_m 为横坐标,r_i 为纵坐标,将历史数据画成散点图,CAPM模型就是在寻找一条最优的拟合直线,其斜率是 β,截距是 α

模型的启示与扩展

CAPM模型是一个单变量线性模型。机器学习的思路可以立刻对此进行扩展:

  1. 特征扩展:我们不一定只使用市场收益率这一个特征。可以加入其他技术指标,如动量、移动平均线、布林带等,将 x 从一维扩展到多维。
  2. 模型扩展:关系不一定是线性的。我们可以用支持向量机、随机森林等非线性模型来拟合 y = f(x) 这个关系。
  3. 核心任务:量化交易建模的本质就变成了两件事:寻找有预测力的特征 x选择合适的模型函数 f

过渡:既然技术分析依赖于从历史数据中提取特征,那么这些特征具体有哪些?我们又该如何处理它们呢?

技术分析、特征工程与机器学习基础 🛠️

技术分析通过分析历史价格和交易量数据来预测未来走势。机器学习为这个过程提供了系统化的工具。

技术指标作为特征

技术分析师发明了许多指标,这些都可以作为机器学习模型的输入特征:

  • 动量:衡量价格变化的速度。公式为 (当前价格 / N期前价格) - 1
  • 简单移动平均:过去N个时间点价格的平均值,用于平滑噪声,识别趋势。
  • 布林带:在移动平均线上下各画出两条标准差线,形成通道。用于衡量价格波动性和识别超买超卖状态。

特征预处理的重要性

直接从数据中计算的指标,其数值范围可能差异很大。例如,动量值可能在[-0.05, 0.05],而某些指标值可能在[0, 100]。如果不加处理,数值范围大的特征会主导模型。

因此,必须进行特征标准化
x_normalized = (x - mean(x)) / std(x)
这样处理后,每个特征的均值为0,标准差为1,保证了它们在模型中被公平对待。

机器学习建模初步

我们最终要学习一个函数 y = f(x) + ε,其中 ε 是观测噪声。

  1. 最近邻:最简单的非参数方法。预测新样本时,找历史数据中最近的K个样本,用它们的 y 值平均作为预测。但这种方法在特征维度高时效果差(“维数灾难”)。
  2. 线性回归:假设 f 是线性函数。通过最小化预测值与真实值之间的误差平方和来求解参数。虽然简单,但非常有效且可解释性强。
  3. 模型选择与过拟合
    • 过拟合:模型在训练数据上表现完美,但在新数据上表现很差。就像“死记硬背”的学生不会解新题。
    • 偏差-方差权衡:简单模型偏差高、方差低;复杂模型偏差低、方差高。机器学习的目标是找到最佳平衡点,使模型在未知数据(测试集)上表现最好。

过渡:今天的内容为后续实战搭建了理论和认知框架。最后,让我们回顾并总结全课要点。

总结与预告 📚

本节课中我们一起学习了以下内容:

  1. 课程路线图:明确了本课程与下节课的实践导向目标,强调了Python编程能力的重要性。
  2. 工具准备:详细列出了需要自学的Python核心知识及NumPy、Pandas、Scikit-learn等库的学习要点与资源。
  3. 思维转换:将经典的CAPM金融模型解构为一个单变量线性回归问题,从而揭示了用量化方法研究市场的通用范式:y = f(x)
  4. 基础概念:介绍了如何将技术指标转化为特征,特征标准化的必要性,以及机器学习中模型、过拟合和偏差-方差权衡等核心概念。

下节课,我们将直接进入实战:获取真实金融数据,进行特征提取与处理,并构建我们的第一个机器学习量化模型。请务必利用假期夯实Python基础,我们下次课再见!

003:金融数据获取、存储与时间序列分析入门

概述 📋

在本节课中,我们将学习量化交易中两个至关重要的基础环节:金融数据的获取与存储,以及时间序列分析的入门知识。掌握这些技能是后续进行模型构建和策略开发的前提。


第一部分:金融数据的获取与存储 💾

上一节我们介绍了课程的整体安排。本节中,我们来看看如何为量化交易准备“原材料”——数据。

建立数据库的目的

建立本地金融数据库并非最终目的,而是为后续工作服务。其主要意义在于:

  1. 用于建模:高质量的输入(X)是获得有意义输出(Y)的前提,即“垃圾进,垃圾出”。
  2. 用于交易:模型在实时决策时,需要快速获取历史数据。

是否需要建立本地数据库,取决于你的具体需求(如数据量、计算环境、网络条件),并非越复杂越好。

数据获取来源

对于个人开发者,可以从以下平台免费或低成本获取数据:

  • Tushare:提供全面的中国金融市场数据,拥有友好的Python API接口。
  • Yahoo Finance:经典的全球金融数据源。
  • Quandl:提供大量经济和金融数据集,注册后每日调用次数更多。

提示:本课将以Yahoo Finance为例讲解数据爬取,因为其API相对基础,掌握后能更自如地应对其他数据源。作业将要求使用Tushare进行实践。

数据存储方式

常见的金融数据存储方式有以下几种:

  • CSV文件:最简单,每个金融产品存为一个文件。适合数据量小或需要共享的场景。
  • 关系型数据库(如MySQL):结构化存储时间序列数据的成熟方案,便于查询和管理。
  • NoSQL数据库(如MongoDB):适合存储非结构化的文本数据,如财经新闻。

本节课重点讲解如何使用MySQL存储日级(End-of-Day)交易数据。

数据库表设计

一个合理的数据库设计能提升效率。以下是核心表结构示例:

  1. 交易所表 (exchange):存储交易所信息。
    • id:主键
    • abbrev:交易所缩写(如NYSE
    • name:交易所全称
    • city, country, currency:所在地和货币
    • timezone_offset:时区偏移

  1. 数据供应商表 (data_vendor):记录数据来源。
    • id:主键
    • name:供应商名称(如Yahoo Finance
    • website_url, support_email:联系方式
    • created_date, last_updated_date:记录创建和更新时间

  1. 股票代码表 (symbol):存储可交易的标的。
    • id:主键
    • exchange_id:外键,关联交易所
    • ticker:股票代码(如AAPL
    • instrument:资产类型(如stock
    • name:公司名称
    • sector:所属板块
    • currency:交易货币

  1. 日价格表 (daily_price):存储每日价格数据。
    • id:主键
    • data_vendor_id:外键,关联数据供应商
    • symbol_id:外键,关联股票代码
    • price_date:交易日
    • created_date, last_updated_date:记录创建和更新时间
    • open_price, high_price, low_price, close_price:开盘、最高、最低、收盘价
    • adj_close_price调整后收盘价(已考虑分红、拆股等公司行为)
    • volume:成交量

数据质量注意事项

处理金融数据时,需特别注意以下几点:

  • 公司行为调整:如股票拆分、分红等会导致价格突变,需使用调整后价格(adj_close_price)。
  • 节假日处理:需从时间序列中剔除交易日,避免产生空白或错误数据。
  • 噪声与异常值:数据中可能存在瞬时暴涨暴跌的“毛刺”,可使用滤波器平滑处理。
  • 缺失值处理:可使用中位数、均值或前向/后向填充等方法处理缺失数据。

实践流程示例

我们将通过一个完整示例,学习从维基百科获取S&P 500成分股列表,再从Yahoo Finance爬取各股历史数据并存入数据库的流程。

  1. 从维基百科爬取股票列表:使用BeautifulSoup库解析网页,提取股票代码(ticker)。

    import bs4 as bs
    import requests
    
    def save_sp500_tickers():
        resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
        soup = bs.BeautifulSoup(resp.text, 'lxml')
        table = soup.find('table', {'class': 'wikitable sortable'})
        tickers = []
        for row in table.findAll('tr')[1:]:
            ticker = row.findAll('td')[0].text
            tickers.append(ticker.strip())
        return tickers
    
  2. 将股票代码插入数据库:使用数据库连接库(如pymysqlsqlalchemy)执行插入操作。

  3. 从Yahoo Finance获取历史价格:编写函数,根据股票代码和日期范围获取数据。也可使用pandas-datareader库简化。

    import pandas as pd
    import pandas_datareader.data as web
    
    def get_data_from_yahoo(ticker, start_date, end_date):
        # 使用pandas-datareader直接获取数据
        df = web.DataReader(ticker, 'yahoo', start_date, end_date)
        return df
    
  4. 将价格数据插入数据库:循环处理每个股票代码,获取数据并插入daily_price表。

  5. 从数据库读取并验证数据:编写查询,读取数据并与源网站比对,确保正确性。


第二部分:时间序列分析入门 📈

在掌握了数据获取和存储的基本方法后,我们就可以开始对数据进行分析了。本节将介绍量化交易中一个经典的分析框架:时间序列分析。

核心概念:平稳性与均值回归

许多量化策略,特别是统计套利策略,基于一个关键假设:资产价格或投资组合的价值序列是平稳的

  • 平稳时间序列:其统计特性(如均值、方差)不随时间变化。这意味着价格倾向于在长期均值附近波动,即存在均值回归现象。
  • 非平稳时间序列/随机游走:下一时刻的价格与当前时刻无关,不可预测。对于这样的序列,任何基于历史价格的预测都等同于随机猜测。

我们的目标是:找到或构建出平稳的时间序列,从而利用其均值回归特性进行交易。

如何检验平稳性?

有两种常用的统计检验方法:

  1. Augmented Dickey-Fuller (ADF) 检验
    • 原假设 (H0):时间序列具有单位根,即是非平稳的(如随机游走)。
    • 方法:计算检验统计量 ADF Statistic,并与不同置信水平(如1%, 5%, 10%)下的临界值比较。如果ADF Statistic小于临界值,则拒绝原假设,认为序列是平稳的。
    • Python实现:使用statsmodels库可以轻松完成。
      from statsmodels.tsa.stattools import adfuller
      
      def check_stationarity_adf(timeseries):
          result = adfuller(timeseries, autolag='AIC')
          print('ADF Statistic: %f' % result[0])
          print('p-value: %f' % result[1])
          print('Critical Values:')
          for key, value in result[4].items():
              print('\t%s: %.3f' % (key, value))
          # 判断:如果p-value很小(如<0.05),且ADF统计量小于5%临界值,则拒绝非平稳假设
          if result[1] <= 0.05:
              print("序列很可能是平稳的。")
          else:
              print("序列很可能有单位根(非平稳)。")
      

  1. 计算Hurst指数
    • 含义:Hurst指数 H 用于衡量时间序列的长期记忆性。
      • H = 0.5:序列是随机游走(布朗运动)。
      • H < 0.5:序列是均值回归的。
      • H > 0.5:序列是趋势增强的(有持续性)。
    • 方法:通过重标极差分析(R/S分析)计算。

从单资产到投资组合:协整关系

单只股票的价格序列往往是非平稳的。但是,两只或多只股票的线性组合却可能是平稳的。这种关系称为协整

  • 核心思想:如果股票A和股票B的价格存在长期均衡关系,即 Price_A ≈ β * Price_B + constant,那么它们的价差(或残差)序列可能是平稳的。
  • 策略应用:这就是配对交易的基础。当价差偏离历史均值时,做空高价股、做多低价股,期待价差回归时平仓获利。
  • 检验方法:对两只股票价格进行线性回归,然后对回归的残差序列进行ADF检验。如果残差平稳,则说明这两只股票存在协整关系。
import numpy as np
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller

def find_cointegrated_pairs(dataframe):
    """在数据框(列是股票代码,行是时间)中寻找协整的股票对"""
    n = dataframe.shape[1]
    pvalue_matrix = np.ones((n, n))
    keys = dataframe.columns
    pairs = []
    for i in range(n):
        for j in range(i+1, n):
            # 1. 对两只股票价格进行线性回归
            stock1 = dataframe[keys[i]]
            stock2 = dataframe[keys[j]]
            result = sm.OLS(stock1, sm.add_constant(stock2)).fit()
            # 2. 获取残差
            residuals = result.resid
            # 3. 对残差进行ADF检验
            pvalue = adfuller(residuals)[1]
            pvalue_matrix[i, j] = pvalue
            if pvalue < 0.05: # 如果p值小于0.05,认为残差平稳,存在协整关系
                pairs.append((keys[i], keys[j], pvalue))
    return pvalue_matrix, pairs

作业安排 📝

以下是本节课的实践作业,请按要求完成:

作业一:数据获取与存储实践

  • 任务:阅读Tushare文档,使用其API获取A股市场数据(例如,2013年至今的日线数据)。
  • 要求
    • 基础:能够熟练调用API,将所需数据载入内存进行分析。
    • 进阶:将获取的数据存入本地MySQL数据库的相应表中。
  • 目的:确保你拥有随时获取所需金融数据的能力。

作业二:股票关系网络可视化

  • 任务:模仿示例,对沪深300成分股进行关系网络可视化。
  • 步骤
    1. 从Tushare获取300只股票的历史价格。
    2. 计算股票两两之间的相关性(或其他自定义的相似度度量)。
    3. 使用聚类算法(如sklearnSpectralClustering)和可视化库(如networkx, matplotlib),生成类似下图的可视化结果:每个节点代表一只股票,连线的颜色深浅代表相关性大小。
  • 提交:将生成的图片作为作业提交。

作业三:平稳性检验

  • 任务:对沪深300成分股进行ADF检验和/或Hurst指数计算。
  • 要求:找出其中最可能满足均值回归特性(即平稳或H值较小)的10只股票。
  • 目的:实践单资产平稳性检验方法。

作业四:协整关系搜寻

  • 任务:在沪深300成分股中,暴力搜索所有两两配对。
  • 要求:使用协整检验方法,找出最具协整关系(即最可能适用于配对交易)的10对股票。
  • 提示:注意时间区间的选择,并思考如何避免“过拟合”历史数据。

总结 🎯

本节课我们一起学习了量化交易的两大基石:

  1. 数据的获取与存储:我们探讨了建立本地数据库的意义、常见数据源、存储方案设计以及数据清洗的注意事项,并通过一个完整示例演练了从爬取到存储的流程。
  2. 时间序列分析入门:我们引入了平稳性、随机游走、均值回归和协整等核心概念,并学习了如何使用ADF检验和Hurst指数来识别可交易的统计规律。

这些内容是连接数据与策略的桥梁。从下周开始,我们将把重心转向如何利用这些数据,通过机器学习模型来开发交易策略。请务必完成本周作业,为后续学习打下坚实基础。

004:从线性回归到核方法实战入门

概述

在本节课中,我们将正式进入机器学习的实战环节。我们将从最基础的线性回归模型出发,逐步深入到领回归、Lasso回归以及核方法,并学习如何通过交叉验证选择模型超参数。最后,我们将结合量化交易场景,探讨如何定义特征(X)来构建预测模型。


机器学习基础概念

上一节我们介绍了课程的整体安排,本节中我们来看看机器学习的基本框架。

机器学习与传统编程的核心区别在于规则的来源。在传统编程中,规则由程序员或交易员根据观察定义。而在机器学习中,规则是从数据中自动学习出来的。

机器学习主要分为以下几类:

  • 监督学习:给定输入X和对应的输出Y(可以是具体数值或类别标签),学习从X到Y的映射关系。在量化中,预测涨跌(分类)或具体价格(回归)都属于此类。
  • 非监督学习:只有输入X,没有对应的Y。目标是发现数据内部的规律,例如对股票进行聚类分组,或对高维特征进行降维。
  • 强化学习:智能体与环境交互,通过尝试不同的“动作”(如买卖)并获得“奖励”来学习最优策略。这类似于交易员在市场中学习的过程。

Scikit-learn 使用流程

了解了基本概念后,我们来看看如何用Python工具库Scikit-learn实现机器学习。

Scikit-learn(sklearn)是Python中功能强大且易用的机器学习库。使用它进行建模通常遵循以下标准化流程:

  1. 准备数据:获取并划分训练集和测试集。train_X 通常是 n_samples × n_features 的矩阵,train_y 是对应的标签或值向量。
  2. 建立模型:实例化一个模型对象,例如 model = LinearRegression()。模型对象上的“旋钮”就是其待学习的参数。
  3. 训练模型:调用 model.fit(train_X, train_y)。这个过程会寻找一组最优的参数组合,使得模型在训练集上的表现最好。
  4. 评估模型:使用测试集进行预测 predictions = model.predict(test_X),并与真实的 test_y 比较,使用评分函数(如准确率、均方误差)评估模型性能。

注意绝对不能在训练集上评估模型性能,这会导致过拟合的假象。模型性能好不等于回测结果好,更不等于实盘能盈利,但性能差通常意味着模型不可用。


从线性回归到正则化

上一节我们介绍了建模的基本流程,本节中我们来看看最基础也是最重要的模型家族——线性模型。

线性回归 (OLS)

线性回归假设输出Y与输入X呈线性关系。其目标是找到一组参数 θ,使得预测值与真实值之间的误差平方和最小,即最小二乘法

公式
Y = X · θ
其中,Xn×d 的特征矩阵,θd×1 的参数向量。

线性回归有闭式解(解析解):
θ = (X^T · X)^(-1) · X^T · Y

领回归 (Ridge Regression)

在实践中,直接求 (X^T · X) 的逆可能遇到数值不稳定的问题(矩阵病态)。一个计算技巧是给对角线加上一个小常数 λI。

有趣的是,人们发现,使用这个技巧求出的解,其在新数据(测试集)上的泛化性能往往比原始线性回归的解更好。这催生了领回归

领回归在最小二乘的目标函数中,增加了一个对参数 θ 的 L2范数 惩罚项。

目标函数
J(θ) = ||Y - Xθ||² + λ * ||θ||²
其中,||θ||² = θ₁² + θ₂² + ... + θd²,λ 是控制惩罚力度的超参数。

几何解释:领回归的解是在“误差椭圆”和“参数约束圆”的切点处。通过调整λ,可以让解从原点(λ极大)平滑地移动到线性回归的最优解(λ=0)。这起到了收缩(Shrinkage) 参数的作用,防止某些不重要的特征权重过大,提升模型稳定性。

Lasso回归

领回归虽然能收缩参数,但不会将任何参数精确地置为零。然而在特征选择中,我们常常希望模型能自动筛选出最重要的特征子集。Lasso回归 应运而生。

Lasso回归将惩罚项从L2范数(平方和)改为 L1范数(绝对值和)。

目标函数
J(θ) = ||Y - Xθ||² + λ * |θ|
其中,|θ| = |θ₁| + |θ₂| + ... + |θd|

几何解释:L1约束在几何上是一个菱形,其顶点在坐标轴上。与误差椭圆的切点很可能就在这些顶点上,这意味着某些 θᵢ 恰好为0。因此,Lasso天然具备特征选择能力。


从线性到非线性:核方法

上一节我们学习了带正则化的线性模型,但它们本质上还是线性的。本节中我们来看看如何用线性模型处理非线性关系。

一个直观的想法是:对输入特征X进行非线性变换,然后在变换后的空间里做线性回归。例如,将一维特征 x 扩展为 [x, x², x³],再用线性模型拟合。

径向基函数/核回归 (RBF/Kernel Regression)

更强大和通用的方法是使用径向基函数作为非线性变换的基。其核心思想是:用一系列“钟形”函数(如高斯核)的线性组合来逼近任意复杂的函数。

公式(以高斯核为例):
对于一个新的输入点 x,其预测值 y 由所有训练样本点 x_i 处的高斯核函数加权求和得到:
y = Σ α_i · exp(-γ * ||x - x_i||²)
其中,α_i 是待学习的权重,γ 控制核函数的宽度(胖瘦)。

实际操作

  1. 选择核函数(如高斯核)。
  2. 确定核函数的中心 μ 和宽度 γ。中心可以通过对训练数据做K-means聚类来确定;宽度 γ 是一个超参数。
  3. 将原始特征 X 转换为新的特征:每个样本点由其与所有核中心的相似度(核函数值)构成新特征向量。
  4. 在这个新的高维(或无限维)特征空间上,使用领回归或Lasso等线性模型进行拟合。

关键点:核函数的宽度 γ 是至关重要的超参数。γ 太小(核很瘦)会导致过拟合,紧紧缠绕每个数据点;γ 太大(核很胖)会导致欠拟合,模型退化为直线。


模型选择与交叉验证

无论是Lasso的惩罚系数λ,还是核函数的宽度γ,抑或是多项式回归的阶数,这些都需要人为设定的参数称为超参数。如何科学地选择超参数?

交叉验证 (Cross-Validation)

我们不能在测试集上选择超参数,这属于“数据窥探”,会高估模型性能。标准做法是使用验证集

以下是标准流程:

  1. 将数据分为三部分:训练集(如70%)、验证集(如15%)、测试集(如15%)。
  2. 在训练集上,用不同的超参数组合训练多个模型。
  3. 在验证集上评估这些模型的性能,选择性能最好的模型及其超参数。
  4. 用选定的超参数,在训练集+验证集上重新训练最终模型。
  5. 测试集上评估最终模型的性能,作为对外汇报的指标。
  6. 如果决定上线,最后使用全部数据(训练+验证+测试)和选定的超参数训练生产环境模型。

对于多个超参数,可以使用网格搜索(Grid Search)遍历所有组合,并用热力图可视化结果。Sklearn提供了 GridSearchCV 等工具自动化此过程。


量化中的应用:如何定义特征X

掌握了模型和验证方法后,最后也是最关键的一步是:在量化交易中,我们的特征X到底是什么?

对于每一个时刻t,我们需要构建一个特征向量 X_t,用以预测下一个时刻的目标 Y_{t+1}(例如价格或涨跌信号)。

特征X的来源

  • 量价数据:开盘价、收盘价、最高价、最低价、成交量等。
  • 技术指标:移动平均线(MA)、相对强弱指数(RSI)、布林带(Bollinger Bands)、MACD等。这些指标是对原始量价数据的计算和加工。
  • 其他数据:新闻情绪、宏观经济指标等(经过适当编码后)。

实践任务:将常见的技术指标(如MA5, RSI等)编写成Python函数。这些函数将成为你构建特征向量 X_t 的“武器库”。特征工程的质量直接决定了模型性能的上限。


总结

本节课中我们一起学习了机器学习的核心实战内容:

  1. 回顾了机器学习的基本分类和监督学习流程。
  2. 深入讲解了从线性回归(OLS)领回归(L2正则)Lasso回归(L1正则) 的原理与几何解释,理解了正则化如何防止过拟合和进行特征选择。
  3. 引入了核方法,通过非线性特征变换(如径向基函数)让线性模型具备拟合非线性关系的能力。
  4. 学习了通过交叉验证科学选择模型超参数的方法,避免数据窥探。
  5. 最终将机器学习与量化结合,指出定义有信息量的特征X是构建有效预测模型的关键,并给出了技术指标作为特征来源的实践方向。

接下来的课程将结合具体数据,运用这些方法构建我们的量化交易模型。

005:从原始数据到预测模型 🚀

在本节课中,我们将学习如何将原始的金融时间序列数据,转化为机器学习模型能够理解的训练集,并介绍几种核心的预测模型。这是构建量化交易策略中至关重要的一步。

课程概述与作业反馈

上一节课我们学习了如何获取和存储原始金融数据。本节课,我们将聚焦于如何将这些“原材料”加工成可用于建模的“训练集”。

关于作业提交,建议提交包含完整代码和运行结果的 Jupyter Notebook 文件。这有助于高效地评估和反馈。对于作业中遇到的困难,例如数据对齐问题,可以参考相关教材或直接提问。

从原始数据到监督学习框架

现在,我们面临的核心问题是如何将原始数据表格转化为监督学习框架所需的格式。

原始数据表格通常包含时间戳 t 以及该时刻的各类价格数据(如开盘价、收盘价等)。我们的目标是,对于每一个时刻 t0,将其之前的所有相关信息,转换为一组新的特征 X = [x1, x2, ..., xn]。这组特征 X 将用于预测 t0 时刻之后的某个目标 y

核心转换公式

  • 输入(特征)X_t0 = f(原始数据[t <= t0])
  • 输出(目标)y_t0 = g(原始数据[t > t0])

其中,y 可以是下一时刻的涨跌(分类问题),也可以是具体的价格或收益率(回归问题)。这个转换过程是建模前最关键的“脏活累活”。

特征(因子)的选择哲学

特征(在量化领域常称为“因子”)的选择,高度依赖于你对所研究问题的理解。这是一个结合经验、灵感和大量实验的过程。

核心原则:基于你对金融产品价格驱动因素的理解,尽可能多地将你认为相关的因子纳入初选范围。例如,预测沪深300指数,你可能会考虑人民币汇率、黄金价格、标普500指数等。初选阶段应遵循“多多益善”的原则,后续再通过科学方法进行筛选和优化。

不同的因子选择会导向不同的模型效果,而验证其有效性的唯一途径就是实验。一个高质量的因子集,往往比复杂的模型本身更能提升预测精度。

常见特征(因子)的计算方法

以下是几种常见的技术指标特征,它们都可以从原始价格序列中计算得出。注意:计算任何时刻的特征时,都绝对不能使用未来数据(即 t > t0 的数据)。

1. 时间滞后特征

最简单的特征,即直接使用过去若干个时间点的价格。
x_i = price_{t-i}, 其中 i = 1, 2, ..., kk 为滞后窗口大小。

2. 价格变化率特征

计算相邻时间点价格的变化率,进行标准化。
x = (price_t - price_{t-1}) / price_{t-1}

3. 滚动窗口统计特征

计算过去一个时间窗口内的统计量,如最高价、最低价,并基于此构造新特征。

# 示例:基于滚动窗口高/低价的特征
high_lambda = max(price[t-lambda: t])
low_lambda = min(price[t-lambda: t])
x1 = (price_t - price_{t-1}) / high_lambda
x2 = (price_t - price_{t-1}) / low_lambda

4. 技术指标特征

金融市场有大量经验总结的技术指标,它们也可以作为特征。

  • 顺势指标CCI = (典型价格 - 典型价格的移动平均) / (0.015 * 平均绝对偏差)
  • 移动平均线MA_t = (1/λ) * Σ_{i=0}^{λ-1} price_{t-i}
  • 布林带:基于移动平均线和标准差构造的通道。
  • 变动率指标ROC = (price_t / price_{t-n} - 1) * 100

作业建议:建立你自己的特征计算函数库(如 feature_utils.py),方便后续灵活组合和调用。

构建训练集与测试集

当我们有了特征计算函数后,就可以为每个时间点 t 构建特征向量 X_t 和目标值 y_t

最终,我们将得到四个核心数据集:

  • X_train: 训练特征矩阵,形状为 (n_samples, n_features)
  • y_train: 训练目标向量,形状为 (n_samples,)
  • X_test: 测试特征矩阵
  • y_test: 测试目标向量

对于分类问题,y 可以用 {0, 1}{-1, 1} 或 one-hot 编码表示。对于回归问题,y 是一个实数值。

核心预测模型介绍

有了训练集,我们就可以应用机器学习模型进行预测。以下介绍几种在量化领域常用且有效的模型。

1. 随机森林

随机森林是一种集成学习算法,通过构建多棵决策树并综合其结果来提高预测精度和泛化能力。

核心思想

  • 随机性1(数据):使用Bootstrap抽样为每棵树生成不同的训练子集。
  • 随机性2(特征):每棵树分裂时,只考虑特征的一个随机子集(通常大小为 sqrt(n_features))。
  • 集成:分类任务采用投票法,回归任务采用平均法。

优点:泛化能力强,不易过拟合,能提供特征重要性评估,模型具有一定可解释性。

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
model.fit(X_train, y_train)

2. 梯度提升树

以XGBoost为代表,同样是集成树模型,但采用串行、迭代的方式训练,每一棵树学习的是之前所有树预测结果的残差。

核心思想:通过加法模型,不断减少预测误差。
F_m(x) = F_{m-1}(x) + ν * h_m(x)
其中,F_m是第m轮模型,h_m是第m棵树,ν是学习率。

优点:预测精度通常很高,在许多数据科学竞赛中表现出色。

import xgboost as xgb
model = xgb.XGBClassifier(n_estimators=100, max_depth=3, learning_rate=0.1)
model.fit(X_train, y_train)

3. 线性与广义线性模型

作为强大的基线模型,必须尝试。

  • 线性回归:用于回归问题。y_pred = w^T * X + b
  • 逻辑回归:用于二分类问题。P(y=1|X) = 1 / (1 + exp(-(w^T * X + b)))

优点:简单、高效、可解释性强,在高频数据预测中有时难以被超越。

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)

4. 支持向量机

通过寻找最大间隔超平面来进行分类或回归。

  • SVC:用于分类。
  • SVR:用于回归。

优点:适用于高维数据,通过核函数可以处理非线性问题。

5. 神经网络

这里主要指多层感知机。它通过多层非线性变换来学习复杂的特征表示。

核心结构
layer_output = activation(W * layer_input + b)
常用的激活函数包括 ReLU、Tanh 等。

优点:理论上可以逼近任何函数,适合学习难以手工构造的特征表示。

from keras.models import Sequential
from keras.layers import Dense, Dropout

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu-quant/img/4be40c3a9c1b8ee9379fc6a249ae47b6_18.png)

model = Sequential()
model.add(Dense(512, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.2)) # 引入Dropout防止过拟合
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid')) # 二分类输出层
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=128, validation_data=(X_test, y_test))

关于调参:所有模型都有超参数(如树的深度、神经网络层数、学习率等)。必须使用交叉验证来寻找最优参数组合,这是建模流程中不可或缺的一环。对于耗时的模型,可以使用贝叶斯优化等更智能的调参方法。

本周作业

作业一:沪深300股指预测

  1. 任务:分别建立沪深300股指的分类(预测涨跌)和回归(预测价格或收益率)模型。
  2. 要求
    • 至少选择并计算10个不同的特征。
    • 尝试至少两种不同的模型(如随机森林和逻辑回归/线性回归)。
    • 使用交叉验证评估模型,并报告测试集性能。
    • 分类任务:绘制并分析混淆矩阵。
    • 回归任务:绘制预测值与真实值的对比散点图。
    • 分析并展示模型给出的特征重要性。

作业二:股票价格预测

  1. 任务:在沪深300成分股中,筛选出价格在10-50元之间,且日成交量处于33%-66%分位数的股票。
  2. 要求
    • 对筛选出的每只股票,重复作业一的建模流程。
    • 汇报其中预测性能最好的一只股票的详细建模结果。
    • 以 Jupyter Notebook 格式提交,包含完整的代码、运行结果和可视化图表。

课程总结

本节课中,我们一起学习了量化建模流程的核心环节:

  1. 数据转换:将原始金融时间序列数据,转化为监督学习所需的 (X, y) 训练集格式。
  2. 特征工程:理解了特征选择的哲学,并学习了多种常见技术指标特征的计算方法。
  3. 模型构建:介绍了随机森林、梯度提升树、线性模型、支持向量机和神经网络等核心预测模型,及其应用场景。

下节课,我们将深入探讨如何从初选的大量特征中,通过自动化的特征选择与降维方法,提炼出更优质的特征子集,从而进一步提升模型性能。

006:特征选择与两大“玄学”算法

概述

在本节课中,我们将学习机器学习流程中至关重要的一步——特征选择。我们将探讨特征选择的意义、三种主要方法,并深入讲解两个在实践中极其有效但理论背景相对“玄学”的算法:遗传算法和神经网络的反向传播算法。掌握这些内容,将帮助你从原始数据中提炼出高质量的特征,并理解现代人工智能算法的核心运作机制。


特征选择的意义与方法

上一节我们介绍了如何从原始数据构建训练集(X 和 y)。本节中我们来看看如何优化这些训练集,特别是其中的特征(X)。特征选择的核心在于:我们最初选择的特征可能包含冗余、无关甚至全零的列,这会严重影响后续分类器或回归器的性能。通过特征选择,我们可以筛选出一组更优质的特征子集。

特征选择主要有三种思路:

  1. 子集选择:从原始特征中直接挑选出一个子集。例如,从300个特征中选出30个。
  2. 系数约束:在模型训练过程中,通过约束(如L1正则化)使某些特征的系数自动变为零,从而实现特征选择。我们之前讲过的LASSO回归就属于此类。
  3. 降维:通过某种变换(线性或非线性)将原始高维特征映射到一个低维空间。新特征的每一维都是原始特征的组合,意义已完全不同。例如主成分分析(PCA)、自编码器(Autoencoder)等。

接下来,我们首先聚焦于最直观的子集选择方法。


子集选择:暴力法与贪心法

子集选择的目标是找到一个特征子集,使得基于该子集训练的模型性能(如R²分数)最优。然而,如果有p个特征,每个特征可选可不选,则所有子集组合有2^p种,暴力枚举是指数级复杂度,不可行。

因此,我们需要采用近似最优解的算法。

暴力枚举法

理论上,我们可以尝试所有可能大小的子集:

  • 假设最优子集大小为1时,尝试所有单个特征。
  • 假设最优子集大小为2时,尝试所有两个特征的组合(C(p,2))。
  • 以此类推...
    然后汇报在验证集上R²最高(或AIC/BIC最低)的那个子集。这只在特征数很少(如5个)时可行。

前向选择法

这是一种贪心算法,复杂度为O(n²),步骤如下:

以下是前向选择法的步骤:

  1. 初始化一个空的特征子集 S = {}。
  2. 对于每一个不在 S 中的特征 i,将特征 i 加入 S,在训练集上训练模型并计算验证集上的性能指标(如 R²)。
  3. 选择能使模型性能提升最大的那个特征,将其永久加入 S。
  4. 重复步骤2-3,直到模型性能不再显著提升或达到预设的特征数量。

代码描述:这通常通过循环实现,每次循环评估所有候选特征对当前子集的贡献。

同理,还有后向选择法,即从一个包含所有特征的完整集合开始,每次剔除一个对性能损害最小的特征。


遗传算法:受进化论启发的优化术

上一节我们介绍了基于贪心的子集选择方法。本节中我们来看看一种完全不同的、受生物进化启发的全局优化算法——遗传算法。它不仅能用于特征选择,还能解决各种复杂的优化问题。

遗传算法的灵感来源于达尔文的自然选择学说和孟德尔的遗传学。其核心思想是:一个“种群”由多个“个体”(即候选解)组成,每个个体有其“基因型”(如一个二进制串,代表特征选择情况)。个体根据其“适应度”(如R²分数)进行生存竞争,适应度高的个体更有可能存活并产生“后代”。后代通过“基因重组”和“变异”继承和改变父母的基因。经过多代演化,种群中的个体将趋向于更优的解。

算法核心概念与流程

  1. 基因编码:将待优化问题的解表示为“基因型”。例如在特征选择中,一个长度为300的二进制串 [1,0,1,1,0,...] 表示选择哪些特征(1选,0不选)。这就是基因型,其对应的具体特征子集是表现型。
  2. 初始化种群:随机生成一定数量(如1000个)的个体,构成初始种群。
  3. 适应度评估:定义一个适应度函数,用于评价每个个体的好坏。在特征选择中,适应度函数就是模型在验证集上的R²分数。fitness(individual) = R²_score
  4. 选择:根据个体的适应度,以一定的概率选择优秀的个体作为“父母”,用于产生下一代。一种常见的方法是轮盘赌选择:个体i被选中的概率 P_i 等于其适应度占种群总适应度的比例。
    P_i = fitness(i) / sum(fitness(all))
    实现时,可以生成一个[0,1)的随机数,若其小于P_i,则选择该个体。
  5. 交叉:随机选取一对“父母”,以某种方式交换他们的部分基因,产生新的“后代”。例如单点交叉:随机选择一个位置,父母双方在此位置之前和之后的基因段进行交换。
    父1: [A A A | B B B] -> 子1: [A A A | C C C]
    父2: [C C C | D D D] -> 子2: [C C C | B B B]
  6. 变异:以很小的概率(如0.05),随机改变后代个体基因串上的某些位(0变1或1变0),以增加种群的多样性。
    变异前: [1,0,1,1,0] -> 变异后: [1,0,0,1,0]
  7. 迭代:用新产生的后代种群替代旧种群,重复步骤3-6。经过多代(如50-100代)演化后,种群中最优个体的基因型即为近似最优解。

遗传算法的强大之处在于其随机性和并行搜索能力,能够有效处理非凸、复杂的优化问题,且对问题本身的数学性质要求不高。


神经网络与反向传播算法:从生物神经元到数学优化

遗传算法为我们提供了一种全局搜索的利器。本节中我们转向另一大“玄学”支柱——神经网络,并深入其核心训练算法:反向传播。理解BP算法是掌握现代深度学习的关键。

从生物神经元到数学模型

生物神经元接收来自其他神经元的信号(通过树突),进行加权求和,若总和超过某个阈值,则产生电信号(通过轴突)传递给下一个神经元。

最简单的数学模型——感知机,模拟了这一过程:

  • 输入:特征向量 x = [x1, x2, ..., xn]
  • 权重:w = [w1, w2, ..., wn]
  • 加权和:p = w1*x1 + w2*x2 + ... + wn*xn
  • 阈值激活:输出 y = 1 if p > T else 0

为了便于优化,我们进行两点改进:

  1. 消除阈值T:引入偏置项 b,令 p = w·x + b。此时激活条件变为 p > 0b 可视为一个权重,对应一个恒为1的输入。
  2. 使用可微激活函数:将不可微的阶跃函数替换为光滑的Sigmoid函数,以便使用基于梯度的优化方法。
    Sigmoid(x) = 1 / (1 + exp(-x))
    其导数有很好的性质:Sigmoid'(x) = Sigmoid(x) * (1 - Sigmoid(x))

神经网络与优化目标

一个神经网络由多层这样的神经元连接而成。我们的目标是找到一组权重参数 W(包含所有权重和偏置),使得神经网络的预测输出 y_pred 尽可能接近真实标签 y_true

为此,我们定义一个损失函数(或负的适应度函数),例如均方误差:
Loss(W) = 1/2 * (y_true - y_pred)^2
我们的任务转化为一个优化问题:寻找 W 以最小化 Loss(W)

梯度下降与反向传播的奥秘

梯度下降法是求解此类优化问题的基本框架:
W_new = W_old - learning_rate * ∂Loss/∂W
核心难点在于如何高效计算损失函数对海量权重参数 W 的偏导数 ∂Loss/∂W。反向传播算法巧妙地解决了这个问题。

BP算法的精髓(以两层网络为例)
考虑一个简单网络:输入x -> (权重w1) -> 隐层节点h -> (权重w2) -> 输出y_pred,其中包含Sigmoid激活。

  1. 链式法则分解:根据链式法则,损失 Lw1 的梯度可以分解:
    ∂L/∂w1 = (∂L/∂y_pred) * (∂y_pred/∂h) * (∂h/∂p1) * (∂p1/∂w1)
    其中 p1 = w1 * x 是隐层节点的加权输入。
  2. 反向计算
    • ∂L/∂y_pred = -(y_true - y_pred) (均方误差的导数)
    • ∂y_pred/∂h = w2 * Sigmoid'(p2)p2是输出层加权输入)
    • ∂h/∂p1 = Sigmoid'(p1)
    • ∂p1/∂w1 = x
  3. 动态规划思想:对于深层网络,直接计算每条路径的梯度会导致指数级复杂度。BP算法的巧妙之处在于从输出层向输入层反向计算,并复用中间结果。计算 ∂L/∂h 后,无论 h 前面连接了多少层和多少节点,在计算前一层权重梯度时都可以直接使用这个值,而无需重新计算从 Lh 的所有路径。这使计算复杂度从指数级降为与网络层数呈线性关系。

正是反向传播算法的高效性,使得训练具有数百万甚至数十亿参数的深层神经网络成为可能。


循环神经网络简介

前面介绍的前馈神经网络(包括MLP、CNN)在处理时序数据时,无法记忆历史信息。循环神经网络(RNN)通过让网络层间的连接具有循环性,使网络能够保留之前时刻的“状态”,从而处理序列数据。

核心思想:在t时刻,RNN不仅接收当前的输入 x_t,还接收来自上一时刻的隐藏状态 h_{t-1},共同计算当前时刻的输出 y_t 和新的隐藏状态 h_t
h_t = activation(W_hh * h_{t-1} + W_xh * x_t + b_h)
y_t = W_hy * h_t + b_y

这使得 y_t 的预测依赖于 x_t, x_{t-1}, x_{t-2}, ... 的信息。RNN及其变体(如LSTM、GRU)在时间序列预测、自然语言处理等领域取得了巨大成功。


总结

本节课中我们一起学习了:

  1. 特征选择的意义与三种主要方法(子集选择、系数约束、降维),并详细讲解了子集选择中的前向/后向贪心算法。
  2. 遗传算法:一种受生物进化启发的全局优化算法。我们理解了其基因编码、选择、交叉、变异的核心步骤,以及它如何应用于特征选择等优化问题。
  3. 神经网络与反向传播:我们从生物神经元出发,建立了感知机模型,进而引出了多层神经网络。重点剖析了反向传播算法的核心——利用链式法则和动态规划思想,高效计算损失函数对所有权重的梯度,这是神经网络得以训练的关键。
  4. 循环神经网络的基本概念,了解了其处理序列数据的机制。

遗传算法和神经网络的反向传播是两类强大而实用的工具,它们或许缺乏严密的数学理论保证,但在实践中已被证明极其有效。掌握它们,将为你在量化交易和更广泛的机器学习应用中提供有力的武器。

007:作业点评与集成学习入门 🚀

在本节课中,我们将要学习三个核心内容:对前几次作业进行点评、介绍如何通过集成学习提升模型性能,以及展望量化交易建模的后续学习路径。课程旨在帮助初学者理解关键概念,并通过具体示例掌握实践方法。

作业点评与改进建议 📊

上一节我们回顾了课程的整体安排,本节中我们来看看如何更好地完成和提交作业。

一份优秀的作业报告应清晰展示建模流程与结果分析,而非纠结于代码细节。以下是提交作业时的关键要点:

  • 提交格式:将 Jupyter Notebook 导出为 HTML 或 PDF 格式提交,重点展示数据探索、模型构建和结果分析的过程。
  • 代码封装:具体的函数实现应封装在个人库中,无需在报告中展示,除非有特殊需要讨论的部分。
  • 结果导向:报告的核心是建模结果,老师可以根据结果提供针对性的优化建议。

以一位同学的优秀作业为例,其流程值得借鉴:

  1. 数据初探:使用 pandas.DataFrame.head() 查看数据前几行,并进行简单的可视化,了解数据分布。
  2. 特征工程:计算并添加所需的指标特征。
  3. 划分数据集:明确定义训练集和测试集(或验证集)。
  4. 数据清洗:处理缺失值等脏数据。
  5. 模型训练与评估:执行分类或回归任务,并可视化重要特征(如特征重要性排序图)和预测结果对比图(如真实值 vs 预测值曲线)。

然而,在模型调优环节,许多作业可以做得更深入。例如,在使用随机森林(Random Forest)时,若默认参数(如 n_estimators=10)在300维特征上表现不佳,不应立即放弃。正确的做法是系统地探索关键超参数的影响。

以下是进行细致模型分析的建议步骤:

  1. 数据分析:计算基础统计量并进行可视化。特别要检查类别是否不平衡。在金融数据中,涨跌幅度大的样本通常较少,这会导致类别不平衡问题。如果忽略此问题,模型可能会偏向预测多数类,从而错过关键的套利机会。
    • 方法:对于分类任务,绘制每个类别的样本数量直方图;对于回归任务,绘制目标变量 y 的分布图。
  2. 模型初选与粗调:基于数据分析的理解,有目的地选择一批候选模型(分类器/回归器)。对每个模型,不应仅使用默认参数,而应进行初步的参数敏感性分析。
    • 示例:对于随机森林,可以绘制 n_estimators(树的数量)与验证集准确率/ 的关系曲线,观察性能何时趋于稳定。
  3. 迭代与思考:模型性能不佳时,应暂停并思考原因——是类别不平衡、特征问题,还是模型本身不适用?分析后再进行下一步的网格搜索等精细调参。
    • 原则:不要偷懒,多思考结果背后的原因,并迭代式地探索参数空间,避免想当然地局限在小的搜索范围内。

作业目标:使用提供的数据集(332维特征向量,回归任务),将测试集上的 分数提升至 0.07 以上。这需要超越简单的基准测试,进行深入的模型调优。

特征工程简介 🛠️

在建模之前,特征工程是至关重要的一步。对于每个时间点 t 的样本,其特征通常可以分为三类:

  • 长线特征:基本面数据等长期指标。
  • 短线特征:技术分析指标等短期信号。
  • 自定义特征:基于领域知识、另类数据(如新闻情感分析)等独创的指标。这是体现策略差异化的关键。

集成学习:化腐朽为神奇 🤝

当你拥有多个模型,但每个模型单独表现都不够出色时,集成学习(Ensemble Learning)可以将它们组合起来,获得“1+1>2”的效果。这是工业界实践中不可或缺的一环。

基础方法:投票与堆叠

假设我们有10个不同的弱分类器(如SVM、随机森林、逻辑回归),对于一个新样本 x,每个分类器给出预测结果 h_i(x)

  • 硬投票:最简单的集成方式。
    • 公式H(x) = sign( sum( h_i(x) ) )
    • 即汇总所有分类器的预测结果(+1或-1),取多数票为最终结果。
  • 加权投票/混合:为不同分类器分配权重。
    • 公式H(x) = sign( sum( α_i * h_i(x) ) )
    • 关键问题是如何确定权重 α_i。一个直观的方法是根据各分类器在验证集上的准确率来分配权重

更高级的方法是 堆叠

  1. 将原始训练集划分为训练集和验证集。
  2. 用训练集训练多个不同的基模型(第一层模型)。
  3. 让这些基模型对验证集进行预测,得到一组新的预测值。
  4. 将这些预测值作为新的特征,验证集的真实标签作为目标,训练一个元模型(第二层模型,如线性回归)。
  5. 在推理时,先用所有基模型对样本预测,再将它们的预测结果输入元模型得到最终结果。

核心思想对预测结果再做一次监督学习。这种方法几乎可以白嫖性能提升,且元模型可以是任何算法(线性模型、SVM、甚至另一个神经网络)。这种方法可以多层堆叠,形成更复杂的集成结构。

重要注意事项:在创建用于训练元模型的数据集时,必须使用验证集或通过交叉验证产生的样本外预测,绝不能使用基模型在自身训练集上的预测结果,否则会导致严重的数据泄露和过拟合。

进阶方法:AdaBoost 🌟

AdaBoost是一种自适应的Boosting算法,其核心思想是序列化地训练弱分类器,并调整训练样本的权重,使得后续分类器更关注之前被分错的样本。

算法流程简述

  1. 初始化权重:为训练集中的每个样本分配相同的初始权重。
  2. 迭代训练
    a. 训练弱分类器:基于当前样本权重,训练一个弱分类器(如决策树桩)。
    b. 计算误差率:计算该弱分类器在加权样本上的误差率 ε_t
    c. 计算分类器权重α_t = 0.5 * ln((1 - ε_t) / ε_t)。误差率越低,α_t 越大,该分类器在最终投票中话语权越重。
    d. 更新样本权重:增加被当前分类器分错样本的权重,减少分对样本的权重。这使得下一个分类器更关注难分的样本。
  3. 组合最终模型:将所有弱分类器按其权重 α_t 进行加权求和,得到强分类器。

AdaBoost的数学之美:其权重更新公式经过精心设计,可以简化为一个非常高效的操作:在每一轮迭代后,将所有被错误分类的样本的总权重调整为 1/2,所有被正确分类的样本的总权重也调整为 1/2。这使得算法计算效率极高,并且理论上有保证,其训练误差会以指数速率下降。

实践建议:可以直接使用 scikit-learn 中的 AdaBoostClassifierAdaBoostRegressor,并可以指定基学习器(默认为决策树桩)。

课程总结与展望 🧭

本节课中我们一起学习了如何优化机器学习作业的呈现、特征工程的基本思路,以及两种强大的集成学习方法:堆叠和AdaBoost。

回顾我们的量化交易学习路径:

  1. 数据获取与存储:数据的来源与管理。
  2. 特征工程:如何从原始数据中提取有意义的信号。
  3. 建模:应用机器学习模型进行预测。
  4. 集成学习:组合多个模型以提升鲁棒性和性能。

接下来,我们将离开纯机器学习的领域,进入策略构建阶段:

  • 策略与风控:当拥有一个预测能力不错的模型后,如何分配资金(仓位管理、凯利公式等)以最大化收益并控制风险。
  • 交易系统引擎:如何构建一个事件驱动的自动化交易系统,将数据、模型、策略和执行连接起来。
  • 案例研究:分析真实的量化交易论文和案例,从中获取特征工程和建模的灵感。

请记住,在量化交易实践中,持续的工作将主要围绕寻找新的有效特征开发更强大的预测模型展开。集成学习是你工具箱中必备的利器。

008:自然语言处理入门与事件驱动回测系统

概述

在本节课中,我们将学习两个核心内容。首先,我们将探讨如何利用自然语言处理技术对新闻文本进行情感或趋势分类,并应用于量化交易。其次,我们将深入理解并搭建一个基于事件驱动的量化交易回测系统框架,这是构建专业量化策略平台的基础。

第一部分:自然语言处理在量化中的应用

文本分类任务设定

在量化交易中,我们常常希望分析新闻文本对股价的影响。例如,给定一段新闻,我们希望模型能判断其对相关股票是看涨还是看跌。这本质上是一个分类问题

数据与标签的自动化构建

一个关键挑战是如何自动化地构建训练数据(即新闻文本X和涨跌标签Y)。一个有效的方法是利用新闻的时间戳:

  • 每一条新闻都有其发布时间。
  • 我们可以查看该新闻发布后一段时间内(例如未来1-5天)相关股票的价格走势。
  • 如果股价上涨,则将该新闻标记为“看涨”(Y=1);如果下跌,则标记为“看跌”(Y=0)。

通过这种方式,我们可以自动化地生成大量带标签的训练样本,尽管其中包含噪声,但在数据量足够大时,模型依然能够学习到有效的模式。

文本表示:词袋模型

机器学习模型需要数值输入,因此我们需要将文本(String)转化为数值向量。一个经典的方法是词袋模型配合One-Hot编码

以下是构建词袋模型的基本步骤:

  1. 分词:首先将中文新闻分割成独立的词语。可以使用jieba等分词工具。
    import jieba
    text = "今天上午市场表现强劲"
    word_list = jieba.lcut(text)  # 输出: ['今天', '上午', '市场', '表现', '强劲']
    
  2. 去除停用词:剔除“的”、“了”、“在”等常见但无实际意义的词语,以降低噪声和维度。
  3. 构建词典:统计整个语料库中所有不同的词语,为其分配一个唯一的ID,形成词典。假设词典大小为8000。
  4. One-Hot编码:对于一篇新闻,我们创建一个长度为8000的向量。如果词典中第i个词出现在这篇新闻中,则向量第i位的值为1,否则为0。这样,每篇新闻就被表示为一个稀疏的高维向量。

朴素贝叶斯分类器

有了文本的向量表示后,我们可以使用分类器。朴素贝叶斯是一个简单高效的文本分类模型,其核心是“条件独立性假设”。

模型公式
该模型假设在给定类别Y的条件下,文档中各个词的出现是相互独立的。因此,一篇文档属于某个类别Y=c的概率可以表示为:
P(X|Y=c) = P(x1|Y=c) * P(x2|Y=c) * ... * P(xn|Y=c)
其中,xi表示第i个词是否出现(0或1)。

训练与预测

  • 训练:从已标注的数据中,我们可以简单地通过计数来估计P(xi|Y=c)(例如,在“看涨”新闻中,“利好”这个词出现的频率)和P(Y=c)(看涨新闻的比例)。
  • 预测:对于一篇新新闻X_new,我们利用贝叶斯公式计算它属于每个类别的概率:
    P(Y=c|X_new) ∝ P(X_new|Y=c) * P(Y=c)
    选择概率最大的类别作为预测结果。由于分母P(X_new)对所有类别相同,在实际比较时可以忽略。

朴素贝叶斯模型参数少、训练快,在文本分类(如垃圾邮件过滤)任务上效果出色,是入门NLP应用的优秀选择。

深度学习方法简介

上一节我们介绍了基于词袋模型的传统方法,本节我们来看看更先进的深度学习模型。对于文本分类,深度学习的典型流程如下:

  1. 词向量:使用Word2VecGloVe等工具,将每个词映射为一个稠密的低维实数向量(如300维)。这比One-Hot编码能更好地捕捉语义信息。
  2. 文本矩阵:将一篇新闻中的每个词替换为其对应的词向量,按顺序排列,形成一个序列长度 × 词向量维度的矩阵。
  3. 模型构建:可以将这个矩阵视为一个“图像”,使用卷积神经网络进行处理(注意卷积核的宽度应覆盖整个词向量维度)。或者使用循环神经网络(如LSTM)来捕捉序列依赖关系。

深度学习方法通常需要更多的数据,但能学习到更复杂的特征表示,往往能获得更高的分类精度。


第二部分:事件驱动回测系统

策略绩效评估:夏普比率

在构建交易系统前,我们需要量化评估一个策略的好坏。除了总收益,还必须考虑风险。夏普比率是一个经典的风险调整后收益指标。

夏普比率公式
Sharpe Ratio = (E[Rp] - Rf) / σp
其中:

  • E[Rp]是策略的期望收益率。
  • Rf是无风险利率(如国债收益率)。
  • σp是策略收益率的波动率(标准差)。

夏普比率越高,说明单位风险所获得的超额回报越高,策略性能越优。

事件驱动引擎原理

一个健壮、易扩展的量化交易系统通常采用事件驱动架构。其核心是一个持续运行的事件循环。

伪代码逻辑

while True:
    # 获取新事件
    new_event = get_event()

    # 根据事件类型处理
    if new_event.type == "MARKET":  # 市场数据更新
        handle_market_event(new_event)
    elif new_event.type == "SIGNAL": # 策略产生信号
        handle_signal_event(new_event)
    elif new_event.type == "ORDER":  # 投资组合下单
        handle_order_event(new_event)
    elif new_event.type == "FILL":   # 订单成交
        handle_fill_event(new_event)

    # 如果事件队列已空,等待一段时间(心跳)
    if event_queue.is_empty():
        time.sleep(heartbeat_interval)

这种设计使得数据流、策略逻辑、订单执行和风险控制模块解耦,便于维护和扩展。

系统核心组件架构

一个简化的事件驱动回测系统包含以下核心类:

  1. DataHandler:负责所有与数据源的交互,包括历史数据的读取、实时数据的更新以及特征计算。这是策略所需数据的唯一入口。
  2. Strategy:策略类。它接收DataHandler提供的数据,运行模型(如机器学习模型或技术指标计算),并生成交易信号(例如:“买入”、“卖出”、“持有”)。
  3. Portfolio:投资组合管理类。这是系统的“大脑”。它接收Strategy发出的信号,结合当前持仓、资金情况以及风控规则,决定是否下单、下多少单。同时,它负责跟踪所有交易记录、计算实时盈亏和绩效指标(如夏普比率)。
  4. ExecutionHandler:订单执行类。在回测中,它模拟订单成交;在实盘中,它负责与真实的交易所或经纪商API对接,执行订单。
  5. Backtest:回测引擎类。它封装了上述所有组件,并包含了核心的事件循环,驱动整个回测过程按时间顺序推进。

工作流程
DataHandler提供市场数据(MARKET事件) -> Strategy处理数据并产生信号(SIGNAL事件) -> Portfolio处理信号,决定下单(生成ORDER事件) -> ExecutionHandler执行订单,返回成交结果(FILL事件) -> Portfolio更新持仓和资金。

如何使用该系统

对于使用者而言,最重要的任务是实现自己的Strategy类。你需要:

  1. 继承基础的Strategy抽象类。
  2. 实现calculate_signals方法,在这里编写你的策略逻辑。
  3. (可选)如果你的策略涉及机器学习模型,可以实现build_model等方法进行模型训练。

系统其他部分(DataHandler, Portfolio, Backtest)一旦搭建完成,通常不需要频繁修改。你只需要将自定义的Strategy实例传入回测引擎,即可运行回测并得到绩效报告。


总结

本节课我们一起学习了两个重要主题。

  1. 自然语言处理部分,我们掌握了如何将新闻文本转化为可用于机器学习的特征(词袋模型),并介绍了朴素贝叶斯这一高效的文本分类器,以及深度学习的应用思路。这为利用非结构化数据辅助交易决策奠定了基础。
  2. 事件驱动回测系统部分,我们理解了专业量化平台的架构设计哲学,学习了以事件循环为核心,由DataHandlerStrategyPortfolio等组件构成的系统框架。这为我们构建可维护、可扩展的个人量化交易系统提供了清晰的蓝图。

建议课后仔细研究提供的系统代码,并将自己的数据与策略集成进去,完成从理论到实践的跨越。

009:特征值、SVD与资产组合理论

概述

在本节课中,我们将学习线性代数中的核心概念——特征值与奇异值分解(SVD),并探讨它们如何应用于量化金融中的资产组合权重分配问题。我们将从数学定义出发,逐步推导,最终展示如何利用这些工具构建更优的投资组合。


特征值与特征向量:矩阵的本质

上一节我们回顾了课程安排。本节中,我们来看看如何用特征值和特征向量来刻画一个矩阵。

一个矩阵可以看作一个线性变换。对于一个 (n \times n) 的方阵 (A),它把一个 (n) 维向量 (x) 映射为另一个 (n) 维向量 (Ax)。

特征值和特征向量想解决的问题是:给定矩阵 (A),寻找一组特殊的向量 (x) 和标量 (\lambda),使得矩阵作用在该向量上,仅仅是对其进行缩放,而不改变其方向。用公式表示就是:
[
A x = \lambda x
]
其中,(x) 称为特征向量,(\lambda) 称为对应的特征值。

以下是求解特征值和特征向量的步骤:

  1. 将等式改写为:((A - \lambda I)x = 0)。
  2. 要使非零向量 (x) 满足此方程,矩阵 ((A - \lambda I)) 必须是不可逆的,即其行列式为零:
    [
    \det(A - \lambda I) = 0
    ]
  3. 解这个关于 (\lambda) 的 (n) 次方程,得到 (n) 个特征值(可能包含重根和复数)。
  4. 将每个特征值 (\lambda_i) 代回方程 ((A - \lambda_i I)x = 0),求解得到对应的特征向量 (x_i)。

对于一个 (n \times n) 矩阵,它有 (n) 个特征值。当特征值重复时,其对应的特征向量可能张成一个多维空间。


对称矩阵与对角化

上一节我们介绍了特征值的通用求法。本节中我们来看看一类性质特别好的矩阵——对称矩阵。

对称矩阵满足 (A = A^T)。它有两个非常重要的性质:

  1. 其特征值都是实数。
  2. 其不同特征值对应的特征向量是互相正交的。

对于任何可对角化的方阵 (A)(即其特征向量矩阵 (S) 可逆),我们可以将其分解为:
[
A = S \Sigma S^{-1}
]
其中,(\Sigma) 是由特征值构成的对角矩阵,(S) 的列是对应的特征向量。

对于对称矩阵,由于其特征向量正交,特征向量矩阵 (Q) 是正交矩阵((Q^{-1} = Q^T))。因此,对称矩阵的分解具有更优美的形式:
[
A = Q \Sigma Q^T
]
这个分解在数学和物理中极为重要。

这种分解的一个直接应用是快速计算矩阵的幂。例如:
[
A^k = (Q \Sigma QT)k = Q \Sigma^k Q^T
]
计算对角矩阵的 (k) 次幂非常高效。


奇异值分解:任意矩阵的终极武器

上一节我们讨论了对称矩阵的优美分解。本节中,我们将其推广到任意矩阵,这就是奇异值分解。

奇异值分解可以将任意 (m \times n) 实矩阵 (A) 分解为三个矩阵的乘积:
[
A = U \Sigma V^T
]
其中:

  • (U) 是一个 (m \times m) 的正交矩阵,其列向量称为左奇异向量。
  • (\Sigma) 是一个 (m \times n) 的矩形对角矩阵,对角线上的元素 (\sigma_i) 称为奇异值(非负,通常按从大到小排列)。
  • (V) 是一个 (n \times n) 的正交矩阵,其列向量称为右奇异向量。

SVD 的推导可以基于对称矩阵的特征分解。关键步骤是考虑 (A^TA) 和 (AA^T):

  • (A^TA) 是一个 (n \times n) 的对称半正定矩阵,其特征分解为 (V \Lambda V^T)。这里的 (V) 就是 SVD 中的 (V),且 (\Sigma) 中的奇异值 (\sigma_i = \sqrt{\lambda_i})。
  • 类似地,(AA^T) 的特征分解给出 (U)。

SVD 具有深刻的几何和统计意义。在统计学中,主成分分析本质上就是基于数据协方差矩阵(一个对称矩阵)的特征分解,而这与 SVD 紧密相关。


应用于量化金融:资产组合权重分配

上一节我们掌握了 SVD 这一强大工具。本节中,我们来看看如何将其应用于量化交易的核心问题之一——资产组合配置。

假设我们选择了 (n) 只股票,在时刻 (t),我们可以计算每只股票的收益率 (r_{it})。通过历史数据,我们可以计算出这 (n) 只股票收益率的协方差矩阵 (\Sigma)(一个 (n \times n) 的对称矩阵)。

我们的目标是决定一个投资权重向量 (w = (w_1, w_2, ..., w_n)^T),其中 (w_i) 表示投资于第 (i) 只股票的资金比例,且满足 (\sum_{i=1}^n w_i = 1)。

现代投资组合理论指出,该组合的风险(用方差衡量)可以表示为:
[
\text{Risk} = w^T \Sigma w
]

方法一:基于特征值的风险最小化

一个重要的结论是:使组合风险最小化的权重向量 (w),对应于协方差矩阵 (\Sigma) 的最小特征值所对应的特征向量(需归一化使权重之和为1)。即:
[
w^* \propto \text{eigenvector of } \Sigma \text{ corresponding to } \lambda_{\min}
]
在实际应用中,通常避免使用最小特征值对应的组合(它往往代表市场整体方向),而采用第二小或其他较小特征值对应的特征向量来构建“特征投资组合”。

方法二:约束优化法

将问题形式化为一个带约束的优化问题:
[
\min_w w^T \Sigma w \quad \text{subject to} \quad \sum_{i=1}^n w_i = 1
]
利用拉格朗日乘子法,可以解析求解得到最优权重:
[
w^* = \frac{\Sigma^{-1} \mathbf{1}}{\mathbf{1}^T \Sigma^{-1} \mathbf{1}}
]
其中 (\mathbf{1}) 是元素全为1的列向量。

方法三:基于随机矩阵理论的滤波法

协方差矩阵 (\Sigma) 中既包含真实的信号,也包含随机噪声。随机矩阵理论研究了纯随机矩阵特征值的分布(如 Marcenko-Pastur 分布)。我们可以利用这一理论对 (\Sigma) 进行滤波:

  1. 对历史数据计算出的样本协方差矩阵 (\Sigma) 进行特征分解。
  2. 将其特征值与随机矩阵理论预测的分布进行比较。将落在该分布典型区间(如均值附近一个标准差内)的特征值视为主要由噪声贡献,并将其置零。
  3. 用修改后的特征值和对应的特征向量重构一个新的、“去噪”后的协方差矩阵 (\tilde{\Sigma})。
  4. 将 (\tilde{\Sigma}) 代入上述方法一或方法二,计算最优权重 (w^*)。

研究表明,这种滤波方法能够有效提升投资组合在样本外的表现。


论文研读与行业实践要点

在掌握了核心理论后,阅读相关论文是学习的重要环节。以下是阅读论文的建议:

  • 关注重点:着重阅读引言和实验部分。弄清作者要解决什么问题,以及大致的解决框架和技术路线。技术细节初期可略过。
  • 保持批判:论文并非完美。要以批判性思维阅读,思考其方法的优点与不足,不要盲目相信任何结论。
  • 联系实际:将论文中的方法与我们所学的知识相联系,思考其本质。

关于行业求职与技能提升:

  • 知识体系:本课程搭建了一个骨架,你需要通过持续学习来填充血肉。建议深入学习线性代数、优化理论、金融学基础(如期权定价)等。
  • 实践工具:熟练掌握 Python(NumPy, Pandas)、深度学习框架(如 TensorFlow)、并行计算(GPU)等。
  • 求职准备:量化岗位面试常涉及数学、统计、编程和金融知识。可以进行模拟面试来准备。


总结

本节课我们一起学习了线性代数中特征值与奇异值分解的核心概念,并深入探讨了它们在现代投资组合理论中的应用。我们从特征值的定义出发,推导了对称矩阵的对角化和任意矩阵的 SVD,最后展示了如何利用协方差矩阵的特征分解来求解最优资产配置权重,并介绍了基于随机矩阵理论的滤波改进方法。理解这些数学工具与金融理论的结合,是构建系统化量化交易策略的重要基础。

010:课程回顾与未来规划 📚

在本节课中,我们将回顾过去十次课程的核心内容,分析几个量化交易案例,并为大家规划未来的学习路径与求职准备。

课程内容回顾 📝

上一节我们完成了所有核心知识的学习,本节中我们来系统回顾一下整个学习历程。

我们从第一节课开始,学习了以下完整的量化交易流程:

  1. 数据获取:首先学习了如何通过网络爬虫等技术获取金融数据。
  2. 数据清洗:在获得数据后,学习了如何对数据进行清洗和预处理,为后续分析做准备。
  3. 金融基础知识:在学习具体方法前,我们补充了必要的金融学基础知识,例如资本资产定价模型(CAPM)。
  4. 量化方法:我们学习了两种主要的量化方法:
    • 传统技术指标量化:例如移动平均线、动量指标等。
    • 机器学习方法:将机器学习模型应用于金融预测。
  5. 统一框架:我们将上述所有方法归结为一个统一的统计学习框架。无论使用金融模型、机器学习模型还是技术指标,其核心任务都可以归结为分类回归问题,区别在于决策原则(decision rule)不同。

在机器学习部分,我们深入学习了以下步骤:

  • 特征提取:从原始数据中提取有意义的特征,这是建模的第一步。
  • 模型建立:选择合适的算法建立预测模型。
  • 模型评估与选择:通过交叉验证等方法评估模型性能,并选择最优模型和超参数。
    • 模型参数:由算法从数据中学习得到,例如SVM中的权重向量 w
    • 超参数:需要预先设定,算法无法从数据中学习,例如SVM中的惩罚系数 C
  • 回测与风控:在历史数据上测试策略表现,并制定风险管理策略。

最后,我们将整个流程集成到一个小型系统中。通过总计约100小时的学习,大家掌握了量化交易从数据到策略的完整流程。然而,每个环节都有深入细化的空间,尤其是在建立机器学习模型时,需要与金融领域的专业知识相结合,这样才能构建出更精准有效的模型。

案例分析 📊

上一节我们回顾了知识体系,本节中我们来看看几个具体的量化案例,分析其优缺点。

以下是几个值得分析的案例:

  • 案例一:学术论文(SVM + 粒子滤波)
    • 简介:一篇2013年的论文,使用支持向量机(SVM)结合粒子滤波(Particle Filter)进行预测。
    • 优点:粒子滤波对时序数据有效。论文提供了模型和特征选择的思路。
    • 缺点:回测和策略评估部分存在不足。对于仅使用价格信息的策略,性能提升存在上限(“没有免费的午餐”定理)。此类研究更应关注其方法框架。
    • 建议:阅读此类论文时,重点关注其模型选择、特征工程以及解决问题的思路,对于细节不必过度深究,耗时建议不超过15分钟。

  • 案例二:个人博客(自动交易系统)

    • 简介:一位零售交易员分享自己构建的期货自动交易系统。
    • 优点:强调了系统鲁棒性的重要性,并展示了在自有系统上尝试多种模型的实践。对于想独立开发的交易者很有参考价值。
    • 建议:可以学习其系统构建的思路和持续迭代的方法。
  • 案例三:网络平台帖子(反面教材)

    • 问题1:使用SVR预测股票开盘价,但特征仅为前几日的价格,且未进行归一化处理。
      • 关键错误:特征工程过于简单,未引入技术指标;未进行特征归一化,导致模型对数据尺度敏感;更合理的做法是预测价格的变化率(delta),而非绝对价格。
    • 问题2:使用SVM进行30天后涨跌分类,但存在类别极端不平衡问题(例如“30天后上涨15%”的样本极少)。
      • 关键错误:未处理类别不平衡问题,直接使用默认参数的SVM会导致模型严重偏向多数类。正确的做法应包括调整类别权重、过采样/欠采样或调整决策阈值。
    • 问题3:在时序数据上随机打乱数据进行交叉验证。
      • 关键错误:这会导致“数据泄露”,即未来信息被用于训练预测过去的模型,使得回测结果过于乐观,不具备实际参考价值。时序数据必须按时间顺序划分训练集和测试集。
    • 总结:这些是初学者常犯的错误。大家在构建自己的策略时,应避免这些问题,并确保代码质量、模型评估和风险控制的严谨性。

  • 案例四:高质量开源项目(学习榜样)
    • 简介:一个基于Spark构建的开源量化交易系统,并配有详细的说明博客。
    • 优点
      1. 项目结构完整,代码开源在GitHub上。
      2. 博客详细阐述了关键设计思想。
      3. 使用了高频数据(如市场深度Order Book数据),特征工程更丰富。
      4. 整体流程规范,从特征提取到模型训练再到策略回测,形成了一个清晰的闭环。
    • 建议:此项目非常适合作为学习模板,大家可以研究其系统架构、代码实现以及如何将领域知识(金融)与工程技术(大数据、机器学习)结合。

未来学习路径与资源推荐 🛣️

掌握了基础并分析了案例后,接下来我们需要规划如何深化知识和技能。

基础知识补充

如果感觉数学、编程或金融基础有待加强,以下资源非常适合:

  • 金融学原理:耶鲁大学公开课《Financial Markets》。这门课能帮助你建立正确的金融思维框架。
  • 概率论:寻找以直觉和思维培养著称的课程(例如一位法国教授的课程),重在理解“何时以及为何”使用某种方法,而非死记公式。
  • 多变量微积分:MIT或同类高质量公开课,巩固数学基础。
  • 微分方程:有助于培养数学建模能力,在金融工程中应用广泛。
  • 编程入门:MIT《Introduction to Computer Science and Programming Using Python》(6.0001)。培养计算思维。
  • 编程进阶:斯坦福《Programming Paradigms》。学习C语言有助于写出更高效的Python代码,理解不同编程范式。
  • 线性代数:Gilbert Strang教授的课程,常看常新。
  • 量化交易专项:如华盛顿大学在Coursera上的《Machine Learning for Trading》系列课程,提供了另一个完整的量化学习体系,包含大量编程作业。

持续学习与信息获取

  • 跟踪前沿:关注新浪微博博主“爱可可-爱生活”,他每日整理分享机器学习领域的最新论文和资讯。重点阅读论文摘要,理解其“解决了什么问题”,以此建立自己的知识索引库。
  • 书籍推荐
    • 编程:《High Performance Python》、《Python Cookbook》。
    • 机器学习:《Python Machine Learning》、《Machine Learning for Hackers》、《图解机器学习》、《The Elements of Statistical Learning》(进阶)。
    • 金融与量化:《主动投资组合管理》(“小红书”)、《Python金融大数据分析》、《打开量化投资的黑箱》。

求职准备与个人品牌建设 💼

学习最终要应用于实践,无论是求职还是独立交易,都需要做好充分准备。

技术面试准备

机器学习相关岗位几乎必问的问题:

  • 如何理解与解决过拟合(Overfitting)?
  • 正则化(Regularization)的意义是什么?
  • 逻辑回归(Logistic Regression)的权重是如何学习出来的?(要求数学推导)
  • 随机梯度下降(SGD)的原理是什么?
  • 支持向量机(SVM)的原理与支持向量的意义?

回答时需结合具体模型和实例,并准备好应对面试官的深入追问。

非技术面试与简历

  • 行为面试:准备用STAR法则(Situation, Task, Action, Result)回答关于领导力、团队合作、失败经历等问题。在自我介绍中巧妙埋下“引子”,引导面试官提问你准备充分的方向。
  • 简历
    1. 维护一份详细的“主简历”(Master Resume),作为个人数据库。
    2. 针对不同岗位,从主简历中提取相关内容,定制化投递。
    3. 简历格式应专业、简洁、左对齐,合理使用项目符号(Bullet Points),用量化成果(如“提升性能XX%”)代替模糊描述。
    4. 附上GitHub、个人博客等链接。

打造个人品牌

在当今时代,线上个人品牌至关重要:

  1. GitHub:维护一个活跃的账号,包含高质量的开源项目或代码片段。头像、简介要专业。
  2. 技术博客:建立个人网站或使用GitHub Pages,定期分享原创技术文章。内容重于形式,确保在手机端阅读体验良好。
  3. 社交媒体:在新浪微博、知乎等平台积极进行有营养的原创分享或评论,吸引同好关注。可以将博客文章链接分享到微博,并@相关领域的大V。
  4. 持续输出:坚持写作和分享,这不仅是积累影响力的过程,更是倒逼自己深入学习、梳理知识体系的最佳方式。不要担心分享会“泄露秘诀”,初期的信任积累更重要。

课程总结 🎉

本节课中我们一起回顾了整个量化交易项目班的学习旅程。我们从数据爬取开始,历经数据清洗、金融基础、传统技术与机器学习方法,最终将整个流程集成到一个统一的框架和系统中。通过分析正反案例,我们明确了高质量量化策略应具备的要素。最后,我们为大家规划了未来的学习路径,并强调了在求职和个人发展中,夯实基础、持续学习以及用心经营个人品牌的重要性。

量化交易是一个将知识直接转化为价值的迷人领域。十次课程只是起点,希望大家以此为契机,保持学习的热情和习惯,在接下来的六个月乃至更长时间里,沿着自己规划的道路持续精进,成为更好的自己。课程有终点,学习无止境。感谢大家一路以来的坚持与信任,祝大家未来一切顺利!

posted @ 2026-03-26 13:11  布客飞龙IV  阅读(11)  评论(0)    收藏  举报