用RHive从历史数据中提取逆回购信息

2023-11-07 20:30

本文主要是介绍用RHive从历史数据中提取逆回购信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

接触金融时间并不太长,对我来说第一个操作的业务,就是逆回购。逆回购对于大部分人来说,都是一个新鲜词,就算是炒股多年的玩家,可能也是在2013年6月份发生银行缺钱的事件之后才了解的。隔夜的银行间拆借利率达到了30%,简单来说银行缺钱了!各种机构 分分出售股票,债券,兑换成现金借给应银行。个人用户也都取出存款,通过逆回购,把钱借给银行。30%的利率,让所有人在那一周都为之兴奋,只有银行在惶恐。

目录

  1. 逆回购简介
  2. 历史数据模型
  3. 通过用RHive提取数据
  4. 简单策略实现

1. 逆回购简介

债券回购的含义

债券质押式回购简单地说就是交易双方以债券为质押品的一种短期资金借贷行为。其中债券持有人(正回购方)将债券质押而获得资金使用权,到约定的时间还本并支付一定的利息,从而“赎回”债券。而资金持有人(逆回购方)就是正回购方的交易对手。在实际交易中债券是质押给了第三方即中国结算公司,这样交易双方否更加安全、便捷。

可回购的债券

所有的国债、绝大部分企业债、公司债和分离债的纯债都可用于债券回购交易。沪深交易所每周都会公布可回购债券的折算率,上面没有但可交易的品种就是不可回购的债券。折算率简单说,就是把债券质押时,交易所按债券面值给出的可质押的比率。

现在交易的回购品种

我们仅列出个人投资者经常参与的公司债(包括企业债等)回购品种。

上海证券交易所可交易的质押式回购(括弧中为交易代码)分为1日(204001)、2日(204002)、3日(204003)、4日(204004)、7日(204007)、14日(204014)、28日(204028)、91日(204091)、182日(204182)共9个品种。深圳交易所按回购期限分为分为1日(131810)、2日(131811)、3日(131800)、7日(131801)共4个品种。其中经常交易的只有沪深1日和7日四个品种,并且沪市的日均交易量又远远大于深市的交易量。

以上逆回购定义摘自:http://finance.sina.com.cn/money/bond/20121016/180713385513.shtml

2. 历史数据模型

Hive中的表结构:


rhive.desc.table('t_reverse_repurchase')col_name data_type
1  tradedate    string
2  tradetime    string
3 securityid    string
4     bidpx1    double
5   bidsize1    double
6   offerpx1    double
7 offersize1    double

tradedate:交易日期
tradetime:交易时间
securityid:股票ID
bidpx1:买一
bidsize1:买一交易量
offerpx1:卖一
bidsize1:卖一交易量

3. 通过用RHive提取数据

登陆c1服务器,打开R的客户端。


#装载RHive
library(RHive)#初始化
rhive.init()#连接到Hive集群
> rhive.connect("c1.wtmart.com")
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/cos/toolkit/hive-0.9.0/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/cos/toolkit/hadoop-1.0.3/lib/slf4j-log4j12-1.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.#查看当前的表
> rhive.list.tables()tab_name
1            t_hft_day   //历史数据表
2            t_hft_tmp   //临时表
4 t_reverse_repurchase   //逆回购表

查看所有股票历史数据分片:测试数据从20130627–20130726。


> rhive.query("SHOW PARTITIONS t_hft_day");partition
1  tradedate=20130627
2  tradedate=20130628
3  tradedate=20130701
4  tradedate=20130702
5  tradedate=20130703
6  tradedate=20130704
7  tradedate=20130705
8  tradedate=20130708
9  tradedate=20130709
10 tradedate=20130710
11 tradedate=20130712
12 tradedate=20130715
13 tradedate=20130716
14 tradedate=20130719
15 tradedate=20130722
16 tradedate=20130723
17 tradedate=20130724
18 tradedate=20130725
19 tradedate=20130726

分为提取”上交所一天逆回购”(204001),和”深交所一天逆回购”(131810),从7月22日至7月26日的一周数据。


> rhive.drop.table("t_reverse_repurchase")
> rhive.query("CREATE TABLE t_reverse_repurchase AS SELECT tradedate,tradetime,securityid,bidpx1,bidsize1,offerpx1,offersize1 FROM t_hft_day where tradedate>=20130722 and tradedate<=20130726 and securityid in (131810,204001)");

查看数据结果集

> rhive.query("SELECT securityid,count(1) FROM t_reverse_repurchase group by securityid");securityid  X_c1
1     131810 17061
2     204001 12441

加载到R的内存中。


> bidpx1<-rhive.query("SELECT securityid,concat(tradedate,tradetime) as tradetime,bidpx1 FROM t_reverse_repurchase"); #查看记录条数 
> nrow(bidpx1)
[1] 29502#查看数据
> head(bidpx1)securityid      tradetime bidpx1
1     131810 20130724145004  2.620
2     131810 20130724145101  2.860
3     131810 20130724145128  2.850
4     131810 20130724145143  2.603
5     131810 20130724144831  2.890
6     131810 20130724145222  2.600

用ggplot2做数据可视化

一周数据的走势

library(ggplot2)
g<-ggplot(data=bidpx1, aes(x=as.POSIXct(tradetime,format="%Y%m%d%H%M%S"), y=bidpx1))
g<-g+geom_line(aes(group=securityid,colour=securityid))
g<-g+xlab('tradetime')+ylab('bidpx1')
ggsave(g,file="01.png",width=12,height=8)

01

一天数据的走势

bidpx1<-rhive.query("SELECT securityid,concat(tradedate,tradetime) as tradetime,bidpx1 FROM t_reverse_repurchase WHERE tradedate=20130726");
g<-ggplot(data=bidpx1, aes(x=as.POSIXct(tradetime,format="%Y%m%d%H%M%S"), y=bidpx1))
g<-g+geom_line(aes(group=securityid,colour=securityid))
g<-g+xlab('tradetime')+ylab('bidpx1')
ggsave(g,file="02.png",width=12,height=8)

02

4. 简单策略实现

通过简单的打印出两幅图片的两条曲线,我们可以看到131810一直在追随204001变化,并且大部情况都低于204001。
下面做一个简单的策略分析:通过204001变化,判断131810的卖点。

  1. 把131810和204001按每分钟标准化
  2. 设置当131810和204001有交点的时候,提取卖出信号
  3. 当后一个交点的卖一价格大于前一个交点的卖一价格10%以上,做为局部最优的卖出信号点

提取131810,204001的数据,存储在t_reverse_repurchase表中


#登陆R
library(RHive)
rhive.init()
rhive.connect("c1.wtmart.com")#提取131810,204001的数据
rhive.drop.table("t_reverse_repurchase")
rhive.query("CREATE TABLE t_reverse_repurchase AS SELECT tradedate,tradetime,securityid,bidpx1,bidsize1,offerpx1,offersize1 FROM t_hft_day where securityid in (131810,204001)");#查看数据集
rhive.query("select count(1),tradedate from t_reverse_repurchase group by tradedate")X_c0 tradedate
1  4840  20130627
2  4792  20130628
3  4677  20130701
4  3124  20130702
5  2328  20130703
6  3787  20130704
7  4294  20130705
8  4977  20130708
9  4568  20130709
10 6619  20130710
11 5633  20130712
12 6159  20130715
13 5918  20130716
14 6200  20130719
15 6074  20130722
16 5991  20130723
17 5899  20130724
18 5346  20130725
19 6192  20130726

加载软件包


library(ggplot2)
library(scales)
library(plyr)

获得一天的数据并做ETL


#把一周的数据加载到内存
bidpx1<-rhive.query(paste("SELECT securityid,tradedate,tradetime,bidpx1 FROM t_reverse_repurchase WHERE tradedate>=20130722"));#加载一天的数据并做ETL
oneDay<-function(date){d1<-bidpx1[which(bidpx1$tradedate==date),]d1$tradetime2<-round( as.numeric(as.character(d1$tradetime))/100)*100d1$tradetime2[which(d1$tradetime2<100000)]<-paste(0,d1$tradetime2[which(d1$tradetime2<100000)],sep="")d1$tradetime2[which(d1$tradetime2=='1e+05')]='100000'd1$tradetime2[which(d1$tradetime2=='096000')]='100000'd1$tradetime2[which(d1$tradetime2=='106000')]='110000'd1$tradetime2[which(d1$tradetime2=='126000')]='130000'd1$tradetime2[which(d1$tradetime2=='136000')]='140000'd1$tradetime2[which(d1$tradetime2=='146000')]='150000'd1
}#通过均值标准化
meanScale<-function(d1){ddply(d1, .(securityid,tradetime2), summarize, bidpx1=mean(bidpx1))
}#找到要分析的点
findPoint<-function(a1,a2){#找到所有a1大于a2的点bigger_point<-function(a1,a2){idx<-c()for(i in intersect(a1$tradetime2,a2$tradetime2)){i1<-which(a1$tradetime2==i)i2<-which(a2$tradetime2==i)              if(a1$bidpx1[i1]-a2$bidpx1[i2]>=-0.02){idx<-c(idx,i1)}}idx}#去掉连续的索引值remove_continuous_point<-function(idx){idx[-which(idx-c(NA,rev(rev(idx)[-1]))==1)]}idx<-bigger_point(a1,a2)remove_continuous_point(idx)
}#发现局部最优卖出点
findOptimize<-function(d3){idx2<-which((d3$bidpx1-c(NA,rev(rev(d3$bidpx1)[-1])))/d3$bidpx1>0.1)if(length(idx2)<1)print("No Optimize point")d3[idx2,]
}#画图查看结果
draw<-function(d2,d3,d4,date,png=FALSE){g<-ggplot(data=d2, aes(x=strptime(paste(date,tradetime2,sep=""),format="%Y%m%d%H%M%S"), y=bidpx1))g<-g+geom_line(aes(group=securityid,colour=securityid))g<-g+geom_point(data=d3,aes(size=1.5,colour=securityid))   if(nrow(d4)>0){g<-g+geom_text(data=d4,aes(label= format(d4$bidpx1,digits=4)),colour="blue",hjust=0, vjust=0)}g<-g+xlab('tradetime')+ylab('bidpx1')if(png){ggsave(g,file=paste(date,".png",sep=""),width=12,height=8)}else{g}
}#执行策略封装
date<-20130722
d1<-oneDay(date)
d2<-meanScale(d1)
a1<-d2[which(d2$securityid==131810),]
a2<-d2[which(d2$securityid==204001),]
d3<-d2[findPoint(a1,a2),]
d4<-findOptimize(d3)
draw(d2,d3,d4,as.character(date),TRUE)

20130722
20130722

20130723
20130723

20130724
20130724

20130725
20130725

20130726
20130726

 

通过对一周数据的比较我们发现,这个简单的策略能我们带来一些收益。虽然不是全局最优的,但比人为的判断会更有依据。

用IT技术玩金融系列文章,第一篇就当是一个抛砖引玉的开始,后面的文章会更精彩。

######################################################
看文字不过瘾,作者视频讲解,请访问网站:http://onbook.me/video
######################################################

转载请注明出处:
http://blog.fens.me/finance-rhive-repurchase/

这篇关于用RHive从历史数据中提取逆回购信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366110

相关文章

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c