Python小白入门量化交易:用机器学习预测股票涨跌(实操教学)

99%的普通人可能会想:机器学习是不是离我们很远?是不是得是数学系出身、懂AI才能搞?

其实啊,不用那么复杂!机器学习,说白了,就是让电脑自己学经验,帮你做判断。就像你小时候看多了猫狗的照片,后来不用人教也能一眼认出来,这就是人类的"学习"。电脑呢?也类似,也是看图学样子,慢慢从数据里"悟"出来一些规律。

今天花姐带你搞点实在的,用Python做一个分类模型 ,让它告诉我们:明天股市涨还是跌?该买还是该卖?


入门准备:你得会点啥?

在开始之前,有几个小前提,咱先说清楚。

你起码要:

  • 会用Python做点基本数据处理(不会也行,我代码写得很清楚)
  • 知道怎么拿到股票数据,比如用AKShare、tushare、baoStock
  • 最好对股票市场有点基础概念(但不强求)

如果你是完全0基础,也别慌,你可以收藏起来等你以后想学的时候再翻出来。


什么是机器学习?

简单说,它是这样一件事:

我们不再告诉电脑"你遇到什么情况该怎么做",而是------我们给它很多例子,它自己去总结规律。

举个例子:

以前如果要写个自动驾驶的程序,代码会这样写:

python 复制代码
if 遇到红灯:
    停车
if 遇到绿灯:
    行走
if 遇到黄灯:
    等一等

现在不需要这么麻烦了。你把几千张有红灯、绿灯、黄灯的照片扔给它,它自己学着分辨。

股票市场也一样------你不告诉它"哪个形态会涨",而是你喂给它历史数据,它自己去找规律。


分类模型是啥?

"分类"就是分门别类。电脑会看图说话,说:"这是涨的信号""这是跌的信号"。

这就像你教小朋友认识水果:圆的是苹果,长的是香蕉,带毛的是猕猴桃,教多了,孩子看到新水果也能猜个八九不离十。

在股票里,我们可以做很多分类:明天涨 or 跌(这就是二分类 );买 / 持有 / 卖(这是多分类 );极端行情 or 普通震荡(不平衡分类),今天我们先从最简单的二分类学起来。


来,建个模型预测明天涨不涨

第一步:把工具都请出来

先把用到的Python包安装下

bash 复制代码
pip install pandas numpy baostock matplotlib seaborn scikit-learn

pandas和numpy是用来处理数据的,baostock是用来获取股票行情的,matplotlib是画图的,seaborn是在matplotlib基础上封装的库,让画出来的图更美观,sklearn是用来做机器学习的,其中SVC 是支持向量机(Support Vector Classifier),一个分类模型。我们可以用它来判断股票明天是涨还是跌,属于"监督学习"的一类。accuracy_score用来评估模型效果的,比如模型预测得准不准,算个准确率出来,一看就知道行不行。

python 复制代码
import pandas as pd
import numpy as np
import baostock as bs
import matplotlib.pyplot as plt
import seaborn

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

第二步:下载沪深300指数行情

这里用沪深300指数来做演示,你也可以换成其它股票

python 复制代码
# 登陆系统
lg = bs.login()
if lg.error_code != '0':
    print("登录失败,错误信息:", lg.error_msg)
else:
    print("登录成功")

# 获取沪深300指数日线数据,代码是"sh.000300"
rs = bs.query_history_k_data_plus("sh.000300",
    "date,code,open,high,low,close,volume",
    start_date='2020-01-01', end_date='2025-06-10',
    frequency="d", adjustflag='3')  # '3'代表不复权

data_list = []
while (rs.error_code == '0') & rs.next():
    data_list.append(rs.get_row_data())

df = pd.DataFrame(data_list, columns=rs.fields)

# 登出
bs.logout()

# 转换为数字类型
for col in ['open', 'high', 'low', 'close', 'volume']:
    df[col] = df[col].astype(float)

df.close.plot(figsize=(10,5))
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负数乱码问题
plt.ylabel("沪深300 收盘价")
plt.show()

数据获取以后我们用plt绘制下收盘价走势图


第三步:明确"预测目标"

原始行情有了,接下来我们要通过程序来做标记,标记的内容为:

"明天会涨吗?"

代码是这么写的:

python 复制代码
y = np.where(df['close'].shift(-1) > df['close'], 1, -1)

这样我们会得到一个[-1 -1 1 ... 1 -1 -1]这样的数组,1表示明天会上涨,-1表示明天会下跌。


第四步:帮模型生成特征因子

到这一步,你可能在想:"模型怎么知道涨还是跌啊?凭感觉吗?"当然不是啦~我们得先喂给它一些线索,也就是------特征因子

其实特征因子嘛,说白了就是你"告诉模型看什么"的方式。能用的非常多,比如价格的变化(开盘、收盘、最高、最低)、技术指标(像RSI、MACD、布林带)、成交量的异动,甚至是某些衍生指标,比如过去几天的涨跌次数、震荡区间、强弱股排名等等。

聪明的你可能已经想到------"这些是不是都可以自己组合?"没错!这时候AI就能帮上大忙了。现在很多量化平台、甚至开源工具都可以帮你自动生成、组合和筛选因子

python 复制代码
df['open-close'] = df.open - df.close
df['high-low'] = df.high - df.low
df['ma5'] = df['close'].rolling(window=5).mean()  

df = df.dropna() #计算均线后会产生空值,这里把空值删除

X = df[['open-close', 'high-low','ma5']]

上面的代码我们用了3个最简单的特征:

  • 今开今收差值
  • 今高今低的波动幅度
  • 5日均线

生产环境下,请根据你自己的经验来设置


第五步:拆开数据,一部分训练,一部分测试

python 复制代码
split = int(0.8 * len(df))
X_train, y_train = X[:split], y[:split]
X_test, y_test = X[split:], y[split:]

这就像备战高考一样------通过3年的学习:看书、刷题(训练数据 train data);然后高考那天,碰上一堆没见过的新题(测试数据 test data),看看到底学得怎么样。


第六步:模型上线!

python 复制代码
cls = SVC().fit(X_train, y_train)

SVC,也就是支持向量机,处理这种简单的分类任务------它真的蛮好用的,入门首选。


第七步:效果到底咋样?看看分数先!

python 复制代码
accuracy_train = accuracy_score(y_train, cls.predict(X_train))
accuracy_test = accuracy_score(y_test, cls.predict(X_test))

print(f"\nTrain Accuracy: {accuracy_train*100:.2f}%")
print(f"Test Accuracy: {accuracy_test*100:.2f}%")

只要测试集 (Test Accuracy) 准确率超过50%,就已经打赢了"硬币交易者"😎


第八步:做点真实预测 + 模拟收益

python 复制代码
df['Predicted_Signal'] = 0
df['Predicted_Signal'].iloc[split:] = cls.predict(X_test)

df['Return'] = np.log(df.close.shift(-1) / df.close) * 100
df['Strategy_Return'] = df['Return'] * df['Predicted_Signal']

这个逻辑很实在:如果模型说"涨",我们就进场。回头看收益就知道对不对。


第九步:来,画个图,看赚钱没?

python 复制代码
df['Strategy_Return'].iloc[split:].cumsum().plot(figsize=(10,5))
plt.ylabel("Strategy Returns (%)")
plt.show()

这个图画出来,如果是一路向上,那你这策略就是"挣了"。

如果一地鸡毛......那也别伤心,至少你开始上手机器学习了!


花姐说

你可能会问:

花姐,这种模型真的能用吗?

我的回答是------它不能直接拿来上实盘

这只是一个最基础的机器学习分类模型,还有很多需要改进的地方,比如:多加点特征,像MACD、RSI、布林线、量比啥的;更换不同的分类模型,比如逻辑回归、随机森林、XGBoost、甚至深度学习;用更长的数据周期、或者不同市场数据试试看;加点风控,比如止损止盈、资金管理、仓位控制等等

一句话:不断试,不断错,不断调。机器学习就是个炼丹过程。

你可以大胆动手改代码,每动一次,也许就离一个稳定盈利的策略更近一步

祝你越学越有感觉,越投越上头,早日训练出属于自己的赚钱模型!

相关推荐
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
Cobyte5 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
小鸡吃米…6 小时前
机器学习的商业化变现
人工智能·机器学习
程序员侠客行6 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple6 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端
PP东7 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
invicinble7 小时前
springboot的核心实现机制原理
java·spring boot·后端
全栈老石7 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
space62123277 小时前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb