学习了一段时间python代码,对金融知识也有了一定的沉淀,那就开始进入AI金融实战吧!今天给大家介绍一下大盘指数的预测。

程序功能如下
- 通过Tushare 接口,获取大盘指数数据。
- 从开盘价、收盘价、最高价、最低价、成交量、成交金额等指标选取相关特征
- 选择模型,评估模型准确度
下面就开始分析解读代码了。有感兴趣的可以自己去跑跑试试,有问题的话欢迎留言交流。
第一部分:获取大盘指数数据
这次的研究对象是上证指数(000001.SH),采用的接口是Tushare,非常好用的一个接口。注册之后,申请一下口令(set_token),就可以调用Tushare的股票数据API接口了。

#!/usr/bin/python
# -*- coding: utf-8 -*-
""" 获取指数数据"""
import tushare as ts
import pandas as pd
ts.set_token('3d74e171f2af452cd*******************95bcc6d7b1759ce')
pro = ts.pro_api()
#查询当前所有正常上市交易的股票列表
index_data = pro.index_daily(ts_code='000001.SH', start_date='20180101', end_date='20181227')
index_data['trade_date'] = index_data.trade_date.apply(lambda x: pd.to_datetime(x))
其中: pro.index_daily,获取指数数据的接口,输入参数(指标编码,开始时间,结束时间);pd.to_datetime,可以将文本时间戳转换为时间格式。
第二部分:获取大盘涨跌相关特征
本文仅是通过对时间和大盘的开盘价、收盘价、最高价、最低价、成交量、成交金额等指标处理,获得大盘涨跌特征,后续这块可以慢慢扩充特征。
"""特征获取"""
def get_prev_days(x, quota, n_days):
'''计算前几日指标函数'''
pday = pd.Timedelta('1 day')
try:
lo = index_data[index_data.trade_date == x - n_days*pday][quota].values[0]
except:
lo = index_data[index_data.trade_date == x][quota].values[0]
return lo
#获取指数相关特征
index_data['dow'] = index_data.trade_date.apply(lambda x: x.dayofweek)
index_data['doy'] = index_data.trade_date.apply(lambda x: x.dayofyear)
index_data['day'] = index_data.trade_date.apply(lambda x: x.day)
index_data['month'] = index_data.trade_date.apply(lambda x: x.month)
index_data['close_B1D'] = index_data.trade_date.apply(get_prev_days, args=('close', 1,))
index_data['close_B2D'] = index_data.trade_date.apply(get_prev_days, args=('close', 2,))
index_data['open_B1D'] = index_data.trade_date.apply(get_prev_days, args=('open', 1,))
index_data['open_B2D'] = index_data.trade_date.apply(get_prev_days, args=('open', 2,))
index_data['high_B1D'] = index_data.trade_date.apply(get_prev_days, args=('high', 1,))
index_data['high_B2D'] = index_data.trade_date.apply(get_prev_days, args=('high', 2,))
index_data['low_B1D'] = index_data.trade_date.apply(get_prev_days, args=('low', 1,))
index_data['low_B2D'] = index_data.trade_date.apply(get_prev_days, args=('low', 2,))
index_data['vol_B1D'] = index_data.trade_date.apply(get_prev_days, args=('vol', 1,))
index_data['vol_B2D'] = index_data.trade_date.apply(get_prev_days, args=('vol', 2,))
index_data['amount_B1D'] = index_data.trade_date.apply(get_prev_days, args=('amount', 1,))
index_data['amount_B2D'] = index_data.trade_date.apply(get_prev_days, args=('amount', 2,))
index_data['up_or_dowm'] = index_data['close'] >= index_data['close_B1D']
#模型数据选取
x = index_data[['dow', 'doy', 'day', 'month', 'close_B1D', 'close_B2D', 'open_B1D', 'open_B2D',
'high_B1D', 'high_B2D', 'low_B1D', 'low_B2D', 'vol_B1D', 'vol_B2D', 'amount_B1D', 'amount_B2D']]
y = index_data['up_or_dowm']
时间相关特征:
- `dow`: 一个星期中的第几天 (integer 0-6);
- `doy`: 一年中的第几天 (integer 0-365);
- `day`: 一月中的第几天 (integer 1-31);
- `woy`: 一年中第几周 (integer 1-52);
- `month`: 一年中第几月(integer 1-12)。
大盘指标相关特征:
- 'close_B1D' : 前一天收盘价
- 'close_B2D' : 前两天收盘价
- 'open_B1D' : 前一天开盘价
- 'open_B2D' : 前两天开盘价
- 'high_B1D' : 前一天最高价
- 'high_B2D' : 前两天最高价
- 'low_B1D' : 前一天最低价
- 'low_B2D' : 前两天最低价
- 'vol_B1D' : 前一天成交量
- 'vol_B2D' : 前两天成交量
- 'amount_B1D' : 前一天成交金额
- 'amount_B2D' : 前两天成交金额
预测目标:up_or_dowm(大盘涨跌)
第三模型评估及最佳模型选取

- 首先使用sklearn.model_selection中的train_test_split对数据进行训练、测试划分,再通过 sklearn.preprocessing 中StandardScaler 进行归一化处理。
- 第二,列举分类模型,主要包括集成方法类、广义线性分类器、K近邻分类器、
- 第三,迭代运行模型,获取每种模型的准确的指标。
"""划分测试数据和训练数据"""
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)
"""数据归一化"""
from sklearn.preprocessing import StandardScaler
ss_x = StandardScaler() #初始化标准化器
x_train = ss_x.fit_transform(x_train)
x_test = ss_x.transform(x_test)
""" 模型筛选"""
# 集成方法分类器
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier
# 广义线性分类器
from sklearn.linear_model import PassiveAggressiveClassifier
from sklearn.linear_model import RidgeClassifier
from sklearn.linear_model import SGDClassifier
# K近邻分类器
from sklearn.neighbors import KNeighborsClassifier
#朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
# 神经网络分类器
from sklearn.neural_network import MLPClassifier
# 决策树分类器
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import ExtraTreeClassifier
# 支持向量机分类器
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
# 建立模型
model = [
AdaBoostClassifier(),
BaggingClassifier(),
ExtraTreesClassifier(),
GradientBoostingClassifier(),
RandomForestClassifier(),
PassiveAggressiveClassifier(),
RidgeClassifier(),
SGDClassifier(),
KNeighborsClassifier(),
GaussianNB(),
MLPClassifier(),
DecisionTreeClassifier(),
ExtraTreeClassifier(),
SVC(),
LinearSVC()
]
# 依次为模型命名
classifier_Names = ['AdaBoost', 'Bagging', 'ExtraTrees', 'GradientBoosting', 'RandomForest',
'PassiveAggressive', 'Ridge', 'SGD', 'KNeighbors',
'GaussianNB', 'MLP', 'DecisionTree', 'ExtraTree', 'SVC', 'LinearSVC']
model_score = []
# 迭代模型
from sklearn.metrics import accuracy_score # 导入准确度评估模块
best_score = 0
for name, clf in zip(classifier_Names, model):
clf.fit(x_train, y_train) # 训练模型
pre_labels = clf.predict(x_test) # 模型预测
score = round(accuracy_score(y_test, pre_labels)*100, 2) # 计算预测准确度
#print('%s:%.2f' % (best_score, score))
if best_score <= score:
best_score = score
best_model = clf
model_score.append([name, score])
print('%s:%.2f' % (name, score)) # 输出模型准确度
划分训练和测试数据,本来一开始是用sklearn.cross_validation 这个方法,升级后方法就变为sklearn.model_selection,大家注意一下。
模型指标数据结果如下,后续会逐一介绍这些算法:
- AdaBoost:63.75
- Bagging:66.25
- ExtraTrees:60.00
- GradientBoosting:65.00
- RandomForest:58.75
- PassiveAggressive:55.00
- Ridge:62.50
- SGD:58.75
- KNeighbors:61.25
- GaussianNB:67.50
- MLP:65.00
- DecisionTree:61.25
- ExtraTree:48.75
- SVC:66.25
- LinearSVC:65.00
输出最佳模型模型
print('最好的模型是{},模型得分:{}'.format(best_model, best_score))
- 最好的模型是GaussianNB,模型得分:67.5