神经网络python源码分享


Posted in Python onDecember 15, 2017

神经网络的逻辑应该都是熟知的了,在这里想说明一下交叉验证

交叉验证方法:

神经网络python源码分享

看图大概就能理解了,大致就是先将数据集分成K份,对这K份中每一份都取不一样的比例数据进行训练和测试。得出K个误差,将这K个误差平均得到最终误差

这第一个部分是BP神经网络的建立

参数选取参照论文:基于数据挖掘技术的股价指数分析与预测研究_胡林林

import math
import random
import tushare as ts
import pandas as pd
random.seed(0)
def getData(id,start,end):
  df = ts.get_hist_data(id,start,end)
  DATA=pd.DataFrame(columns=['rate1', 'rate2','rate3','pos1','pos2','pos3','amt1','amt2','amt3','MA20','MA5','r'])
  P1 = pd.DataFrame(columns=['high','low','close','open','volume'])
  DATA2=pd.DataFrame(columns=['R'])
  DATA['MA20']=df['ma20']
  DATA['MA5']=df['ma5']
  P=df['close']
  P1['high']=df['high']
  P1['low']=df['low']
  P1['close']=df['close']
  P1['open']=df['open']
  P1['volume']=df['volume']

  DATA['rate1']=(P1['close'].shift(1)-P1['open'].shift(1))/P1['open'].shift(1)
  DATA['rate2']=(P1['close'].shift(2)-P1['open'].shift(2))/P1['open'].shift(2)
  DATA['rate3']=(P1['close'].shift(3)-P1['open'].shift(3))/P1['open'].shift(3)
  DATA['pos1']=(P1['close'].shift(1)-P1['low'].shift(1))/(P1['high'].shift(1)-P1['low'].shift(1))
  DATA['pos2']=(P1['close'].shift(2)-P1['low'].shift(2))/(P1['high'].shift(2)-P1['low'].shift(2))
  DATA['pos3']=(P1['close'].shift(3)-P1['low'].shift(3))/(P1['high'].shift(3)-P1['low'].shift(3))
  DATA['amt1']=P1['volume'].shift(1)/((P1['volume'].shift(1)+P1['volume'].shift(2)+P1['volume'].shift(3))/3)
  DATA['amt2']=P1['volume'].shift(2)/((P1['volume'].shift(2)+P1['volume'].shift(3)+P1['volume'].shift(4))/3)
  DATA['amt3']=P1['volume'].shift(3)/((P1['volume'].shift(3)+P1['volume'].shift(4)+P1['volume'].shift(5))/3)
  templist=(P-P.shift(1))/P.shift(1)
  tempDATA = []
  for indextemp in templist:
    tempDATA.append(1/(1+math.exp(-indextemp*100)))
  DATA['r'] = tempDATA
  DATA=DATA.dropna(axis=0)
  DATA2['R']=DATA['r']
  del DATA['r']
  DATA=DATA.T
  DATA2=DATA2.T
  DATAlist=DATA.to_dict("list")
  result = []
  for key in DATAlist:
    result.append(DATAlist[key])
  DATAlist2=DATA2.to_dict("list")
  result2 = []
  for key in DATAlist2:
    result2.append(DATAlist2[key])
  return result
def getDataR(id,start,end):
  df = ts.get_hist_data(id,start,end)
  DATA=pd.DataFrame(columns=['rate1', 'rate2','rate3','pos1','pos2','pos3','amt1','amt2','amt3','MA20','MA5','r'])
  P1 = pd.DataFrame(columns=['high','low','close','open','volume'])
  DATA2=pd.DataFrame(columns=['R'])
  DATA['MA20']=df['ma20'].shift(1)
  DATA['MA5']=df['ma5'].shift(1)
  P=df['close']
  P1['high']=df['high']
  P1['low']=df['low']
  P1['close']=df['close']
  P1['open']=df['open']
  P1['volume']=df['volume']

  DATA['rate1']=(P1['close'].shift(1)-P1['open'].shift(1))/P1['open'].shift(1)
  DATA['rate2']=(P1['close'].shift(2)-P1['open'].shift(2))/P1['open'].shift(2)
  DATA['rate3']=(P1['close'].shift(3)-P1['open'].shift(3))/P1['open'].shift(3)
  DATA['pos1']=(P1['close'].shift(1)-P1['low'].shift(1))/(P1['high'].shift(1)-P1['low'].shift(1))
  DATA['pos2']=(P1['close'].shift(2)-P1['low'].shift(2))/(P1['high'].shift(2)-P1['low'].shift(2))
  DATA['pos3']=(P1['close'].shift(3)-P1['low'].shift(3))/(P1['high'].shift(3)-P1['low'].shift(3))
  DATA['amt1']=P1['volume'].shift(1)/((P1['volume'].shift(1)+P1['volume'].shift(2)+P1['volume'].shift(3))/3)
  DATA['amt2']=P1['volume'].shift(2)/((P1['volume'].shift(2)+P1['volume'].shift(3)+P1['volume'].shift(4))/3)
  DATA['amt3']=P1['volume'].shift(3)/((P1['volume'].shift(3)+P1['volume'].shift(4)+P1['volume'].shift(5))/3)
  templist=(P-P.shift(1))/P.shift(1)
  tempDATA = []
  for indextemp in templist:
    tempDATA.append(1/(1+math.exp(-indextemp*100)))
  DATA['r'] = tempDATA
  DATA=DATA.dropna(axis=0)
  DATA2['R']=DATA['r']
  del DATA['r']
  DATA=DATA.T
  DATA2=DATA2.T
  DATAlist=DATA.to_dict("list")
  result = []
  for key in DATAlist:
    result.append(DATAlist[key])
  DATAlist2=DATA2.to_dict("list")
  result2 = []
  for key in DATAlist2:
    result2.append(DATAlist2[key])
  return result2
def rand(a, b):
  return (b - a) * random.random() + a
def make_matrix(m, n, fill=0.0):
  mat = []
  for i in range(m):
    mat.append([fill] * n)
  return mat
def sigmoid(x):
  return 1.0 / (1.0 + math.exp(-x))
def sigmod_derivate(x):
  return x * (1 - x)
class BPNeuralNetwork:
  def __init__(self):
    self.input_n = 0
    self.hidden_n = 0
    self.output_n = 0
    self.input_cells = []
    self.hidden_cells = []
    self.output_cells = []
    self.input_weights = []
    self.output_weights = []
    self.input_correction = []
    self.output_correction = []

  def setup(self, ni, nh, no):
    self.input_n = ni + 1
    self.hidden_n = nh
    self.output_n = no
    # init cells
    self.input_cells = [1.0] * self.input_n
    self.hidden_cells = [1.0] * self.hidden_n
    self.output_cells = [1.0] * self.output_n
    # init weights
    self.input_weights = make_matrix(self.input_n, self.hidden_n)
    self.output_weights = make_matrix(self.hidden_n, self.output_n)
    # random activate
    for i in range(self.input_n):
      for h in range(self.hidden_n):
        self.input_weights[i][h] = rand(-0.2, 0.2)
    for h in range(self.hidden_n):
      for o in range(self.output_n):
        self.output_weights[h][o] = rand(-2.0, 2.0)
    # init correction matrix
    self.input_correction = make_matrix(self.input_n, self.hidden_n)
    self.output_correction = make_matrix(self.hidden_n, self.output_n)

  def predict(self, inputs):
    # activate input layer
    for i in range(self.input_n - 1):
      self.input_cells[i] = inputs[i]
    # activate hidden layer
    for j in range(self.hidden_n):
      total = 0.0
      for i in range(self.input_n):
        total += self.input_cells[i] * self.input_weights[i][j]
      self.hidden_cells[j] = sigmoid(total)
    # activate output layer
    for k in range(self.output_n):
      total = 0.0
      for j in range(self.hidden_n):
        total += self.hidden_cells[j] * self.output_weights[j][k]
      self.output_cells[k] = sigmoid(total)
    return self.output_cells[:]
  def back_propagate(self, case, label, learn, correct):
    # feed forward
    self.predict(case)
    # get output layer error
    output_deltas = [0.0] * self.output_n
    for o in range(self.output_n):
      error = label[o] - self.output_cells[o]
      output_deltas[o] = sigmod_derivate(self.output_cells[o]) * error
    # get hidden layer error
    hidden_deltas = [0.0] * self.hidden_n
    for h in range(self.hidden_n):
      error = 0.0
      for o in range(self.output_n):
        error += output_deltas[o] * self.output_weights[h][o]
      hidden_deltas[h] = sigmod_derivate(self.hidden_cells[h]) * error
    # update output weights
    for h in range(self.hidden_n):
      for o in range(self.output_n):
        change = output_deltas[o] * self.hidden_cells[h]
        self.output_weights[h][o] += learn * change + correct * self.output_correction[h][o]
        self.output_correction[h][o] = change
    # update input weights
    for i in range(self.input_n):
      for h in range(self.hidden_n):
        change = hidden_deltas[h] * self.input_cells[i]
        self.input_weights[i][h] += learn * change + correct * self.input_correction[i][h]
        self.input_correction[i][h] = change
    # get global error
    error = 0.0
    for o in range(len(label)):
      error += 0.5 * (label[o] - self.output_cells[o]) ** 2
    return error
  def train(self, cases, labels, limit=10000, learn=0.05, correct=0.1):
    for i in range(limit):
      error = 0.0
      for i in range(len(cases)):
        label = labels[i]
        case = cases[i]
        error += self.back_propagate(case, label, learn, correct)
  def test(self,id):
    result=getData("000001", "2015-01-05", "2015-01-09")
    result2=getDataR("000001", "2015-01-05", "2015-01-09")
    self.setup(11, 5, 1)
    self.train(result, result2, 10000, 0.05, 0.1)
    for t in resulttest:
      print(self.predict(t))

下面是选取14-15年数据进行训练,16年数据作为测试集,调仓周期为20个交易日,大约1个月,对上证50中的股票进行预测,选取预测的涨幅前10的股票买入,对每只股票分配一样的资金,初步运行没有问题,但就是太慢了,等哪天有空了再运行

import BPnet
import tushare as ts
import pandas as pd
import math
import xlrd
import datetime as dt
import time

#
#nn =BPnet.BPNeuralNetwork()
#nn.test('000001')
#for i in ts.get_sz50s()['code']:
holdList=pd.DataFrame(columns=['time','id','value'])
share=ts.get_sz50s()['code']
time2=ts.get_k_data('000001')['date']
newtime = time2[400:640]
newcount=0
for itime in newtime:
  print(itime)
  if newcount % 20 == 0:
        sharelist = pd.DataFrame(columns=['time','id','value'])
    for ishare in share:
      backwardtime = time.strftime('%Y-%m-%d',time.localtime(time.mktime(time.strptime(itime,'%Y-%m-%d'))-432000*4))
      trainData = BPnet.getData(ishare, '2014-05-22',itime)
      trainDataR = BPnet.getDataR(ishare, '2014-05-22',itime)
      testData = BPnet.getData(ishare, backwardtime,itime)
      try:
        print(testData)
        testData = testData[-1]
        print(testData)
        nn = BPnet.BPNeuralNetwork()
        nn.setup(11, 5, 1)
        nn.train(trainData, trainDataR, 10000, 0.05, 0.1)
        value = nn.predict(testData)
        newlist= pd.DataFrame({'time':itime,"id":ishare,"value":value},index=["0"])
        sharelist = sharelist.append(newlist,ignore_index=True)
      except: 
        pass
    sharelist=sharelist.sort(columns ='value',ascending=False)
    sharelist = sharelist[:10]
    holdList=holdList.append(sharelist,ignore_index=True)
  newcount+=1
  print(holdList)

总结

以上就是本文关于神经网络python源码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
跟老齐学Python之从格式化表达式到方法
Sep 28 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
Python for循环搭配else常见问题解决
Feb 11 Python
python Paramiko使用示例
Sep 21 Python
python使用pymysql模块操作MySQL
Jun 16 Python
python APScheduler执行定时任务介绍
Apr 19 Python
神经网络理论基础及Python实现详解
Dec 15 #Python
浅谈机器学习需要的了解的十大算法
Dec 15 #Python
python实现协同过滤推荐算法完整代码示例
Dec 15 #Python
python3大文件解压和基本操作
Dec 15 #Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 #Python
numpy自动生成数组详解
Dec 15 #Python
Python3实现发送QQ邮件功能(附件)
Dec 23 #Python
You might like
php单链表实现代码分享
2016/07/04 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
JS动画效果代码3
2008/04/03 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
修复ie8&chrome下window的resize事件多次执行
2011/10/20 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
vue.js表格分页示例
2016/10/18 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
mac上node.js环境的安装测试
2017/07/03 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
Python 深入理解yield
2008/09/06 Python
python获取url的返回信息方法
2018/12/17 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
生物制药毕业生自荐信
2013/10/16 职场文书
大学生毕业求职简历的自我评价
2013/10/24 职场文书
前台领班岗位职责
2013/12/04 职场文书
商业房地产广告语
2014/03/13 职场文书
公司承诺函范文
2015/01/21 职场文书
任命书标准格式
2015/03/02 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
2016新年年会主持词
2015/07/06 职场文书
《称赞》教学反思
2016/02/17 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
把77A收信机改造成收音机
2022/04/05 无线电