同花顺Supermind量化交易 财务分析建模 --神经网络算法预测股价涨跌

文章介绍了如何使用神经网络算法,特别是Sigmoid函数,对金融领域的量化选股策略进行建模。通过选取技术指标作为特征,对股票未来涨跌进行预测,如上证50或沪深300成分股,进行买入和卖出操作。策略应用了数据标准化方法来优化模型性能。
摘要由CSDN通过智能技术生成

神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。神经网络用途极其广泛,本文采用神经网络算法用于金融领域量化选股策略。

第十篇:神经网络算法预测股价涨跌

导语:神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。神经网络用途极其广泛,本文采用神经网络算法用于金融领域量化选股策略。

神经网络原理

  神经网络中最基本的成分是神经元模型,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。下图为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量化交易官网查看:财务分析建模 --神经网络算法预测股价涨跌

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值