新浪博客

利用神经网络预测股票收盘价(含源代码)

2017-08-11 23:28阅读:
攒了几天,发一个大的
这是前几天投了一家量化分析职位,他给的题目的是写神经网络择时模型,大概就是用神经网络预测收盘价
database:该类用于获得新浪网中的数据,并将其放入本地数据库。在本地数据库中建立两个表,分别是Data2012to2015和Data2015to2016,表中都含有日期,当日开盘价、当日收盘价、当日最高价、当日最低价。Data2012to2015为训练数据集,Data2015to2016为测试数据集。
package it.cast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class dataBase {
//创建训练集:Data2012to2015和测试集Data2015to2016
public void createDataBase() {
try {
Connection conn = null;
Statement stmt = null;
//链接数据库
Class.forName('oracle.jdbc.driver.OracleDriver');
String url = 'jdbc:oracle:thin:@localhost:1521:ORCL';
String UserName = 'system';
String password = 'manager';
conn = DriverManager.getConnection(url, UserName, password);
stmt = conn.createStatement();
historyShare( conn, stmt);

}catch (Exception e) {
e.printStackTrace();
}
}
private void historyShare( Connection conn, Statement stmt)
throws SQLException, MalformedURLException, IOException,
UnsupportedEncodingException {
//创建表格
//表格列为:股票id号、日期、开盘价、最高价、收盘价、最低价、成交量
String sql = 'create table Data2015to2016(stokeid integer not null primary key ,' +
'data varchar2(20), openPrice varchar2(20), highPrice varchar2(20), overPrice varchar2(20),lowPrice varchar2(20),' +
'vol varchar2(20))';
stmt.executeUpdate(sql);
URL ur = null;
ur = new URL('http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?&rand=random(10000)&symbol=sz000001&end_date=20161118&begin_date=20151118&type=plain');
HttpURLConnection uc = (HttpURLConnection) ur.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(ur.openStream(),'GBK'));
String line;
PreparedStatement stmt1 = null;
int i=1;
//插入数据
while((line = reader.readLine()) != null){
//普通股票
String sql1 = 'insert into Data2015to2016 values(?,?, ?, ?, ?, ?, ?)';
stmt1 = conn.prepareStatement(sql1);
String[] data=line.split(',');
String date = data[0];
String openPrice = data[1];
String highPrice = data[2];
String overPrice = data[3];
String lowPrice = data[4];
stmt1.setInt(1, i++);
stmt1.setString(2, data[0]);
stmt1.setString(3, data[1]);
stmt1.setString(4, data[2]);
stmt1.setString(5, data[3]);
stmt1.setString(6, data[4]);
stmt1.setString(7, data[5]);
stmt1.executeUpdate();
stmt1.close();
}
}
}
Methods:由于java没有现成的包可以直接得出某只股票的波动率指标、短期和长期均线指标等指标,由于一些指标在网上没有找到,例如动量和反转指标:REVS5,就用了动量指标MTM。所以在百度百科等资料中搜集了一些公式, 分别对这些公式编写代码,就能观测到的数据来说,是准确的。
最后采用了8个指标,分别是波动率指标:EMV;短期和长期均线指标:EMA5和EMA60,MA5和MA60;动量指标MTM;量能指标:MACD;能量指标:CR5.以这8个指标为自变量,收盘价为因变量建立神经网络模型。
package it.cast;
import java.util.ArrayList;
import java.util.List;
public class Methods {


//搜狗百科:A=(今日最高+今日最低)/2;B=(前日最高+前日最低)/2;C=今日最高-今日最低;2.EM=(A-B)*C/今日成交额;3.EMV=N日内EM的累和;4.MAEMV=EMV的M日简单移动平均.参数N为14,参数M为9
public List EMV(ListhighPrice,ListlowPrice,Listvol){
ListEM = new ArrayList();
for(int i = 2;i
double A = (highPrice.get(i)+lowPrice.get(i))/2;
double B = (highPrice.get(i-2)+lowPrice.get(i-2))/2;
double C = highPrice.get(i)-lowPrice.get(i);
EM.add(((A-B)*C)/vol.get(i));
}
ListEMV = new ArrayList();
//取N为14,即14日的EM值之和;M为9,即9日的移动平均
int N = 14;
int M = 9;
for(int i = N;i
//14日累和
double sum = 0;
for(int j = i-N;j
sum += EM.get(j);
}
EMV.add(sum);
}
ListMAEMV = new ArrayList();
for(int i = M;i
//9日移动平均
double sum = 0;
for(int j = i-M;j

sum += EMV.get(j);
}
sum = sum/M;
MAEMV.add(sum);
}
return MAEMV;
}
//EMA=(当日或当期收盘价-上一日或上期EXPMA)/N+上一日或上期EXPMA,其中,首次上期EXPMA值为上一期收盘价,N为天数。
public List EMA5(ListoverPrice){
//取20121118年收盘价为初始EXPMA
ListEMA5 = new ArrayList();
for(int i = 0;i<5;i++){
EMA5.add(overPrice.get(i));
}
for(int i = 5;i
EMA5.add((overPrice.get(i)-EMA5.get(i-5))/5+EMA5.get(i-5));
}
return EMA5;
}
public List EMA60(ListoverPrice){
//取20121118年收盘价为初始EXPMA
ListEMA60 = new ArrayList();
for(int i = 0;i<60;i++){
EMA60.add(overPrice.get(i));
}
for(int i = 60;i
EMA60.add((overPrice.get(i)-EMA60.get(i-60))/60+EMA60.get(i-60));
}
return EMA60;
}
//5日均线
public List MA5(ListoverPrice){
ListMA5 = new ArrayList();
for(int i = 5;i
double sum = 0;
for(int j = i-1;j>=i-5;j--){
sum += overPrice.get(j);
}
sum = sum/5;
MA5.add(sum);
}
return MA5;
}
//60日均线
public List MA60(ListoverPrice){
ListMA60 = new ArrayList();

我的更多文章

下载客户端阅读体验更佳

APP专享