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、甚至深度学习;用更长的数据周期、或者不同市场数据试试看;加点风控,比如止损止盈、资金管理、仓位控制等等

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

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

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

相关推荐
SimonKing20 分钟前
集合的处理:JDK和Guava孰强孰弱?
java·后端·算法
Java微观世界24 分钟前
Java逻辑运算符完全指南:短路与、非短路或、异或的妙用,一篇搞定!
后端
星星电灯猴26 分钟前
数据差异的iOS性能调试:设备日志导出和iOS文件管理
后端
Ghostbaby31 分钟前
stack_traces 创建失败
后端
瀚海澜生32 分钟前
快速掌握使用redis分布式锁
后端
yz_518 Nemo44 分钟前
Django项目实战
后端·python·django
胖头鱼不吃鱼44 分钟前
Apipost 与 Apifox:API 协议功能扩展对比,满足多元开发需求
后端
coding随想1 小时前
对象、类、继承与多态:用“动物园”隐喻玩转OOP
后端
工呈士1 小时前
TCP 三次握手与四次挥手详解
前端·后端·面试
coding随想1 小时前
面向对象测试:软件质检员的“乐高四重奏
后端