神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。神经网络用途极其广泛,本文采用神经网络算法用于金融领域量化选股策略。
第十篇:神经网络算法预测股价涨跌
导语:神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。神经网络用途极其广泛,本文采用神经网络算法用于金融领域量化选股策略。
神经网络原理
神经网络中最基本的成分是神经元模型,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。下图为M-P神经元模型:
在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。
理想中的激活函数是上图中的(a)阶跃函数,它将输入值映射为输出值“0”或“1”,显然“1”代表神经元兴奋,“0”代表神经元抑制,但由于其不连续,不光滑的性质,所以实际常用(b)Sigmoid函数作为激活函数。把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。
基于神经网络的量化选股策略
策略思想:选取一些常用技术指标作为训练样本特征集,对于类别,如果未来20个工作日上涨幅度超过10%则标记为1,否则为-1,采用神经网络算法进行训练,预测结果为1且未持仓则买入,预测结果为-1且已持仓则卖出。
特征因子选取:本文采用神经网络算法解决有监督学习的分类问题,特征因子选取了2015-01-05那天上证50指数成份股的总市值,OBV能量潮,市盈率,布林线,KDJ随机指标,RSI相对强弱指标共6个指标。
数据标准化:数据标准化方法有很多,本文采用高斯预处理方法,即每个特征因子减去它对应的均值再除以它的标准差((x-x.mean)/x.std)。
最终结果:
策略回测区间:2015.03.02-2018.12.31
回测频率:日级回测
回测资金:1000000
回测结果:红色曲线为策略收益率曲线,蓝色曲线为相应基准指数收益率曲线
策略源代码:
# 基于神经网络的量化选股策略
"""
策略思想:选取一些常用技术指标作为训练样本特征集,对于类别,如果未来
20个工作日上涨幅度超过5%则标记为1,否则为-1,采用神经网络算法
进行训练,预测结果为1且未持仓则买入,预测结果为-1且已持仓则卖出。
特征因子选取:本文采用神经网络算法解决有监督学习的分类问题,特征因子选
取了2015-01-05那天沪深300成份股的总市值,OBV能量潮,市盈率,布林线,
KDJ随机指标,RSI相对强弱指标共6个指标。
数据标准化:数据标准化方法有很多,本文采用高斯预处理方法,即每个特征因子
减去它对应的均值再除以它的标准差((x-x.mean)/x.std)。
初始资金:10000000
回测频率:每天
回测日期:2015-03-02 — 2018-12-31
"""
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.neural_network import BernoulliRBM
from sklearn.neural_network import MLPClassifier
def get_factor_data(stock_list, date):
#获取相应的因子值
q = query(
factor.symbol,
factor.zdzb,
factor.market_cap,
factor.obv,
factor.pe_ttm,
factor.boll,
factor.kdj,
factor.rsi
).filter(
factor.symbol.in_(stock_list),
factor.date == date
)
ans = get_factors(q)
return ans
def get_date_delta(current_date, delta):
#获取交易日日期
date = list(get_trade_days('20050101', '20221231').strftime('%Y-%m-%d'))
ans = date[date.index(current_date) + delta]
return ans
def create_data(date, delta, stock_list):
df = get_factor_data(stock_list, date)
#在df数据集上生成label(类别)列,涨幅超过10%标为1,反之为-1,注意lambda函数的应用
df['label'] = df['factor_symbol'].map(lambda x: 1 if get_price([x], start_date = date, end_date = get_date_delta(date, delta), fields = ['open'])[x].open[-1]/get_price([x], start_date = date, end_date = get_date_delta(date, delta), fields = ['open'])[x].open[0] - 1 >= 0.05 else -1)
df = df.dropna()
df = df.set_index('factor_symbol')
label = list(df['label'])
del(df['label'])
return df.values, label
# 初始化函数,全局只运行一次
def init(context):
# 基准日期选取2015-01-05,回测对象:沪深300成分股
context.date = '2015-01-05'
context.security = get_index_stocks('000016.SH', context.date)
set_benchmark('000016.SH')
# 获取训练集及类别
df, label = create_data(context.date, 20, context.security)
# 以下两行为数据标准化
context.scaler = preprocessing.StandardScaler().fit(df)
df_scaler = context.scaler.transform(df)
# 神经网络算法模型构建
context.clf = MLPClassifier(solver='lbfgs', alpha=1e-5,hidden_layer_sizes=(5, 2), random_state=1)
context.clf.fit(df_scaler, np.array(label))
## 开盘时运行函数
def handle_bar(context, bar_dict):
# 获取上个交易日日期
yesterday_date = get_last_datetime().strftime('%Y-%m-%d')
# 以下三行获取上个交易日的特征因子数据
factor_data = get_factor_data(context.security, yesterday_date)
result = factor_data['factor_symbol'].values
del(factor_data['factor_symbol'])
# 对预测值为1的股票都放入stocks_buy列表中
factor_data=factor_data.dropna()
stocks_buy = result[context.clf.predict(context.scaler.transform(factor_data.values)) == 1]
for stock in stocks_buy:
if stock not in context.portfolio.positions.keys():
log.info('buying %s' % stock)
order_value(stock, context.portfolio.available_cash / (len(stocks_buy)+1))
# 对预测值为-1的股票都放入stocks_buy列表中
stocks_sell = result[context.clf.predict(context.scaler.transform(factor_data.values)) == -1]
for stock in stocks_sell:
if stock in context.portfolio.positions.keys():
log.info('selling %s' % stock)
order_target(stock, 0)
查看以上策略详细请 到 supermind量化交易官网查看:财务分析建模 --神经网络算法预测股价涨跌