金融数据一直是数据分析的重要数据来源,要做金融数据分析一定要有一个金融数据库,这篇博文就来教大家如何在自己的PC上建立一个简易金融数据库。

“工欲善其事,必先利其器”,建立数据库首先要有一个数据库软件,这里选择的是行业翘楚Oracle。幸运的是,Oracle学微软的那一套,推出了一个免费但功能有限的Oracle Express版本,虽然是功能有限但对基本的数据库操作足够了。这里是Oracle Express的网址:http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html。为了更容易的操纵数据库Oracle SQL Developer也是少不了的,网址:http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html,读者可以根据网站的介绍下载安装这两款软件,这里不再赘述。

“水有源,树有根”,没有数据源的数据库只是一个空的容器。这里把沪深两市的股票交易数据作为数据源,下面介绍如何获得这些数据。

第一步,获得股票代码。交易所网站是获得股票代码最可靠的来源,这里给出网址,深交所:http://www.szse.cn/main/marketdata/jypz/colist/;上交所:http://www.sse.com.cn/assortment/stock/list/name/。读者可以将这些代码分别复制保存在两个文件内,这里不再赘述。

第二步,寻找网络数据源。有些大型网站提供股票数据的下载服务,比如163。这里举一个例子,在163官网的股票板块查询浦发银行(600000),可以顺藤摸瓜找到浦发银行的历史交易数据,网址:http://quotes.money.163.com/trade/lsjysj_600000.html?year=2014&season=4,点击旁边的“下载数据”按键就可以下载数据了,数据以csv表格的形式存储。

第三步,自动化下载数据,这也是最复杂的一步。沪深两市的可交易股票有几千只,这些股票的数据完全由人工点击网页下载是不现实的,需要实现自动化下载。这里演示如何用R语言实现数据自动下载。在第二步点击“下载数据”按键下载数据的过程中可以得到下载数据的网址,这个网址是实现自动化下载的关键。打开第二步中的网页下载数据,如果使用的是360浏览器,在下载工具中可以得到下载链接,如下图,

如果使用的是火狐浏览器,可以在下载管理器中找到下载的文件,右键“复制下载链接”,如下图,

获得了下载链接后,下面分析一下链接的组成。刚才获得的链接是:http://quotes.money.163.com/service/chddata.html?code=0600000&start=19991110&end=20141231&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;

CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP,关键字一目了然,600000是股票代码;如果下载一个深市的股票可以发现,股票代码前的0表示沪市,1表示深市;19991110表示开始日期(下载时可以选择是上市日还是发行日,不过这里推荐用上市日),20141231表示截止日期;剩下的都是具体的数据项目。

新的问题来了,截止日期可以统一确定,上市日期却不能,必须分别获取股票的上市日期。来到网页http://quotes.money.163.com/trade/lsjysj_600000.html#01b07,这是查询数据前的状态,右键“查看网页源代码”,搜索一下“上市日”,可以发现“上市日”前面有一段代码“value="1999-11-10"”,这就是上市日。

根据网页的特征,可以用R语言自动化的分析网页内容,获得上市日数据,代码如下,

#下载股票上市日期

#download the listingdate of one security

library(RCurl)

SH

listing.date

url.date1

url.date2

for (i in 1:length(SH))

{

#解析网页,得到listingdate

cat(i,'\n')

url.date

xx

posi

listing.date[i]

}

listing.date.tab

#输出

write.table(listing.date.tab,file="xxx.txt",sep="\t",quote=FALSE,row.name=FALSE)

把下载好的数据按照市场分开,分别保存到txt文件即可,这里不再赘述。保存好的数据要稍微处理一下,日期的格式调整为yyyymmdd,write.table会把数据框的“列名”打印出来,列名也是要去掉的。

有了股票代码和上市日期数据就可以自动化下载数据了,最好深市沪市分开进行,存在不同的文件夹下,R代码如下,

#下载股票数据

library(RCurl)

#http://quotes.money.163.com/service/chddata.html?code=0600030&start=20030106&end=20140920&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP

url1

market

code

url2

start

url3

end

url4

#文件的存放路径

file.path

#股票代码+发行日期,格式:CODE制表符yyyymmdd

security

code

listingdate

security.tab

for (i in 1 : length(security))

{

security.tab[i,] = strsplit(security[i],"\t")

}

for (i in 1 : dim(security.tab)[1])

{

code

start

cat(i,"\t---",code,"\n")

url

file

download.file(url,destfile=file, method="auto",quiet=T)

}

上一段代码把股票数据下载到指定的文件夹,不过数据是以个股为单位独立的存储在csv文件中的,文件名即是股票代码。成百上千的csv文件不容易导入数据库,需要把这些文件拼接成几个大文件。

“百川汇流”,导入数据库。在正式导入数据库之前需要把几千个csv文件拼接成几个大型文件。为了提高逼格(真实的原因是建立数据库的时候本人还不会Python),这里用C++完成拼接文件的工作,其实有Python基础的读者也可以用Python来完成。文件拼接的C++程序如下,

#include

#include

#include

int main(void)

{

//处理股票数据

const int N = 1000;

ifstream fin;

vector 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<

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<

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<

}

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

sql1

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

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

head(i000001)

s600000

head(s600000)

t

s

i

plot(i, s, pch = 20, xlab="000001", ylab="600000")

capm.lm

abline(coef = capm.lm$coe, co="red", lwd=2)

oracle简易版创建数据库,建立简易金融数据库相关推荐

  1. oracle简易版创建数据库,浅析新建Oracle数据库的三种方法

    1.通过运行Oracle Database Configuration Assistant 创建.配置.或删除数据库(也可在命令行下输入dbca): 2.用命令行的方式建立数据库 3.通过运行自定义的 ...

  2. oracle简易版创建数据库,oracle创建一个数据库三步走

    以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...

  3. oracle简易数据库搭建,Oracle 10g 手工创建一个最简单的数据库

    [root@blliu ~]# su - oracle [oracle@blliu ~]$ cd $ORACLE_HOME/dbs [oracle@blliu dbs]$ touch initorcl ...

  4. Oracle 11g 通过创建物化视图实现不同数据库间的表数据同步

    Oracle 11g 物化视图语法如下: create materialized view [view_name] refresh [fast|complete|force] [ on [commit ...

  5. JavaEE + Oracle + Spring Boot + Mybatis + Maven 开发简易版银行管理系统(附源码)

    文章目录 JavaEE + Oracle + Spring Boot + Mybatis + Maven 开发简易版银行管理系统 一.系统介绍 二.开发步骤 三.系统展示 四.开发总结 五.数据库相关 ...

  6. 依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...

  7. php mailer altbody,PHP_phpmailer 中文使用说明(简易版),phpmailer v5.1下载 A开头: $AltBody - phpStudy...

    phpmailer 中文使用说明(简易版) phpmailer v5.1下载 A开头: $AltBody--属性 出自:PHPMailer::$AltBody 文件:class.phpmailer.p ...

  8. CDH5.15离线搭建简易版集群(完整版)

    运用CDH5.15离线搭建简易版集群 关于CDH和Cloudera CDH(Cloudera的发行版,包括Apache Hadoop),是Hadoop众多分支中的一种,由Cloudera维护,基于稳定 ...

  9. 基于Zookeeper实现简易版服务的注册与发现机制

    一.功能要求 基于Zookeeper实现简易版服务的注册与发现机制 启动2个服务端 将服务端IP和端口信息注册到Zookeeper上 启动1个客户端 从Zookeeper中获取2个服务端节点信息 客户 ...

最新文章

  1. 李菲菲课程笔记:Deep Learning for Computer Vision – Introduction to Convolution Neural Networks
  2. 【纯干货】Amoeba实现MySQL主从同步与读写分离
  3. 用JavaScript语言判断一个三位数是否为水仙花数
  4. Python:Anaconda安装虚拟环境到指定路径
  5. mysql replace update_mysql的replace,存在更新,不存在插入
  6. Win10 WSL adb使用
  7. .net Core 3.1 项目打包部署到Windows服务
  8. KVM磁盘格式转换,raw转qcow2
  9. android studio 导入一个已有的android studio project作为lib使
  10. js使用双层for循环实现倒三角形、正三角形
  11. 【太经典】如果有人问你数据库的原理,叫他看这篇文章
  12. 【使用Unity开发Windows Phone上的2D游戏】(1)千里之行始于足下
  13. Android手机听筒和扬声器切换
  14. vue中数据劫持代理
  15. idea 设置编辑器 table 全部显示
  16. openmvg中cmd模块解析
  17. 白告王旋的前端开发笔记——性能优化
  18. LoadRunner Error -27792: Failed to connect to server
  19. 论文阅读:Gradient Harmonized Single-stage Detector
  20. $().each和$.each()

热门文章

  1. Github+picGo搭建图床
  2. python做表格好用吗_吊打Excel!用Python来办公到底有多强?
  3. 国内外建筑信息化企业产品分析
  4. 在arcmap和arcgispro中添加在线地图服务
  5. php 风水起名网站源代码_开运网付费开源商业版 PHP风水起名八字算命易经周易源码...
  6. 想知道华为手机电池是否正常,按下这几个数字就可以了,亲测有效
  7. 亚商投资顾问 早餐FM/0919世界制造业大会将召开
  8. Person Re-identification:Past,Present and Future笔记
  9. 【挖坑记】JZOJ 4727 挺进
  10. DNS配置错误导致无法访问网络