Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest we remove the splited content from the original combined chapter to keep everything clean and avoid redundancy. (It applies to other chapters as well.)

Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ Sigma、Citadel等都有内部项目研究用RL优化交易决策。不过,需

为简化演示,选择移动平均线交叉策略的思路:计算短期和长期的移动平均作为特征,当短期均线上穿长期均线时预示上涨(作为买入信号),反之下穿时预示下跌(卖出信号)。利用这些特征训练一个机器学习模型来预测明天股价相对于今天是涨还是跌。

首先,假设已经获取了股票的历史日线价格数据(例如通过pandas_datareader或其他数据源)。代码中用df表示包含日期索引和收盘价Close的DataFrame:
首先,假设已经获取了股票的历史日线价格数据(例如通过`pandas_datareader`或其他数据源)。代码中用df表示包含日期索引和收盘价Close的DataFrame:
```python
import pandas as pd
# df 为股票历史数据的 DataFrame,包含日期和收盘价 'Close'
Expand Down
12 changes: 6 additions & 6 deletions docs/02-数据是量化交易+人工智能的血液.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
成交量。这些数据本质上是结构化的,通常以时间序列的形式存储,每一行是一个时间戳(例如1天、1小时、1分钟),每一列是对应的价格与成交量数值。交易者和人工智能模型使用OHLCV数据来识别趋势和模式,例如用收盘价计算移动平均、波动率或动量因子,并将这些特征作为机器学习模型的输入变量。

### **2.2.1 Python 简单示例:使用结构化市场数据**
```
```python
import pandas as pd

# Load historical price data
Expand Down Expand Up @@ -92,7 +92,7 @@ LLMs在结构化数据中的新用途也值得一提。例如辅助特征分析

长期以来,金融新闻一直对市场影响深远,比如一则并购传闻、一次央行政策转向都可能引发剧烈波动。不同在于,如今人工智能系统能同时读取数百家媒体并在数毫秒内响应,大幅提升了时效性与覆盖面。情绪分析(Sentiment Analysis)是NLP在金融新闻中的核心应用,能判断文本的情绪是正面、负面还是中性。例如:"XYZ公司Q4利润创历史新高" 是正面的情绪;"XYZ被SEC调查涉嫌财务欺诈" 是负面的情绪。人工智能能将这些判断量化为情绪分数,作为交易信号的输入。例如:

```
```python
from transformers import pipeline

# Load a financial-domain sentiment analysis model (FinBERT)
Expand All @@ -117,7 +117,7 @@ print(result)

在社交网络时代,Twitter、Reddit、StockTwits 等平台成为投资讨论的主阵地,尤其是在散户力量集结的背景下(如 GameStop 事件)。社交媒体内容非结构化程度更高,语言更随意,情绪更极端,但也更前瞻性、情绪化、易激化。某股票讨论量突增,可能预示市场关注度飙升,情绪即将转向。例如Reddit上"GME"的提及量从日均100条暴增至20000条。与新闻一样,人工智能可对每条推文或评论进行情绪判定(Bullish / Bearish/Neutral)。不过社交平台语言非正式、含有大量俚语、表情、讽刺,因此,模型需特别训练才能识别"to the moon"、"diamond hands"等投资暗语,比如应用LLM,通过训练模型可以识别含蓄表达(如"这股看起来像沉船"实际是强烈看空)。下面是FinBERT可用于推文分类的简单示例:

```
```python
# Example tweets about a stock
tweets = [
"Big news for $XYZ, I'm going long!",
Expand Down Expand Up @@ -147,7 +147,7 @@ for text in tweets:
### **2.3.3 财报电话会议文字稿:管理层语言的深度挖掘**

公司管理层在财报电话会议中的讲话、回答,往往比数字本身更透露"真相",因为人工智能可从文本中提取语气分析(如积极词与消极词比例)、话题关注度(是否频繁提及"供应链"、"定价压力"等),和Q&A互动质量(是否回避问题、答复含糊)。例如FinBERT可以自动总结管理层观点、提取潜在风险信号,并比较不同季度的用词变化(如从"很有信心"变为"持谨慎乐观态度")。比如,
```
```python
# Load the earnings call transcript from a text file
transcript = open("ABC_Q2_2025_transcript.txt", "r", encoding="utf-8").read()

Expand Down Expand Up @@ -289,7 +289,7 @@ print(analysis)
HTML
中抓取表格。举个例子,有一家上市公司2021年和2022年的净利润数据存于CSV表格中,可以用
Pandas 进行读取和计算增长率:
```
```python
import pandas as pd

# Example: Load net profit data from a financial statement
Expand Down Expand Up @@ -368,7 +368,7 @@ Year  NetProfit   YoY     Growth%

这段文本的结构化信息(净利润及增速)和非结构化信息(管理层的态度)混杂在一起。传统方法下,可能需要先用正则表达式提取出"同比增长138%"这个数字,然后定义一个情感词典来判断"充满信心"表示乐观。但现在,可以直接借助 GPT
API 进行处理。例如,通过如下伪代码调用模型:
```
```python
import openai

# Set your OpenAI API key
Expand Down
52 changes: 26 additions & 26 deletions docs/03-情感分析可以作为量化交易的因子吗.md

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions docs/04-量化交易中的机器学习.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ $$Q\left( s_{t},a_{t} \right) \leftarrow Q\left( s_{t},a_{t} \right) + \alpha\le

下面的代码演示了如何使用scikit-learn训练一个简单的分类模型(例如SVM)来预测交易信号。首先模拟生成一些历史价格数据及技术指标,然后用前80%的数据训练模型、后20%数据测试模型,预测价格上涨(1)或下跌(0)的信号。虽然这是一个toy
example(随机生成的数据不包含真实模式),但流程与实际类似。
```
```python
import numpy as np
from sklearn.svm import SVC

Expand Down Expand Up @@ -221,7 +221,7 @@ print("Predicted signals:", y_pred[:5])
print("Actual signals: ", y_test[:5])
```
在这个示例中,没有追求高预测准确率(因为数据是随机的,模型无法学到真正有效的交易策略),但展示了基本步骤:准备数据、提取特征、训练模型、输出预测信号。实际应用中,可以将特征替换为技术指标、基本面因子等真实数据,将上述分类过程用于判断"明日是否上涨",或回归预测"明日回报率"等。
```
```python
from datetime import datetime, timedelta

import numpy as np
Expand Down Expand Up @@ -543,7 +543,7 @@ if __name__ == "__main__":
main()
```
输出:
```
```python
Model Training and Evaluation Summary

Dataset:
Expand Down Expand Up @@ -651,7 +651,7 @@ stopping)策略,如果验证集指标在若干迭代后不再提升,则停

Python
实战示例:以下示例代码演示了从金融时间序列构建特征并训练模型的过程。模拟生成一份股票价格数据,然后计算技术指标作为特征,进行数据预处理,最后训练一个随机森林模型来预测下一日涨跌。
```
```python
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
Expand Down Expand Up @@ -827,7 +827,7 @@ $$R = \frac{E\left\lbrack R_{p} - R_{b} \right\rbrack}{\sigma_{p - b}}$$
在评价模型的交易性能时,应综合考虑收益-风险权衡。高收益率的策略如果伴随极高的回撤和波动,未必是投资者能接受的。同样,风险极低但几乎无收益的策略意义也不大。夏普比率、信息比率帮助平衡收益和波动风险,而最大回撤关注极端风险场景下损失幅度。通常,一个稳健的策略应当在这些指标上都有不错的表现。

假设已经有一个策略的每日收益率列表(例如通过回测得到模型产生的交易信号下每天投资组合的涨跌幅)。可以用Python计算上述评估指标。下面的代码生成一组模拟的每日收益率,并计算年化收益率、夏普比率和最大回撤:
```
```python
import numpy as np

# 1) Simulate one year of daily returns (252 trading days)
Expand Down Expand Up @@ -856,7 +856,7 @@ print(f"Sharpe Ratio: {sharpe_ratio:.2f}")
print(f"Max Drawdown: {max_drawdown:.2%}")
```
示例输出:
```
```python
Annualized Return: 21.22%

Sharpe Ratio: 1.30
Expand Down Expand Up @@ -1013,7 +1013,7 @@ $$\max_{a'}{Q\left( s^{'},a^{'} \right)}$$
**1. 获取历史行情数据**

使用yfinance库获取苹果公司2015年至2020年的历史日线价格数据,包括调整收盘价(考虑分红拆股)。这相当于的训练+测试数据。
```
```python
import yfinance as yf
import pandas as pd

Expand Down Expand Up @@ -1056,7 +1056,7 @@ Date        Adj Close
将使用历史价格序列本身作为特征,通过一个LSTM来预测未来价格。具体做法是构建一个滑动窗口数据集:用前面的价格序列去预测下一个时刻的价格。例如取过去10天的价格序列作为输入特征,预测第11天的价格。这实际上是一种序列到序列的回归问题。预测目标可以是价格本身,或者简化为收益率/涨跌方向。在此案例中直接预测明日的价格,然后通过比较预测价和今日价来制定交易信号。

先将价格序列做归一化(使用Min-Max缩放到$\lbrack 0,1\rbrack$),以便LSTM训练更稳定。然后按照窗口长度切分数据。
```
```python
import numpy as np
from sklearn.preprocessing import MinMaxScaler

Expand Down Expand Up @@ -1093,7 +1093,7 @@ print("Training samples:", X_train.shape[0],
**3. 构建并训练LSTM模型**

使用TensorFlow/Keras定义一个简单的LSTM网络。模型结构包括一层具有50个单元的LSTM层(输入维度是10天×1特征),接一个Dense全连接层输出单个值(预测下一天的价格)。使用均方误差(MSE)作为损失函数,Adam优化器训练模型5个epoch。
```
```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

Expand Down Expand Up @@ -1127,7 +1127,7 @@ model.fit(

在测试集上让模型预测下一天价格,然后将预测值逆归一化还原为实际价格。一个简单的交易策略是:如果模型预测明天价格高于今天收盘价,则买入并持有一天,否则空仓。这样的日收益率就等于:如果信号=买入,则收益=(明日收盘价/今日收盘价)
−1(明日收盘价/今日收盘价)-1(明日收盘价/今日收盘价)−1,如果信号=空仓则收益=0(假设空仓时资金持有现金无收益)。为简化,不考虑做空,如果要做空则当预测价格下跌时可以获得相应收益。
```
```python
import numpy as np
import pandas as pd

Expand Down Expand Up @@ -1176,7 +1176,7 @@ strategy_returns.head(), strategy_returns.describe()
**5. 策略绩效评估**

最后,可以像第3节介绍的那样计算策略在测试集期间的表现。例如计算累计收益、年化收益率、夏普比率和最大回撤:
```
```python
import numpy as np
import pandas as pd

Expand Down
24 changes: 12 additions & 12 deletions docs/05-量化实战不尽如意吗.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
本节通过两个简化的代码示例,直观演示策略"回测有效但实盘失效"的过程。第一个示例展示过拟合如何导致过度理想化的回测成绩,第二个示例模拟LLM提示词输出漂移如何影响情绪因子的有效性。代码采用Python伪代码风格,读者可根据注释理解其逻辑。

示例1:过拟合策略的回测辉煌与实盘落寞
```
```python
import numpy as np
from sklearn.tree import DecisionTreeClassifier

Expand Down Expand Up @@ -122,7 +122,7 @@ print(f"Test accuracy: {test_accuracy:.2f}")
如上所示,模型在训练集上达到100%准确率,说明它完全记忆了历史噪声模式,在回测中可以做到"择涨杀跌,笔笔盈利"。然而在全新的测试集(模拟实盘数据)上,准确率仅约50%,与随机猜测差不多。这意味着模型并未学到任何可泛化的规律,只是在"蒙圈"。如果将此模型用于交易,回测时会显示惊人的盈利,而实盘几乎等同于抛硬币。

示例2:LLM提示词变化导致情绪因子失效
```
```python
import numpy as np

# 1) Simulate the "true" relationship between sentiment and daily returns
Expand Down Expand Up @@ -273,7 +273,7 @@ ingest

下面给出一个简化的Python代码示例,演示如何将LLM提取的特征与传统量化因子进行融合,并用于模型训练。假设有一组股票样本,每个样本包含一段相关文本(例如新闻摘要)和若干传统数值因子,希望利用LLM将文本转化为嵌入向量特征,并与数值因子一起输入机器学习模型。代码使用了常用的pandas、numpy、xgboost等库。(注意:真实场景下应使用经过训练的大模型API或本地模型获取文本嵌入,这里为了演示简化了这一步骤。)

```
```python
import numpy as np
import xgboost as xgb

Expand Down Expand Up @@ -526,7 +526,7 @@ EDGAR下载的10-K文件需要剔除HTML标签、表格等保留正文文本。
大型语言模型(LLM)为文本因子的开发提供了强大的工具。可以方便地对文本进行情感分析、主题归类、事件提取等任务,而无需从零训练专门的模型。下面通过一个示例代码片段,演示如何使用
API从文本中提取情绪特征并将其转化为量化因子。

```
```python
import os
import json
from openai import OpenAI
Expand Down Expand Up @@ -736,7 +736,7 @@ DistilRoBERTa 模型在情感分类上准确率可高达

下列代码展示了如何使用 Python 的情感分析工具对新闻文本打分。例如使用
nltk 库中的 VADER 情绪分析器对一句新闻生成情绪得分:
```
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

Expand All @@ -759,7 +759,7 @@ print("Compound sentiment score:", scores["compound"])
-0.85,表明这则新闻整体情绪极为负面(CEO"意外辞职"且伴随"财务丑闻"属重大利空)。类似地,可以批量处理新闻标题或正文,得到每条消息的情绪分数。对于更复杂的分析,可以使用
Hugging Face 的transformers库加载预训练的金融情绪模型,例如:

```
```python
from transformers import pipeline

# Initialize a finance-domain sentiment classifier (FinBERT)
Expand Down Expand Up @@ -788,7 +788,7 @@ print(result)
首先获取某股票的历史数据和对应期间的新闻情绪。假设使用yfinance获取股票收盘价,并假设通过上述方法得到了每日新闻情绪得分(范围-1到
1,正数表示偏好):

```
```python
import yfinance as yf
import pandas as pd
import numpy as np
Expand Down Expand Up @@ -896,7 +896,7 @@ print(price_df[["Close", "return", "sentiment"]].head())

下面拿cpu和gpu做一个简单的算力对比:

```
```python
import time
import torch
import torch.nn as nn
Expand Down Expand Up @@ -1234,12 +1234,12 @@ Learning)提供了端到端的机器学习开发和部署解决方案,帮助
1.安装必要的库,在你的虚拟环境中安装 TensorFlow 和 Cloud TPU
客户端库:

```
```python
pip install tensorflow cloud-tpu-client
```

2.设置 TPU,在你的 Python 脚本中,设置 TPU 地址:
```
```python
import tensorflow as tf

# 1) Create a TPU cluster resolver
Expand All @@ -1263,7 +1263,7 @@ print("Number of TPU replicas:", strategy.num_replicas_in_sync)

3.定义模型和数据,使用 TensorFlow 定义一个简单的神经网络模型和数据集:

```
```python
import tensorflow as tf
from tensorflow.keras.datasets import mnist

Expand Down Expand Up @@ -1342,7 +1342,7 @@ model.evaluate(x_test, y_test, verbose=1)
运行此代码后,读者可以看到在 TPU
上训练模型的速度和性能。输出结果将类似于:

```
```python
Epoch 1/5 60000/60000 \[==============================\] - 12s
200us/step - loss: 0.2994 - accuracy: 0.9125

Expand Down
6 changes: 3 additions & 3 deletions docs/06-端事件下人工智能模型的抗风险能力.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
提高再训练效率的一个重要技术是滑动窗口训练。即使用最近一段时间的数据(例如过去N天)作为训练集,不断向前滑动更新模型。这种方法确保模型主要关注最新的市场特征,同时因窗口限制而逐渐"遗忘"较久远的旧数据,从而适应局部非平稳的环境。例如,可以每周用过去3个月的滚动数据重新训练一次模型参数,这样当市场进入新的季度或出现新趋势时,模型会在几次滚动训练后基本完成自我更新。

下面的代码演示了一个简单的滑动窗口再训练思路。假设有一个回归模型用于预测明日收益率,使用固定长度的最近窗口来训练模型,然后逐日向前推进窗口并更新模型:
```
```python
import numpy as np
from sklearn.linear_model import SGDRegressor

Expand Down Expand Up @@ -175,7 +175,7 @@ for t in range(window_size, len(X)):
实现动态阈值调整需要配合异常检测(Anomaly
Detection)机制。异常检测的目的在于及时发现市场或模型输出的异常状况。例如,可以对价格或收益率序列进行统计监测,当单日变化超过平日3个标准差时标记为异常;或者监控模型预测误差的控制图,一旦误差分布偏离训练期水平则触发警报。一旦检测到异常,系统即可执行一系列预设的缓释动作:包括上面提到的提高信号阈值、削减头寸、冻结模型某些输出,甚至切换到备份策略等。下面的代码示例演示了一个简单的异常检测过程,基于滑动窗口统计来发现价格序列中的异常点,并在异常发生时调整阈值:

```
```python
import numpy as np

# ---------------------------------------------------------
Expand Down Expand Up @@ -355,7 +355,7 @@ LLM能够综览全局,从一系列相关报道中看出趋势。例如多家

下面为演示LLM如何对突发新闻做出反应调整波动率预测,构造一个简单示例。假设有一系列当天的新闻头条,将用规则代理LLM来判断哪些属于"突发事件"(显著影响市场的意外新闻),并据此调高预期波动率:

```
```python
headlines = [
"Central bank unexpectedly raises interest rates by 50 bps.",
"Company XYZ reports earnings in line with expectations.",
Expand Down
Loading