毕业设计-基于 BP 神经网络企业财务模型优化分析 -MATLAB

目录

前言

课题背景和意义

实现技术思路

一、模型构建理论

二、基于 MATLAB 的 BP 神经网络模型构建

三、模型运行实证研究分析

部分源代码

 实现效果图样例

最后


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯基于 BP 神经网络企业财务模型优化分析 -MATLAB 

课题背景和意义

企业财务管理是整个企业资金运行控制中心,其运行状况与整个企业运转密切相关,随着经济一体化不断发展,企业经营过程中存在的不确定性逐渐增强,在此基础上导致的财务风险不断增多,因此需要对财务管理进行有效管理,降低财务困境出现的可能性。大数据背景下需要通过计算机技术对企业财务管理进行仿真分析,建立企业财务模型,在其运行过程中对企业未来财务运行多种情况进行综合性分析,并制定对应预警措施,降低企业未来运转过程中可能存在的风险。优化企业财务结构的作用在于:企业财务结构与财务状况直接相关,不仅影响企业的成本和价值,还影响企业的治理结构。优化财务结构不仅能提升综合竞争力和投资价值,还能增强企业投资者的信心。企业的财务结构涉及到企业的资金投资、筹资、经营和利润分配等环节,是反映企业资金实力、衡量企业财务风险和进行筹资决策的重要依据。不同的财务结构对企业的财务状况会造成不同的影响,进而影响企业的经营业绩。因此,企业应该寻求途径以优化自身的资金财务结构,完善公司治理结构,进而提高企业经营业绩,推动宏观经济快速健康发展。

实现技术思路

一、模型构建理论

BP 神经网络是一种智能化算法,其结构一般包括三层或以上的网络结构,层与层之间通过神经元实行权相连,即该结构中所有单元与上层单元均实现连接,而每层各神经元之间并无相互连接。 通过 BP 神经网络可实现对所有问题的游侠训练,在实际运行过程中向网络中输入样本,通过一定算法对其进行训练处理,求解对应问题。 为当前使用最为广泛的网络结构,其结构部分主要包括输入层 输出层 隐层构成,其中输入层和输出层分别代表样本输入和结果输出,隐层可以是一层,也可是多层。

 

通过 BP 神经网络对企业财务模型的运行过程进行分析,系统实际运行流程步骤如下:
步骤一: 首先对其网络权值以及阈值等进行初始化处理
步骤二: 计算出参数总误差,其计算公式可表达为:
其中,E 表示的是误差值,Ek 表示第 k 项误差,ykj 表示的是对应 j 输出层节点对第 k 个样本的期望输出,y' ki 表 示的则是节点 j 对应的实际输出
步骤三: 取一个样本作为网络输入,将其按照公式 进行数据处理
按照输入到输出的顺序进行所有连接权值 w ij 的修正处理,可将该过程表示为

 

 

对于不同节点而言,在其输出侧有连接的节点个数,在神经网络算法中通过 δ j 表示节点 j 的误差,其在计算过程中主要由于算法在实际运行过程中需进行下述步骤:
将E k /aj 表示为 δj ,并且在实际计算过程中,当 j 表示其输出节点时有:

 

 当其为中间节点时,可将其表示为:

 

上述算式中 E k 其本质表示的是权值函数,即是将误差函数最小化,模型中采用梯度下降法进行权值调整,即 BP 神经网络在处理数据以及自适应学习过程中主要通过一 种非线性优化方式进行数据处理。

二、基于 MATLAB BP 神经网络模型构建

构建模型
企业财务模型如图 所示,在实际运行过程将样本输入到系统中,样本主要来自于企业经营过程中的各项财务报表,所有与财务相关的信息均可作为样本,并可将该系统连接至互联网,通过数据挖掘获取最新市场信息,均可将这些信息作为企业财务模型决策的依据。

本系统在构建过程中主要设定以下参数:

财务管理系统的软件开发的硬件环境,是通过应用服务器 数据库服务器和高性能的 PC 组成一个 B /S 的三层架构方式,同时通过路由器建立企业内部的局域网。
系统平台财务管理系统采取的三层体系架构,是基于 J2EE web 的服务器平台
拓扑结构
网络拓扑结构的设计主要包括隐层数 隐层节点数及输入输出层节点数的确定 在构建网络拓扑结构过程中采用 3 层网络结构,结构中仅仅含有一个隐层 该结构中输入输出层节点数主要由财务模型问题决定 构建的 BP 神经网络企业财务模型如图:

 企业财务网络功能层次模型如图所示,该模型主要由3 个层次构成,该结构在处理企业财务数据过程中具有较高效率,并且可实现对众多数据的有效分析,以上网络层次可有效提升整个系统运行效率,尤其是在数据训练过程中可有效减少单个周期的循环时间,在指定时间内完成相应训练。

 数据库结构

系统中的数据库主要采用 Oracle 系统作为基础,数据库中的数据需经过中间层处理,用户可通过数据库对各种数据进行访问和存储,其余财务管理所有数据均可存储于数据库中。
如图所示,在数据库结构中可与用户终端连接起来,为用户提供多种财务管理服务方案,并且在实际分析过程中还可结合用户访问系统的历史生成管理日志,结合 BP 神经网络进行数据训练,并结合 Web 进一步提升数据训练效果。

 

基于 MATLAB 的企业财务模型仿真
MATLAB 中的数据类型一般表示为矩阵形式,其本质是一种数学软件,可通过数学表达方式将各种数据表达出来,具有简化数据运算过程的优点。 尤其是在重复结算数据方面具有无可比拟的优点。在数据处理过程中对不同神经元进行训练处理,结合共轭梯度对隐单元个数的求解,可将其表示为:

 

在系统运行过程中需要对算法进行修正,本研究选择 δ 学习规则,主要运行步骤如下:
步骤一: 设定一组数据初始权值 w ij ( 0 ) ;
步骤二: 计算某输入模式下的实际输出及期望输出误差值;
步骤三: 对数据权值进行有效更新,更新公式为:

步骤四: 完成以上步骤后再返回步骤二,直至完成所有数据的训练

结合 BP 神经网络算法,对激活函数以及其训练函数进行有效编程: 
Net = newff( minmax( p) ,{ } ,{ ’myfunc’,’purelin’} ,’mytrainfunc’)
Net. trainparam. epochs = 20000;
Ner,trainparam. goal = 0. 0002;
Ner = train( net,p. t) ;

三、模型运行实证研究分析

研究对象及数据来源
基于 MATLAB BP 神经网络财务模型可对企业运行中的各项决策进行分析,对企业财务状态进行时间点探究。 当前,众多企业为保证自身利益,在财务管理过程中会出现一些漏洞,企业财务决策者往往无法从中发现有效信息。

 模型测试

在前文建立的网络模型基础上构建可反映以上财务指标的财务模型,该模型在实际构建过程中主要包括输入层、 隐含层 输出层 3 个方面,一共有 8 个财务指标,并在模型输出层设置两个节点,通过节点主要是研究对象的输出部分。
系统采用 MATLAB 6. 5 进行神经网络系统的有效分析,首先建立对应的 M - File 文件,之后建立对应连续函数,在 MATLAB 中采用 Premnux 函数进行数据处理,通过共轭梯度进行数据训练 本次系统运行一共展开 15200 个学习周期便达到其对应的期望误差,系统运行最终结果见图

可发现该网络误差性能曲线具有收敛性,并且从运行情况来看其运行结果的期望误差小于 0. 0001,本研究设定的经济模型较为合理 再对其运行 2500 迭代以及 152000 次训练如图 ( b ) 和图 ( c ) 所 示,其运行结果均满足实际情况,因此可将该模型应用于实际财务分析。

部分源代码

# -*- coding:utf-8 -*-
 
 from CloudQuant import SDKCoreEngine  # 导入量子金服SDK
 from CloudQuant import AssetType
 from CloudQuant import QuoteCycle
 import numpy as np
 import pandas as pd
 
 np.seterr(invalid='ignore')
 
 config = {
     'username': 'pengkun',
     'password': '111111',
     'rootpath': 'c:/cStrategy',  # 客户端所在路径
     'assetType': AssetType.Stock,
     'initCapitalStock': 100000000,
     'startDate': 20070101,
     'endDate': 20170101,
     'cycle': QuoteCycle.D,
     'strategyName': 'Beneish',
     'feeRate': 0.001,
     'feeLimit': 5,
     'stampTaxRate': 0.001,
     'dealByVolume': True
 }
 
 HOLDING_PERIOD=60
 HOLDING_NUMBER=100
 
 
 def initial(sdk):
     sdk.setGlobal('c',0)
 
 def initPerDay(sdk):
     pass
 
 #M Score*=91.07-22.9×GMI-49.91×AQI+35.21×SGI-18.17×LVGI
 
 def strategy(sdk):
     count=sdk.getGlobal('c')
     if count==0:
         GM=sdk.getFactorData('LZ_CN_STKA_FIN_IND_GROSSPRFTMARGIN')
         GMI=GM[-1]/GM[-1-HOLDING_PERIOD]
         SG=sdk.getFactorData('LZ_CN_STKA_PRF_COMBO_Q_OPR_REV')
         SGI=SG[-1]/SG[-1-HOLDING_PERIOD]
         AQ=sdk.getFactorData('LZ_CN_STKA_BAL_COMBO_INTANG_ASTS')
         AQI=AQ[-1]/AQ[-1-HOLDING_PERIOD]
         LVG=sdk.getFactorData('LZ_CN_STKA_FIN_IND_DEBTTOASTS')
         LVGI=LVG[-1]/LVG[-1-HOLDING_PERIOD]
 
         M_SCORE=91.07-22.9*GMI-49.91*AQI+35.21*SGI-18.17*LVGI
 
         ST = sdk.getFactorData('LZ_CN_STKA_SLCIND_ST_FLAG')[-1]  # ST
         STOP = sdk.getFactorData('LZ_CN_STKA_SLCIND_STOP_FLAG')[-1]  # 停牌
         stock_list = sdk.getStockList()
         stock_list = np.array(stock_list)
         condition_ST = ST == 0
         condition_STOP = STOP == 0
         condition = condition_ST * condition_STOP
 
         stock_list=stock_list[condition]
         M_SCORE=M_SCORE[condition]
 
         M_SCORE=pd.Series(M_SCORE,index=stock_list)
         M_SCORE=M_SCORE.sort_values()
 
         # n=int(len(stock_list)/5)
         stock_pool=M_SCORE.index[:HOLDING_NUMBER]
 
         transferPosition(sdk, stock_pool)
     count+=1
     if count==HOLDING_PERIOD:
         count=0
     sdk.setGlobal('c',count)
 
 
 def transferPosition(sdk,stock_pool):
     position = sdk.getPositions()
     position_dict = dict([i.code, i.optPosition] for i in position)
     stock_to_buy = set(stock_pool) - set(position_dict.keys())
     stock_to_sell = set(position_dict.keys()) - set(stock_pool)
     quotes = sdk.getQuotes(list(stock_to_buy | stock_to_sell))
     if stock_to_sell:
         sell_orders = []
         for stock in stock_to_sell:
             if stock in quotes.keys():
                 price = quotes[stock].current
                 volume = position_dict[stock]
                 order = [stock, price, volume, -1]
                 sell_orders.append(order)
         if sell_orders:
             sdk.makeOrders(sell_orders)
             sdk.sdklog("------------------------------------------")
             sdk.sdklog(sdk.getNowDate(),"DATE")
             sdk.sdklog(sell_orders,"SELL")
     if stock_to_buy:
         available_cash = sdk.getAccountInfo().availableCash
         available_cash_one_stock = available_cash / len(stock_to_buy)
         buy_orders = []
         for stock in stock_to_buy:
             if stock in quotes.keys():
                 price = quotes[stock].open
                 volume = int(available_cash_one_stock / (price * 100)) * 100
                 if volume > 0:
                     order = [stock, price, volume, 1]
                     buy_orders.append(order)
         if buy_orders:
             sdk.makeOrders(buy_orders)
             sdk.sdklog("------------------------------------------")
             sdk.sdklog(sdk.getNowDate(),"DATE")
             sdk.sdklog(buy_orders,'BUY')
 
 
 def run_all():
     config['initial'] = initial
     config['strategy'] = strategy
     config['preparePerDay'] = initPerDay
     # 启动SDK
     SDKCoreEngine(**config).run()
 
 if __name__ == '__main__':
     run_all()

 实现效果图样例

财务模型图:

 我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值