建立简易金融数据库

发表于:2015-1-20 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:xuruilong100    来源:51Testing软件测试网采编

  上一段代码把股票数据下载到指定的文件夹,不过数据是以个股为单位独立的存储在csv文件中的,文件名即是股票代码。成百上千的csv文件不容易导入数据库,需要把这些文件拼接成几个大文件。
  “百川汇流”,导入数据库。在正式导入数据库之前需要把几千个csv文件拼接成几个大型文件。为了提高逼格(真实的原因是建立数据库的时候本人还不会Python),这里用C++完成拼接文件的工作,其实有Python基础的读者也可以用Python来完成。文件拼接的C++程序如下,
#include <vector>
#include <fstream>
#include <string>
int main(void)
{
//处理股票数据
const int N = 1000;
ifstream fin;
vector<string> file_list,ff;
char  x[N];
string ss;
//获取要处理的文件列表
fin.open("fff.txt");
while (!fin.eof())
{
fin.getline(x, N, '\n');
ss.assign(x);
if (ss.size() > 0)
{
file_list.push_back(ss);
}
}
fin.close();
//cout<<file_list.size()<<endl;
ofstream fout, fout0,fout1,fout2,fout3,fout4,fout5;
string obj_file("x.csv"),path1("F:/download/obj/"),path2("F:/download/outh/");
for (int i = 0; i < file_list.size(); ++i)
{
cout<<i+1<<"\t\t"<<file_list[i]<<endl;
int f_num = i / 500;
obj_file[0] = '0'+f_num;
fout.open(path2+obj_file,ofstream::out | ofstream::app);
fin.open(path1+file_list[i]);
bool first = true;
while (!fin.eof())
{
fin.getline(x, N, '\n');
ss.assign(x);
if (ss.size() > 0 && !first)
{
//1到1004为沪市
if (i+1<=1004)
{
ss="SH,"+ss;
}
else
{
ss="SS,"+ss;
}
ss.erase(7,1);
ss.erase(9,1);
ss.erase(12,1);
fout<<ss;
}
first = false;
}
fin.close();
fout.close();
}
}
  需要解释一下,第一步获取要处理的文件的文件名列表,前半部分为沪市,后半部分为深市,列表存放在fff.txt文件(获取文件名列表可以用R中的dir函数)。第二步把所有文件转移到同一个文件夹下,运行C++程序处理文件,将文件归并到6个文件中。拼接的同时,在数据中增加了“市场”字段,SH表示沪市,SS表示深市。数据的日期格式因该是yyyymmdd,C++代码中已经通过ss.erase()调整过了。
  文件拼接完成之后,按照数据的存储形式在Oracle中建立相应的“表”,在用SQL Developer将拼接好的csv文件中的数据导入Oracle就可以了,这完全是数据库操作,不再赘述。
  做完上面几步就完成了股票数据库的建立,胜利收官。同理,举一反三地可以建立股票指数数据库。下面讲一下注意事项:
  1.在数据下载的时候可能遇到打不开下载链接的情况,这时候R程序会报错并停止,这时候需要人工的跳过这个链接,重新运行程序,直接进入下一步的循环,所以下载的时候人工监控是少不了的。
  2.建议用最新版的R运行程序,之前的版本在下载文件时存在内存溢出的现象,在下载几百个文件之后会因为内存不足而强行终止运行。
  3.在数据导入数据库之后建议人工检验一下每一个字段,把存在空值的行删掉。
  最后借助RODBC包把Oracle和R连接起来,给出一个数据分析的例子,计算一下浦发银行600000和上证指数000001之间的线性关系,R代码如下,
rm(list=ls())
library(RODBC)
channel <- odbcConnect(dsn="***",uid="***",pwd="***")
sql1 <- "SELECT dates, close, pre_close FROM idx
where
dates in
(
SELECT dates FROM idx where code='000001'
INTERSECT
SELECT dates FROM security where code='600000'
and
close > 0
and
dates >= to_date('20100101', 'yyyymmdd')
)
and
code = '000001'
order by dates asc"
sql2 <- "SELECT dates, close, pre_close FROM security
where
dates in
(
SELECT dates FROM idx where code='000001'
INTERSECT
SELECT dates FROM security where code='600000'
and
close > 0
and
dates >= to_date('20100101', 'yyyymmdd')
)
and
code = '600000'
order by dates asc"
i000001 <- sqlQuery(channel, sql1)
head(i000001)
s600000 <- sqlQuery(channel, sql2)
head(s600000)
t <- s600000$DATES
s <- log(s600000$CLOSE) - log(s600000$PRE_CLOSE)
i <- log(i000001$CLOSE) - log(i000001$PRE_CLOSE)
plot(i, s, pch = 20, xlab="000001", ylab="600000")
capm.lm <- lm(s~i)
abline(coef = capm.lm$coe, co="red", lwd=2)
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号