• Archive by category "金融"
  • (Page 4)

Blog Archives

2015CDAS中国数据分析师行业峰会:R语言量化投资数据分析应用

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹(Conan), 程序员Java,R,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-cdas-20150912

title

前言

第一次在以数据分析为切入点的会议上做演讲,感觉还是挺不一样的。大会分为“金融数据洞察”,“医疗数据洞察”,“电商数据洞察”,“大小数据洞察”的4个部分,分别介绍了数据分析在不同行业的应用情况。当然,这次我是在“金融数据洞察”分论坛。

我非常有幸作为分享嘉宾参加2015年的中国数据分析师行业峰会,分享R语言在金融领域中的应用。

目录

  1. 我的演讲主题:R语言量化投资数据分析应用
  2. 会议体验和照片分享

1. 我的演讲主题:R语言量化投资数据分析应用

R语言量化投资数据分析应用,PPT下载,主要内容来自我的一篇博文:R语言构建追涨杀跌量化交易模型

由于本次的演讲时间为20-30分钟,所以思来想去演讲内容,要简单而且直接,才能听众听得明白。那么追涨杀跌策略就成为,最好的一个初门策略的切入点。其他的几位嘉宾,有介绍量化行业背景的,有介绍量化基础知识的,有介绍量化产品布局的,有介绍P2P征信的,那么我介绍是实现一个交易模型,真是让听众全方位的了解了量化的各个知识点,是一场有含金量的会议。

我一直延续了一贯的演讲风格,有内容,有图片,有代码,有互动。从 追涨杀跌 的思路开始,到市场特征检验,再到数学公式,R语言建模,再到历史数据回测。通过R语言,很简单地就实现了一个我们脑子中的投资想法。类似的投资想法其实谁都有,利用IT人的技术优势,可以真正地与实际操作结合起来,实现从IT技术到价值的转变。

2. 会议体验和照片分享

本次大会不仅结识了很多同行的高手,同时听到不同领域对于数据的声音。群贤汇聚 思想碰撞,这也是对我最大收获。会议主页:http://cdas.pinggu.org/index.html

05

2.1 我的分享是在9月12日的金融数据洞察分论坛,第五位分享嘉宾。

01

王安,钱方首席分析师,是本场的主持人。从事金融业定量化管理咨询工作,参与多家银行,保险公司,证券公司的定量管理咨询工作,包括数据分析挖掘,预测模型建立,管理策略发展,分析培训等工作,同时关注图表设计,演讲技巧的内容。

郑志勇(Ariszheng),北京和晶睿智执行合伙人,中国量化投资学会专家委员会成员,北京理工大学运筹学与控制论硕士,先后就职于中国银河证券、银华基金、方正富邦基金,从事金融产品研究与设计工作。十余年MATLAB编程经验,专注于产品设计、量化投资等相关领域的研究,尤其对结构化产品、分级基金产品有着深入的研究,已出版《运筹学与最优化MATLAB编程》和《金融数量分析:基于MATLAB编程》等书籍。

李洋(Faruto),中国量化投资学会专家委员会成员,MATLAB技术论坛联合创始人,北京师范大学应用数学硕士,先后就职于私募、期货公司、保险公司,从事量化投资相关工作。十年MATLAB编程经验,对机器学习、量化投资等相关领域有深入研究,已出版《MATLAB神经网络30个案例分析》和《MATLAB神经网络43个案例分析》等书籍。

薛昆,通联金融董事总经理,计算机背景,毕业进入对冲基金,这家对冲基金被UBS收购了,在2008年很不幸被关掉了,因为当时在做最复杂的相关研究,当时入行的时候,旁边同事2006年拿1亿美元的资金,好事不会再有。之后加入摩根大通做内部平台,后来又加入通联数据,做不一样的事情。

刘时斌,数信互融联合创始人,在SAS风险研发,2012—2014年在北大联合办学,北大教三个学期统计分析和商务智能课程,去年搭上互联网金融风潮下来创业,2014年12月份正式成立,到今年7月份已经到A轮融到2000多万,估值两个多亿。

张丹,R语言资深用户,系统架构师,况客联合创始人(qutke.com)。《R的极客理想-工具篇》、《R的极客理想-高级开发篇》图书作者。有10年IT程序开发和系统架构设计的经验,精通Java, R, Javascript 三种编程语言,熟悉数据挖掘、统计和金融的多种算法。目前在互联网金融量化投资方向创业中,博客(http://blog.fens.me) Alexa全球排名8万。

王吉培,中国人民银行征信中心专家,中国人民大学博士,是关于征信方面想法和一些思考在这里跟大家分享一下。我给大家介绍四部分两个方面,主要通过介绍想达到一个目的,让大家知道什么是征信?什么是征信业务?我们国家有哪些征信机构?我们国家发展什么样子、未来发展什么样?第二部分主要分享一下,在我们征信体系下,我们一些应用和案例,主要想达到这个目的。

圆桌会议:数据分析,是技术也是艺术。

王安是主持人,各位嘉宾就以下3个问题进行不同角度的回答:1. 开源数据。 2. 数据价值。 3. 学习路线。

640

照片座位排序:左1 薛昆,左2 郑志勇, 左3 李洋, 左4 张丹, 左5 王吉培,左6 刘时斌, 左7 王安。

2.2 签名售书

本此会议对于我来说还有一个不同的点,就是签名售书。我的第二本书《R的极客理想-高级开发篇》出版之际,能够近距离与读者的小伙伴们畅聊数据分析的各种技术,以及R语言与其他语言的比较,是非常有意思的一件事情。虽然一共签售了10多本书,我还是非常开心地。如果签售图书,能再降到8折-9折,估计会有更好的效果。嘿嘿!同时欢迎已购书的同学,带书前来签名。

03

最后,感谢CDAS工作人员的辛苦劳动,希望保持高水平会议越办越好!

转载请注明出处:
http://blog.fens.me/meeting-cdas-20150912

打赏作者

R语言构建追涨杀跌量化交易模型

用IT技术玩金融系列文章,将介绍如何使用IT技术,处理金融大数据。在互联网混迹多年,已经熟练掌握一些IT技术。单纯地在互联网做开发,总觉得使劲的方式不对。要想靠技术养活自己,就要把技术变现。通过“跨界”可以寻找新的机会,创造技术的壁垒。

金融是离钱最近的市场,也是变现的好渠道!今天就开始踏上“用IT技术玩金融”之旅!

关于作者:

  • 张丹(Conan), 程序员Java,R,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

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

chaseSell

前言

久经股市的老股民,通常都会使用一种常见的交易策略,追涨杀跌交易法。追涨杀跌法,是股市操作的一个重要技巧,就是在股市上涨时买入股票,股市下跌时卖出股票。如果操作得当是很好的赢利手段,在中国股市2015年上半年的牛市中,追涨杀跌交易法就是交易神器法门。

目录

  1. 什么是追涨杀跌?
  2. 追涨杀跌的建型和实现
  3. 模型优化

1. 什么是追涨杀跌?

追涨杀跌是金融市场的专业术语,是金融技术派操盘的一种方式,与抄底摸顶的操作方式刚好相反。追涨杀跌的操作方法是,金融市场中在金融产品(股票,期货,外汇等)价格上涨的时候买入,以期待涨得更多,并以更高的价格卖出获利;在价格下跌的时候卖出进行止损,不管之前金融产品买入的价格是多少,都立刻卖出,以避免更大的损失。

下面以平安银行(000001)股票日K线图为例,截取2005年到2015年7月的股票数据,股价为向前复权的价格。

01

上图中有3条曲线,黑色线是平安银行向前复权后的每日股价,红色线为20日均线,蓝色线为60日均线。关于均线的介绍,请参考文章 两条均线打天下。图中还有一条红色的水平线虚线,是这10年的股价平均值等于7.14元。这10年间,平安银行股价起起落落,每次上涨都会持续一段时间,那么在我们可以上涨中段追入买进,在大幅下跌之前卖出,就是追涨杀跌法。

追涨

追涨通常有2种情况,短线追涨和中线追涨。以股票交易为例。

  • 短线追涨:当天股价已经涨了5个点或更多,这时追进去买入,期待当天收盘涨停,等下一个交易日高价卖出,这就是短线追涨。
  • 中线追涨:某只股票的股价已经上涨了一段时间,走势很强,底部上涨已经有30%或更多,这个时追进去买入,期待后势持续上涨,是中线追涨。

不论短线追涨还是中线追涨,我们追涨的理由和判断的标准都是一样的,“涨得好的股票说明走势很强,那么追强势股期待股票持续上涨”。但从另一个角度看,追涨的风险也是很大的,关键在于我们不知道它能涨到什么时候,到什么位置可能会回调,什么时候是庄家出货。所以说追涨技巧性很强,什么情况下能追,什么情况下不能追,都是很有讲究的。

杀跌

杀跌也是一门较深的操作技巧,杀得好的话既可以回避风险。如果不能进行杀跌的准确判断,则很可能会发生硬性止损,导致严重的亏损。

采取杀跌战术,必须掌握以下操作要点:

  • 杀跌的重要前提是知变,就是对消息、对量能、对周边各种因素的影响有一个准确的、快速的知变过程。
  • 杀跌要善于观察盘面、形态、消息、舆论等方面的细微变化,在对大盘作出准确估量的基础上,迅速作出反应就是确定卖出哪支股票,卖出多少等。
  • 杀跌要善于思考大盘与目标股之问的正向、反向的相关性,及目标股的能量能等方向的关系,从中找出变动的规律。
  • 当市场利好消息接踵而至时,应随时准备卖出股票。当利好出尽就会转向利空,往往消息明朗时,股价早已下跌大半,导致措手不及。

杀跌的后续操作就比较简单了,只需保持良好的心态,耐心等待见底信号后再抄底。一般只有在底部成功接回股票或换股才算成功的杀跌,否则杀跌会失去意义。应保持耐心,千万不要在股价反弹时贸然介入,否则屡买屡跌、会加大损失,应待股价反转时再介入。

追涨杀跌的技巧

要观大势,看清整个市场多空对决的优势一方是谁。

追涨杀跌的假设条件:

  • 市场处于强势交易格局。强势格局赋予个股良好的运作基础;相反,如果市场处于平衡状态,就不适合进行追涨杀跌,更适合高抛低吸。
  • 市场形成了鲜明并有持续性上涨能力的热点或板块效应。

追涨操作的对象:

  • 市场形成鲜明的可持续性的热点时,可追涨这个热点。从理论上讲,只要把握热点板块就能获利,追涨时应重点关注龙头企业。比如:沪深300指数的成分股,就是不错的选择。
  • 形成明显的上涨趋势的个股可以考虑追涨。个股突破重要的压力线,如头肩底形态的颈线位、整理箱体的箱顶位、三角形的上边眼、长期下降趋势线等,待回抽确认其突破的有效性后,可考虑追涨。

追涨杀跌的注意事项:

  • 追涨时应设好止盈位和止损位,确定自己的大致盈利目标。
  • 追涨杀跌应该注意频率的减少,过于频繁的操作,一旦失误增多会严重影响情绪。
  • 追涨杀跌中要多一分平和的心态,少一些侥幸;多一分理性,少一分感性。

追涨杀跌的市场操作

在弱市中,短线追涨往往容易被套,因为弱市里大部分股票的行情只有一天,当天追得高了,第二天多半没有获利逃出的机会。相反,弱市中,中线追涨比较可取,能够在弱市中保持强势的股票不多,但这种强势反而可以持续。但很多时候,弱市中这样的股票反倒不敢追了。

有些人专门追涨停板,追新股开板,追次新股开板等,对于2015年上半年IPO的新股来说收获颇丰,如暴风科技,中超电缆等,其他的时候可能用这套追涨停策略就行不通了。

001

我自己操作并不会盲目追涨,安全第一,虽然还没有吃过追涨的亏,但由于本人目前还不具备基本面的分析能力,也没有消息的渠道,仅仅从技术指标入手,投机性太重,很容易被庄家玩死的。道理很简单,因为如果追涨了,下跌的空间自然就大了,尤其中线追涨,庄家获利后随时可能出货。这时候就必须要做好杀跌的策略。庄股出货跌个50%太普遍了,而且跌下去就很难再起来,这种时候不杀跌就等于自杀。所以,追涨之前一定要想清楚,务必先设好止损位,不能只憧憬获利的美妙。

杀跌也有讲究,不是一跌就杀,震荡、洗盘是很常见的,问题在于正确地区别震仓与出货是很难的,所以很多人是硬性止损,即预先设定价位或百分比,到这个位置就坚决出局,不管它是震仓还是庄家出货。这个时候如果没有基本面的判断或第一手消息的来源,就容易被震荡出局。当然,和不确定的风险相比,我其实更愿意早点出来。

2. 追涨杀跌的建型和实现

既然我们要进行追涨杀跌的操作,就要定义什么是追涨,什么又是杀跌,需要把追涨杀跌的概念量化出来,从而进行建模和实现。对于短线追涨策略可以简单粗暴地选择当日涨幅超过5%的股票进行买入,第二日开盘卖出或到止损位卖出,并没有太多的技术细节,再计算一下胜率概率,就能知道我们要不要短线追涨。

下文我们将以中线追涨为例,进行建模和程序实现。

那么对于中线追涨的情况,我们核心的策略思路就可以转化为,当股价(成交量)向上突破最近20日最高价格(量)时买入,当股价向下突破最近10日最低价格卖出,并以沪深300成分股做为股票交易的标的。其中,为什么是20日最高和10日最低都是经验值,可以做为模型参数进行训练和优化。选择沪深300成分股为标的,是考虑到这些股票都是各个板块的强势股或龙头股,要符合追涨杀跌的假设条件。

计算公式:


20日最高价 = max(T日股价,T-1日股价 ... , T-19日股价)
20日最高量 = max(T日成交量,T-1日成交量 ... , T-19日成交量)
10日最低价 = min(T日股价,T-1日股价 ... , T-9日股价)

当股价大于等于20日最高价时作为买入信号点,当股价小于等于10日最低价时作为卖出信号点。这样我们就把追涨杀跌的投资理论,变成了一个数学模型。

接下来,我们利用R语言对股票数据的进行操作,来实现一个追涨杀跌模型的实例,从而验证我的们投资理论,是否能发现赚钱的机会。

2.1 数据准备

R语言本身提供了丰富的金融函数工具包,时间序列包zoo和xts,指标计算包TTR,数据处理包plyr,可视包ggplot2等,我们会一起使用这些工具包来完成建模、计算和可视化的工作。关于zoo包和xts包的详细使用可以参考文章,R语言时间序列基础库zoo可扩展的时间序列xts

我本次用到的数据是从 况客 直接导出的,况客 会提供各种类型的金融数据API,让开发者可以免费下载。当然,你也可以用quantmod包从Yahoo财经下载数据。

本文用到的数据,包括A股日K线(向前复权)数据,从2014年7月到2015年日8月,以CSV格式保存到本地文件stock.csv。

数据格式如下:


000001.SZ,2014-07-02,8.14,8.18,8.10,8.17,28604171
000002.SZ,2014-07-02,8.09,8.13,8.05,8.12,40633122
000004.SZ,2014-07-02,13.9,13.99,13.82,13.95,1081139
000005.SZ,2014-07-02,2.27,2.29,2.26,2.28,4157537
000006.SZ,2014-07-02,4.57,4.57,4.50,4.55,5137384
000010.SZ,2014-07-02,6.6,6.82,6.5,6.73,9909143

一共7列:

  • 第1列,股票代码,code,000001.SZ
  • 第2列,交易日期,date,2014-07-02
  • 第3列,开盘价,Open,8.14
  • 第4列,最高价,High,8.18
  • 第5列,最低价,Low,8.10
  • 第6列,收盘价,Close,8.17
  • 第7列,交易量,Volume,28604171

通过R语言加载股票数据,由于数据所有股票都是混合在一起的,而进行计算时又需要按每支票股计算,所以在数据加载时我就进行了转换,按股票代码进行分组,生成R语言的list对象,同时把每支股票的data.frame类型对象转成XTS时间序列类型对象,方便后续的数据处理。


#加载工具包
> library(plyr)
> library(xts)
> library(TTR)
> library(ggplot2)
> library(scales)

# 读取CSV数据文件
> read<-function(file){ 
+   df<-read.table(file=file,header=FALSE,sep = ",", na.strings = "NULL") # 读文件
+   names(df)<-c("code","date","Open","High","Low","Close","Volume")      # 设置列名
+   dl<-split(df[-1],df$code)                                             # 按ccode分组
+   
+   lapply(dl,function(row){                                              # 换成xts类型数据
+     xts(row[-1],order.by = as.Date(row$date))
+   })
+ }

# 加载数据
> data<-read("stock.csv")

# 查看数据类型
> class(data)
[1] "list"

# 查看数据的索引值
> head(names(data))
[1] "000001.SZ" "000002.SZ" "000004.SZ" "000005.SZ" "000006.SZ" "000007.SZ"

# 查看包括的股票数量
> length(data)
[1] 2782

# 获得时间范围
dateArea<-function(sDate=Sys.Date()-365,eDate= Sys.Date(),before=0){  #开始日期,结束日期,提单开始时
  if(class(sDate)=='character') sDate=as.Date(sDate)
  if(class(eDate)=='character') eDate=as.Date(eDate)  
  return(paste(sDate-before,eDate,sep="/"))
}

# 查看股票000001.SZ
> head(data[['000001.SZ']])
               Open     High      Low    Close   Volume
2014-07-02 8.146949 8.180000 8.105636 8.171737 28604171
2014-07-03 8.171737 8.254364 8.122162 8.229576 44690486
2014-07-04 8.237838 8.270889 8.146949 8.188263 34231126
2014-07-07 8.188263 8.204788 8.097374 8.146949 34306164
2014-07-08 8.130424 8.204788 8.072586 8.204788 34608702
2014-07-09 8.196525 8.196525 7.915596 7.973434 58789114

把数据准备好了,我们就可以来建立模型了。

2.2 追涨杀跌模型

为了能拉近我们对市场的了解,我们取从2015年1月1日开始的数据,来创建追涨杀跌的模型。以乐视网(300104)的为例,画出乐视网自2015年以来的每日收盘价,20日最高价和10日最低价。乐视网作为创业板标杆的上市公司,在2015年7月首次被纳入沪深300指数。


# 日K线数据
> title<-'300104.SZ'
> stock<-data[[title]]                                # 获得股票数据
> sDate<-as.Date("2015-01-01")                        # 开始日期
> eDate<-as.Date("2015-08-24")                        # 结束日期
> cdata<-stock[dateArea(sDate,eDate,360)]$Close       # 获得收盘价
> vdata<-stock[dateArea(sDate,eDate,360)]$Volume      # 获得交易量

# 收盘价
> names(cdata)<-"Value"   # 重置列名
> tail(cdata)
           Value
2015-08-14 49.81
2015-08-17 48.30
2015-08-18 45.57
2015-08-19 46.98
2015-08-20 45.79
2015-08-21 42.14
 
# 交易量
> tail(vdata)
             Volume
2015-08-14 42108324
2015-08-17 35939096
2015-08-18 52745702
2015-08-19 43447844
2015-08-20 32916746
2015-08-21 34802494

定义画图函数drawLine(),支持画出多条曲线,包括收盘价,最高价,最低价。


# 画图函数
> drawLine<-function(cdata,titie="Stock",sDate=min(index(cdata)),eDate=max(index(cdata)),breaks="1 year"){
+     if(sDate<min(index(cdata))) sDate=min(index(cdata))
+     if(eDate>max(index(cdata))) eDate=max(index(cdata))  
+     cdata<-na.omit(cdata)
+     
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(cdata[,1],melt=TRUE))
+     g<-g+geom_line()
+     
+     if(ncol(cdata)>1){ # 多条线
+         g<-g+geom_line(aes(colour=Series),data=fortify(cdata[,-1],melt=TRUE))  
+     }
+     
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+ylim(min(cdata$Value), max(cdata$Value))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

# 画出收盘价
# drawLine(cdata,title,sDate,eDate,'1 month')    # 画图

# 计算最近20日的最高价和10日的最低价
> minmax<-function(data,max=20,min=10){
+   d1<-na.locf(data,fromLast=TRUE)
+   d2<-merge(d1,min=runMin(d1,min),max=runMax(d1,max))
+   return(d2[,-1])
+ }
 
# 画出股价,最高价和最低价
> ldata<-cbind(cdata,minmax(cdata))
> drawLine(ldata,title,sDate,eDate,'1 month')    # 画图

01

上图中有3条线,黑色线为乐视网的每日收盘价,蓝色线为最近20日最高价,红色线为最近10日最低价。

根据模型的计算公式,我们计算买入信号,当股价向上突破最近20日最高价格时买入。


# 买入信号函数
> buyPoint<-function(ldata){   
+  idx<-which(ldata$Value == ldata$max)
+  return(ldata[idx,])                                  
+ }

# 计算买入的点
> buydata<-buyPoint(ldata)
> buydata
              Value      min      max
2015-01-08 17.43721 13.70164 17.43721
2015-01-09 17.98709 13.74254 17.98709
2015-01-12 19.53222 13.74254 19.53222
2015-01-15 20.21389 14.74232 20.21389
2015-01-16 22.23619 16.08749 22.23619
2015-01-19 23.04056 16.36016 23.04056
2015-01-20 23.89947 16.36016 23.89947
2015-01-26 24.77656 19.22774 24.77656
2015-01-27 25.16284 19.40043 25.16284
2015-02-05 26.91247 21.99533 26.91247
2015-02-10 28.68482 21.99533 28.68482
2015-02-11 31.55239 21.99533 31.55239
2015-02-12 31.87960 21.99533 31.87960
2015-02-13 35.06983 22.72245 35.06983
2015-02-16 38.57817 24.22213 38.57817
2015-02-17 40.99130 24.46753 40.99130
2015-03-16 41.07764 34.32453 41.07764
2015-03-18 41.94564 34.32453 41.94564
2015-03-24 45.34946 37.17393 45.34946
2015-04-23 46.27199 37.06031 46.27199
2015-04-24 50.89829 37.06031 50.89829
2015-04-27 50.90283 37.06031 50.90283
2015-04-28 55.44277 37.06031 55.44277
2015-04-29 60.98705 37.06031 60.98705
2015-05-06 62.25497 45.19495 62.25497
2015-05-07 66.20413 46.27199 66.20413
2015-05-08 67.23573 50.89829 67.23573
2015-05-11 73.96157 50.90283 73.96157
2015-05-12 81.36000 55.44277 81.36000
2015-05-13 82.49000 57.16514 82.49000

画出买入的信号图,让我们可以直观的看到效果。


# 画图函数
> drawPoint<-function(ldata,pdata,titie,sDate,eDate,breaks="1 year"){
+     ldata<-na.omit(ldata)
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(ldata[,1],melt=TRUE))
+     g<-g+geom_line()
+     g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE))
+     
+     if(is.data.frame(pdata)){
+         g<-g+geom_point(aes(x=Index,y=Value,colour=op),data=pdata,size=4)
+     }else{
+         g<-g+geom_point(aes(x=Index,y=Value,colour=Series),data=na.omit(fortify(pdata,melt=TRUE)),size=4)  
+     }
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

> drawPoint(ldata,buydata$Value,title,sDate,eDate,'1 month')  # 画图

02

如上图所示,蓝色的点为股价大于等于最近20日最高价的点,作为买入信号。所有买入信号点,都是出现在单边上行的牛势中,对于2015年上半年以来的行情来说,追涨的信号会被大量触发。

接下来,我们继续计算卖出信号点,当股价小于等于最近10日最低价时作为卖出信号点。


> # 计算卖出的信号点
> stopPoint<-function(ldata,buydata){  
+     idx<-which(ldata$Value == ldata$min)
+     idx<-idx[which(c(0,diff(idx))!=1)]   # 第一点用0表示
+     
+     selldata<-ldata[idx,]               # 所有低于最小值的点  
+     idx2<-sapply(index(buydata),function(e){  # 买后的卖点
+         head(which(index(selldata)>e),1)
+     })
+     
+     return(selldata[unique(idx2),])
+ } 

# 卖出信号
> selldata<-stopPoint(ldata,buydata)
> selldata
              Value      min      max
2015-01-30 21.99533 21.99533 25.16284
2015-03-06 34.32453 34.32453 40.99130
2015-04-08 38.01011 38.01011 45.34946
2015-05-28 64.68000 64.68000 82.49000

一共有4笔卖出信号,为了让数据更加直观,我们合并买入信号和卖出信号,进行画图可视化。


# 买卖信号,画图
> bsdata<-merge(buydata$Value,selldata$Value)
> names(bsdata)<-c("buy","sell")
> drawPoint(ldata,bsdata,title,sDate,eDate,'1 month') #画图

03

上图中,紫色点为卖出信号点,红色点为买入信号点。我们可以很明显的看出,如果根据交易信号在红色点买入,紫色点卖出,我们是应该赚钱的。那么具体赚了多少呢,我需要计算出来?


> # 合并交易信号
> signal<-function(buy, sell){
+     selldf<-data.frame(sell,op=as.character(rep("S",nrow(sell))))
+     buydf<-data.frame(buy,op=as.character(rep("B",nrow(buy))))
+     sdata<-rbind(buydf,selldf)                                       # 交易信号数据
+     sdata[order(as.Date(row.names(sdata))),]
+ }

# 合并交易信号
> sdata<-signal(buydata,selldata)                                   
> sdata
              Value      min      max op
2015-01-08 17.43721 13.70164 17.43721  B
2015-01-09 17.98709 13.74254 17.98709  B
2015-01-12 19.53222 13.74254 19.53222  B
2015-01-15 20.21389 14.74232 20.21389  B
2015-01-16 22.23619 16.08749 22.23619  B
2015-01-19 23.04056 16.36016 23.04056  B
2015-01-20 23.89947 16.36016 23.89947  B
2015-01-26 24.77656 19.22774 24.77656  B
2015-01-27 25.16284 19.40043 25.16284  B
2015-01-30 21.99533 21.99533 25.16284  S
2015-02-05 26.91247 21.99533 26.91247  B
2015-02-10 28.68482 21.99533 28.68482  B
2015-02-11 31.55239 21.99533 31.55239  B
2015-02-12 31.87960 21.99533 31.87960  B
2015-02-13 35.06983 22.72245 35.06983  B
2015-02-16 38.57817 24.22213 38.57817  B
2015-02-17 40.99130 24.46753 40.99130  B
2015-03-06 34.32453 34.32453 40.99130  S
2015-03-16 41.07764 34.32453 41.07764  B
2015-03-18 41.94564 34.32453 41.94564  B
2015-03-24 45.34946 37.17393 45.34946  B
2015-04-08 38.01011 38.01011 45.34946  S
2015-04-23 46.27199 37.06031 46.27199  B
2015-04-24 50.89829 37.06031 50.89829  B
2015-04-27 50.90283 37.06031 50.90283  B
2015-04-28 55.44277 37.06031 55.44277  B
2015-04-29 60.98705 37.06031 60.98705  B
2015-05-06 62.25497 45.19495 62.25497  B
2015-05-07 66.20413 46.27199 66.20413  B
2015-05-08 67.23573 50.89829 67.23573  B
2015-05-11 73.96157 50.90283 73.96157  B
2015-05-12 81.36000 55.44277 81.36000  B
2015-05-13 82.49000 57.16514 82.49000  B
2015-05-28 64.68000 64.68000 82.49000  S

接下来,我们利用交易信号数据,进行模拟交易。我们设定交易参数和规则:

  • 以10万元人民币为本金。
  • 买入信号出现时,以收盘价买入,每次买入价值1万元的股票。如果连续出现买入信号,则一直买入。若现金不足1万元时,则跳过买入信号。
  • 卖出信号出现时,以收盘价卖出,一次性平仓信号对应的股票。
  • 手续费为0元

下面我们进行模拟交易。


> # 模拟交易
> trade<-function(sdata,capital=100000,fixMoney=10000){ # 交易信号,总资金,每次定投资金
+     amount<-0
+     cash<-capital
+     
+     ticks<-data.frame()
+     for(i in 1:nrow(sdata)){
+         row<-sdata[i,]
+         if(row$op=='B'){
+             if(cash<fixMoney){
+                 print(paste(row.names(row),"No enough cash"))
+                 next
+             }
+             amount0<-floor(fixMoney/row$Value) # 本次交易量
+             amount<-amount+amount0
+             cash<-cash-amount0*row$Value
+         }
+         
+         if(row$op=='S'){
+             cash<-cash+amount*row$Value
+             amount<-0
+         }
+         
+         row$cash<-round(cash,2)
+         row$amount<-amount
+         row$asset<-round(cash+amount*row$Value,2)
+         ticks<-rbind(ticks,row)
+     }
+     
+     
+     ticks$diff<-c(0,round(diff(ticks$asset),2))
+     
+     rise<-ticks[intersect(which(ticks$diff>0),which(ticks$op=='S')),]   # 赚钱的交易
+     fall<-ticks[intersect(which(ticks$diff<0),which(ticks$op=='S')),]   # 赔钱的交易
+     
+     return(list(
+         ticks=ticks,
+         rise=rise,
+         fall=fall
+     ))
+ }

# 交易结果
> result<-trade(sdata,100000,10000)  

来看一下,每笔交易的明细。


> result$ticks
              Value      min      max op      cash amount    asset      diff
2015-01-08 17.43721 13.70164 17.43721  B  90008.48    573 100000.0      0.00
2015-01-09 17.98709 13.74254 17.98709  B  80025.65   1128 100315.1    315.08
2015-01-12 19.53222 13.74254 19.53222  B  70044.68   1639 102058.0   1742.91
2015-01-15 20.21389 14.74232 20.21389  B  60059.02   2133 103175.2   1117.26
2015-01-16 22.23619 16.08749 22.23619  B  50074.97   2582 107488.8   4313.56
2015-01-19 23.04056 16.36016 23.04056  B  40075.37   3016 109565.7   2076.90
2015-01-20 23.89947 16.36016 23.89947  B  30085.39   3434 112156.2   2590.46
2015-01-26 24.77656 19.22774 24.77656  B  20100.44   3837 115168.1   3011.92
2015-01-27 25.16284 19.40043 25.16284  B  10110.79   4234 116650.2   1482.16
2015-01-30 21.99533 21.99533 25.16284  S 103239.02      0 103239.0 -13411.23
2015-02-05 26.91247 21.99533 26.91247  B  93254.49    371 103239.0      0.00
2015-02-10 28.68482 21.99533 28.68482  B  83272.17    719 103896.6    657.54
2015-02-11 31.55239 21.99533 31.55239  B  73301.62   1035 105958.3   2061.78
2015-02-12 31.87960 21.99533 31.87960  B  63323.30   1348 106297.0    338.66
2015-02-13 35.06983 22.72245 35.06983  B  53328.40   1633 110597.4   4300.43
2015-02-16 38.57817 24.22213 38.57817  B  43336.66   1892 116326.6   5729.13
2015-02-17 40.99130 24.46753 40.99130  B  33375.77   2135 120892.2   4565.63
2015-03-06 34.32453 34.32453 40.99130  S 106658.65      0 106658.6 -14233.54
2015-03-16 41.07764 34.32453 41.07764  B  96676.78    243 106658.6      0.00
2015-03-18 41.94564 34.32453 41.94564  B  86693.72    481 106869.6    210.92
2015-03-24 45.34946 37.17393 45.34946  B  76716.83    701 108506.8   1637.24
2015-04-08 38.01011 38.01011 45.34946  S 103361.92      0 103361.9  -5144.89
2015-04-23 46.27199 37.06031 46.27199  B  93367.17    216 103361.9      0.00
2015-04-24 50.89829 37.06031 50.89829  B  83391.11    412 104361.2    999.28
2015-04-27 50.90283 37.06031 50.90283  B  73414.15    608 104363.1      1.87
2015-04-28 55.44277 37.06031 55.44277  B  63434.45    788 107123.4   2760.29
2015-04-29 60.98705 37.06031 60.98705  B  53493.56    951 111492.2   4368.89
2015-05-06 62.25497 45.19495 62.25497  B  43532.77   1111 112698.0   1205.79
2015-05-07 66.20413 46.27199 66.20413  B  33535.95   1262 117085.6   4387.51
2015-05-08 67.23573 50.89829 67.23573  B  23585.06   1410 118387.4   1301.88
2015-05-11 73.96157 50.90283 73.96157  B  13600.25   1545 127870.9   9483.44
2015-05-12 81.36000 55.44277 81.36000  B   3674.33   1667 139301.5  11430.58
2015-05-28 64.68000 64.68000 82.49000  S 111495.89      0 111495.9 -27805.56

一共发生了34笔交易,其中30笔买入,4笔卖出。最后,资金剩余111495.9元,赚了11495元,收益率11.5%。

3. 模型优化

我们看到在强势格局的大牛市中,通过追涨能让我们获利颇丰。其实我们可以把模型再进一步优化的,在构建卖出信号时,是以最近10日最低价为卖出点来看,应该还有更好的卖出点可以选择。那么我们就要优化一下模型,比如按下面的优化条件。当股价低于前一个买入点价格的时进行卖出,把小于等于最近10日最低价设为止损点。按照这样的优化策略,我们是不是可以有更大的收益呢?

这样的优化思路,会让我们策略对波动更敏感,更容易被震荡出局;当然好外在于,可以更快的触发止盈和止损条件,牛市中收益更大。


# 优化条件,当股价低于前一个买入点价格时进行卖出,小于10日最低价为止损点。
> # 计算卖出的信号点
> sellPoint<-function(ldata,buydata){
+     
+     arr<-c()
+     for(i in 1:nrow(buydata)){
+         
+         if(i>1){ # 跳转第一个点
+             date<-index(buydata[i,])#;print(date)      
+             
+             # 价格 小于 上一次的买入的价格就卖出
+             last<-as.vector(buydata[i-1,]$Value) # 上一次买入的价格
+             lst<-ldata[paste(date,"/",sep="")]$Value      
+             idx<-head(which(lst < last),1)
+             
+             if(length(idx)>0){        
+                 arr<-rbind(arr,index(lst[idx]))
+             }
+         }
+     }
+     selldata<-ldata[as.Date(unique(arr)),]
+     
+     # 过滤多余的卖出点
+     bsdata<-merge(buydata$Value,selldata$Value)
+     names(bsdata)<-c("buy","Value")
+     idx1<-which(!is.na(bsdata$Value))
+     idx2<-idx1[which(c(0,diff(idx1))==1)]
+     bsdata$Value[idx2]<-NA
+     return(bsdata$Value[which(!is.na(bsdata$Value))])
+     
+ }

# 卖出信号
> selldata<-sellPoint(ldata,buydata)
> selldata
              Value
2015-01-21 22.81788
2015-01-28 23.60408
2015-02-25 36.89217
2015-03-17 39.97333
2015-03-19 40.96858
2015-03-26 39.25985
2015-05-14 74.24000

我们重新生成了,卖出的信号点有7个,比上次多出3个点,画出交易信号的图形。

04

合并买卖的交易信号。


> sdata<-signal(buydata$Value,selldata$Value)                                   # 合并交易信号
> sdata
              Value op
2015-01-08 17.43721  B
2015-01-09 17.98709  B
2015-01-12 19.53222  B
2015-01-15 20.21389  B
2015-01-16 22.23619  B
2015-01-19 23.04056  B
2015-01-20 23.89947  B
2015-01-21 22.81788  S
2015-01-26 24.77656  B
2015-01-27 25.16284  B
2015-01-28 23.60408  S
2015-02-05 26.91247  B
2015-02-10 28.68482  B
2015-02-11 31.55239  B
2015-02-12 31.87960  B
2015-02-13 35.06983  B
2015-02-16 38.57817  B
2015-02-17 40.99130  B
2015-02-25 36.89217  S
2015-03-16 41.07764  B
2015-03-17 39.97333  S
2015-03-18 41.94564  B
2015-03-19 40.96858  S
2015-03-24 45.34946  B
2015-03-26 39.25985  S
2015-04-23 46.27199  B
2015-04-24 50.89829  B
2015-04-27 50.90283  B
2015-04-28 55.44277  B
2015-04-29 60.98705  B
2015-05-06 62.25497  B
2015-05-07 66.20413  B
2015-05-08 67.23573  B
2015-05-11 73.96157  B
2015-05-12 81.36000  B
2015-05-13 82.49000  B
2015-05-14 74.24000  S

一共发生了37笔交易,其中30笔买入,7笔卖出。最后,资金剩余137483.8元,赚了37483元,收益率37.5%。

我们把卖号信号和止损信号,合并画到一张图上。


# 止损信号
> stopdata<-stopPoint(ldata,buydata)

# 合并买卖信号,止损信号
> bsdata<-merge(buydata$Value,selldata$Value,stopdata$Value)
> names(bsdata)<-c("buy","sell","stop")
> drawPoint(ldata,bsdata,title,sDate,eDate,'1 month') #画图

05

图中红色点为买点,蓝色点为优化的卖点,紫色点为止损点。从图中可以非常清楚的看到,蓝色卖出点要优于紫色的止损点。这样就达到了,模型优化的目的了。虽然只是一个很小的优化,就可以给我们带来不错的收益。

接下来,通过况客平台,我来够建一个每日更新的交易列表,实现把静态图变成了动态图。

追涨杀跌策略在牛市中会让我们赚取非常大的利润,那么对于2015年下半年行情,牛市已经不复存在,震荡市会一直持续,那么我们可以使用均值回归策略,发现逆市中的投资机会

最后总结,本文从 追涨杀跌 的思路开始,到市场特征检验,再到数学公式,R语言建模,再到历史数据回测。通过R语言,很简单地就实现了一个我们脑子中的投资想法。类似的投资想法其实谁都有,利用IT人的技术优势,可以真正地与实际操作结合起来。

这样就可以更容易地实现,从IT技术到价值的转变。IT人,加油!

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

打赏作者

2015WOT移动互联网开发者大会:股市中的R语言量化算法模型

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹(Conan), 程序员Java,R,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-wot-20150725

wot2015

前言

大会历时两天,以“洞察移动互联网用户行为 分享移动应用研发实践”为主题,共设立“架构与设计”、“平台与技术”、“MDSA创新与创业”、“移动游戏”、“算法分析”、“HTML5专场”、“运维安全”、“新浪微博技术”等八大技术专场,并垂直整合了技术和体验,深度服务于参会者与讲师。同时,在内容上也深度结合了目前移动互联网环境,通过新技术应用和实践经验的分享,从创业管理到团队的重组,再延伸到各行业移动架构的演变解密。

我非常有幸作为分享嘉宾参加2015年的WOT移动互联网开发者大会,分享R语言在金融领域中的应用。

目录

  1. 我的演讲主题:股市中的R语言量化算法模型
  2. 会议体验和照片分享

1. 我的演讲主题:股市中的R语言量化算法模型

zd2

股市中的R语言量化算法模型,PPT下载,主要内容来自我的一篇博文:均值回归,发现逆市中的投资机会

全场只有我一个讲R的、讲数据分析的、讲金融的、讲跨学科的,总是觉得有些“另类”。不过相对于去年的情况,今年股市已经让很多的程序员更加了解了金融市场。不知道,听我分享的同学,有没有达到预期呢?欢迎留言!2014年我在WOT的分享介绍,请查看文章:2014全球软件技术峰会WOT:R语言金融数据分析

本次内容同时用到了计算机、金融、数学、统计等多学科知识的结合,我认为这是技术复合人才未来的发展方向。如果说过去10年是房地产的黄金10年,那么未来的10年将是金融的黄金10年。当我们IT人掌握了足够的金融知识,一定会有能力去金融市场抢钱的。

2. 会议体验和照片分享

本次大会结识了,微博、360、蚂蚁金服、足记、美丽说、蘑菇街、唱吧、容联云通讯、1号店、触控科技等移动互联网新贵的技术负责人及一线技术专家,大家通过自身的经历为开发者带来劲味十足的干货分享。

特别值得一提的是 中国科学院计算技术研究所的研究员博导夏时洪老师,花10年所研究的人体运动仿真技术,绝对是未来科技的发展方向。欢迎产业资本找 夏时洪,研发新一代的工业4.0的产品。

haibao

会议主页:http://wot.51cto.com/2015mobile/

2.1 我的分享是在7月25日的算法专场,第三位分享嘉宾。

timeline

王传鹏,新浪微博推荐及广告技术总监,在演讲中主要介绍《新浪微博移动社交推荐广告的技术》,阐述了在1.0到2.0的架构演进过程,新浪微博是如何实现可能感兴趣的人、feed推荐、微群推荐、应用推荐以及基础服务报警监控等功能,并对微博社交推广的算法问题以及解决方法进行了详细描述。最后王传鹏对团队未来的发展方向以及技术规划方向进行了展望。

张洁,蚂蚁金服高级专家,互联网不会颠覆传统金融,而是利用渠道、数据和技术优势,更好地为长尾用户提供普惠金融服务。那么如何《用生物识别的钥匙打开移动金融之门 如何证明“你是你自己”》张老师认为身份认证是移动金融的基石,传统的密码校验方式难以应对层出不穷的威胁,各种生物识别技术成为验证身份的新手段,并正日益走向成熟。此外,她还详述了生物识别的原理、框架和工程实践,并特别结合蚂蚁金服金融风控体系阐述人脸识别应用的发展和未来。

张丹,在《股市中的R语言量化算法模型》的演讲中,况客科技CTO,采用程序演示方式进行了详细阐述了所应用的均值回归理论,如何应用均值回归理论找到投资切入点,均值回归原理,以及均值回归原理的计算公式、数据准备,如何利用R语言做金融模型。他还表示利用IT技术,通过R语言建立金融量化模型,我们能够发现金融市场的规则,找到投资机会,甚至可以规避股市下跌的风险。

zd

刘尚堃,京东商城推荐搜索部总监,在《京东数据驱动下的个性化推荐》话题的分享过程,表示目前个性推荐系统已经涵盖支持整个京东体系,包括PC平台、移动平台、微信平台,京东O2O的推荐,以及拍拍和易讯。通过推荐系统可以帮助公司提升转化率,提升GMV。演讲中,他重点介绍了个性化推荐算法中的基于在线行为、基于长期行为、基于地域的召回模型,以及排序模型,分享了京东个性化推荐系统多年宝贵的实践经验。

2.2 嘉宾大合影

jiabin

最后,感谢51CTO工作人员的辛苦劳动,希望保持高水平会议越办越好!

转载请注明出处:
http://blog.fens.me/meeting-wot-20150725

打赏作者

均值回归,逆市中的投资机会

用IT技术玩金融系列文章,将介绍如何使用IT技术,处理金融大数据。在互联网混迹多年,已经熟练掌握一些IT技术。单纯地在互联网做开发,总觉得使劲的方式不对。要想靠技术养活自己,就要把技术变现。通过“跨界”可以寻找新的机会,创造技术的壁垒。

金融是离钱最近的市场,也是变现的好渠道!今天就开始踏上“用IT技术玩金融”之旅!

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

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

meanReversion

前言

在股票市场中有两种典型的投资策略:趋势追踪(Trend Following) 和 均值回归(Mean Reversion)。 趋势追踪策略的特点在大行情的波动段找到有效的交易信号,不仅简单而且有效,我之前写的一篇文章 两条均线打天下 就属于趋势追踪策略。而均值回归策略则是一种反趋势策略,一波大幅上涨后容易出现下跌,而一波大幅下跌后容易出现上涨。其特点在振荡的在震荡的市场中非常有效,捕捉小的机会,本文就将介绍这种策略。

目录

  1. 均值回归原理
  2. 均值回归模型和实现
  3. 量化选股

1. 均值回归原理

在金融学中,均值回归是价格偏离均衡价格水平一定程度后向均衡价格靠拢的规律。本质上,均值回归就是哲学思想中所说的物极必反,可以简单地概括为“涨多必跌,跌多必涨”的规律。

均值回归是指股票价格无论高于或低于均值(均衡价格水平)都会以很高的概率向均值回归。根据这个理论,股票价格总是围绕其均值上下波动。一种上涨或者下跌的趋势不管其延续的时间多长都不能永远持续下去,最终均值回归的规律一定会出现:涨得太多了,就会向均值移动下跌;跌得太多了,就会向均值移动上升。如果我们认为事物总要回归常态,并且基于这样的预期来做任何决策的时候,我们就是在应用均值回归的理论。

下面以平安银行(000001)股票日K线图为例,可以非常直观的了解均值回归这种现象, 截取2005年到2015年7月的股票数据,股价为向前复权的价格。

01

上图中有3条曲线,黑色线是平安银行向前复权后的每日股价,红色线为20日均线,蓝色线为60日均线。关于均线的介绍,请参考文章 两条均线打天下。图中还有一条红色的水平线虚线,是这10年的股价平均值等于7.14元。这10年间,平安银行的股价经历了几波上涨和下跌,多次穿越7.14平均值。那么这个现象就是我们要讨论的均值回归。

1.1 均值回归的3个特性

均值回归是价值投资理论成立的一个核心理论,具有3个特性:必然性、不对称性、政府调控。

必然性,股票价格不能总是上涨或下跌,一种趋势不管其持续的时间多长都不能永远持续下去。在一个趋势内,股票价格呈持续上升或下降,我们称之为均值回避(Mean Aversion)。当出现相反趋势时就呈均值回归(Mean Reversion),但回归的周期有随机性是我们不能预测。不同的股票市场,回归的周期会不一样的,就算是相同的市场,回归的周期也是不一样的。

我们换支股票,以苏宁云商(002024)股票日K线图为例, 同样截取2005年到2015年7月的向前复权的股价数据,如下图所示。我们看到苏宁云商在2006年到2007年有一波大涨随后下跌;从2009到2010年时,第二波大涨;2013年下半年迎来第三波大涨;2014年下半年到2015年第四波大涨。从图形上可以直观看到,2015年这波涨的最急,波动率也是最大的;从现象中,我们可以判断一种趋势不管其持续的时间多长都不能永远持续下去。

02

不对称性,股价波动的幅度与速度是不一样的,回归时的幅度与速度具有随机性。对称的均值回归才是不正常的、偶然的,这一点也也可以从股票中所验证。

我们合并平安银行(000001)和苏宁云商(002024)股票日K线图为例,所下图所示。两支股票在2007年中,都赶上了大的上涨行情,曲线基本吻合。到2008年2支股票都遇到了大跌,但波动率和速度都是不一样的,随后在2010年到2012年出现了完成不一样的走势,无规律可寻,体现了均值回归时的随机性和不对称性。

03

政府行为,股票收益率不会偏离价值均值时间太久,市场的内在力量会促使其向内在价值回归。市场在没有政府政策的作用下,股票价格会在市场机制下自然地向均值回归。但这并不否定政府行为对促进市场有效性的作用,因为市场偏离内在价值后并不等于立即就会向内在价值回归,很可能会出现持续地均值回避。政府行为会起到抑制市场调节市场的作用,是必不可少的因素之一,市场失灵也是政府参与调控的直接的结果。

对于政府政策行为,比如升准、降准、升息、降息,在股市中都会有比如明显的体现。房地产股、银行股,都会受到国家宏观调控的直接的影响。下如所示,在图中增加万科A(0000002)的股票,图中3条线分别是平安银行,万科A,苏宁云商3支股票。我们发现地产和银行的股价走势是比较相近的,而电商的走势是不太一样的。

另外,增加2种颜色的辅助线,红色为升息的时间点和利率变动值,黄色为降息的时间点和利率变动值。当2007年股市超涨的时候,国家宏观调控通过升息鼓励存款,抑制高股价;当股票超跌的时候,通过降息推动投资和消费。2015年金融改革,政府一直都在降息拉动股市。从图中,我们看到万科A和平安银行对于升息和降息的调控是比较明显的,对于苏宁云商就不是特别的明显了。

04

通过对市场的回顾,我们基本验证了均值回归的理论是和市场的行为是一致的。那么,接下来我们应该如何应用这个理论来找到投资的切入点呢?

1.2 计算原理和公式

从价值投资的角度,我们发现股价会在平均值上下波动,但如果考虑到资金的时间成本,把钱都压在股市中,等待几年的大行情,也是很不划算的。那么我们就需要对价值均值进行重新定义,以20日均值来代替长期均值,找到短周期的一种投资方法。

计算原理:取日K线,以N日均线做为均值回归的短期均衡价格水平(均值),计算股价到均值的差值,求出差值的N日的平均标准差,从而判断差值的对于均值的偏离,当偏离超过2倍标准差时,我们就认为股价超涨或超跌,股价会遵循均值回归的理论,向均值不停地进行修复。

计算公式:


N日平均值     =  [T日股价 + (T-1)日股价 + ... + (T-(N-1))日股价]/N
差值          =  N日平均值 - N日股价
N日差值均值   =  [T日差值 + (T-1)日差值 + ... + (T-(N-1))日差值]/N
N日差值标准差 =  sqrt([(T日差值 - T日差值均值)^2 + ... + ((T-(N-1))日差值 - (T-(N-1))日差值均值)^2 ]/N)

如果N为20日,则


20日平均值     =  [T日股价 + (T-1)日股价 + ... + (T-19)日股价]/20

计算偏离点


T日差值 > T日差值标准差 * 2

我们以偏离点作为买入信号点,以均线和股价的下一个交点做为卖出信号点。这样我们就把均值回归的投资理论,变成了一个数学模型。

2. 均值回归模型和实现

接下来,我们利用R语言对股票数据的进行操作,来实现一个均值回归模型的实例,从而验证我的们投资理论,是否能发现赚钱的机会。

2.1 数据准备

R语言本身提供了丰富的金融函数工具包,时间序列包zoo和xts,指标计算包TTR,数据处理包plyr,可视包ggplot2等,我们会一起使用这些工具包来完成建模、计算和可视化的工作。关于zoo包和xts包的详细使用可以参考文章,R语言时间序列基础库zoo可扩展的时间序列xts

我本次用到的数据是从 况客 直接导出的,况客 会提供各种类型的金融数据API,让开发者可以免费下载。当然,你也可以用quantmod包从Yahoo财经下载。

本文用到的数据,包括A股日K线(向前复权)数据,从2014年7月到2015年日7月,以CSV格式保存到本地文件stock.csv。

数据格式如下:


000001.SZ,2014-07-02,8.14,8.18,8.10,8.17,28604171
000002.SZ,2014-07-02,8.09,8.13,8.05,8.12,40633122
000004.SZ,2014-07-02,13.9,13.99,13.82,13.95,1081139
000005.SZ,2014-07-02,2.27,2.29,2.26,2.28,4157537
000006.SZ,2014-07-02,4.57,4.57,4.50,4.55,5137384
000010.SZ,2014-07-02,6.6,6.82,6.5,6.73,9909143

一共7列:

  • 第1列,股票代码,code,000001.SZ
  • 第2列,交易日期,date,2014-07-02
  • 第3列,开盘价,Open,8.14
  • 第4列,最高价,High,8.18
  • 第5列,最低价,Low,8.10
  • 第6列,收盘价,Close,8.17
  • 第7列,交易量,Volume,28604171

通过R语言加载股票数据,由于数据所有股票都是混合在一起的,而进行计算时又需要按每支票股计算,所以在数据加载时我就进行了转换,按股票代码进行分组,生成R语言的list对象,同时把每支股票的data.frame类型对象转成XTS时间序列类型对象,方便后续的数据处理。


#加载工具包
> library(plyr)
> library(xts)
> library(TTR)
> library(ggplot2)
> library(scales)

# 读取CSV数据文件
> read<-function(file){ 
+   df<-read.table(file=file,header=FALSE,sep = ",", na.strings = "NULL") # 读文件
+   names(df)<-c("code","date","Open","High","Low","Close","Volume")      # 设置列名
+   dl<-split(df[-1],df$code)                                             # 按ccode分组
+   
+   lapply(dl,function(row){                                              # 换成xts类型数据
+     xts(row[-1],order.by = as.Date(row$date))
+   })
+ }

# 加载数据
> data<-read("stock.csv")

# 查看数据类型
> class(data)
[1] "list"

# 查看数据的索引值
> head(names(data))
[1] "000001.SZ" "000002.SZ" "000004.SZ" "000005.SZ" "000006.SZ" "000007.SZ"

# 查看包括的股票数量
> length(data)
[1] 2782

# 查看股票000001.SZ
> head(data[['000001.SZ']])
               Open     High      Low    Close   Volume
2014-07-02 8.146949 8.180000 8.105636 8.171737 28604171
2014-07-03 8.171737 8.254364 8.122162 8.229576 44690486
2014-07-04 8.237838 8.270889 8.146949 8.188263 34231126
2014-07-07 8.188263 8.204788 8.097374 8.146949 34306164
2014-07-08 8.130424 8.204788 8.072586 8.204788 34608702
2014-07-09 8.196525 8.196525 7.915596 7.973434 58789114

把数据准备好了,我们就可以来建立模型了。

2.2 均值回归模型
为了能拉近我们对市场的了解,我们取从2015年1月1日开始的数据,来创建均值回归模型。以平安银行(000001)的为例,画出平安银行的2015年以来的日K线和均线。


# 获得时间范围
> dateArea<-function(sDate=Sys.Date()-365,eDate= Sys.Date(),before=0){  #开始日期,结束日期,提单开始时
+     if(class(sDate)=='character') sDate=as.Date(sDate)
+     if(class(eDate)=='character') eDate=as.Date(eDate)  
+     return(paste(sDate-before,eDate,sep="/"))
+ }
 
# 计算移动平均线
> ma<-function(cdata,mas=c(5,20,60)){
+     if(nrow(cdata)<=max(mas)) return(NULL)
+     ldata<-cdata
+     for(m in mas){
+         ldata<-merge(ldata,SMA(cdata,m))
+     }
+     names(ldata)<-c('Value',paste('ma',mas,sep=''))
+     return(ldata)
+ }

# 日K线和均线
> title<-'000001.SZ'
> SZ000011<-data[[title]]                             # 获得股票数据
> sDate<-as.Date("2015-01-01")                        # 开始日期
> eDate<-as.Date("2015-07-10")                        # 结束日期
> cdata<-SZ000011[dateArea(sDate,eDate,360)]$Close    # 获得收盘价
> ldata<-ma(cdata,c(5,20,60))                         # 选择移动平均指标

# 打印移动平均指标
> tail(ldata)
           Value    ma5    ma20     ma60
2015-07-03 13.07 13.768 15.2545 15.84355
2015-07-06 13.88 13.832 15.1335 15.82700
2015-07-07 14.65 13.854 15.0015 15.79850
2015-07-08 13.19 13.708 14.8120 15.74267
2015-07-09 14.26 13.810 14.6910 15.70867
2015-07-10 14.86 14.168 14.6100 15.67883

我们设置3条移动平均线,分别是5日平均线,20日平均线,60日平均线,当然也可以按照自己的个性要求设置符合自己的周期。画出日K线和均线图。


> drawLine<-function(ldata,titie="Stock_MA",sDate=min(index(ldata)),eDate=max(index(ldata)),breaks="1 year",avg=FALSE,out=FALSE){
+     if(sDate<min(index(ldata))) sDate=min(index(ldata))
+     if(eDate>max(index(ldata))) eDate=max(index(ldata))  
+     ldata<-na.omit(ldata)
+     
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(ldata[,1],melt=TRUE))
+     g<-g+geom_line()
+     g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE))
+ 
+     if(avg){
+         meanVal<<-round(mean(ldata[dateArea(sDate,eDate)]$Value),2) # 均值
+         g<-g+geom_hline(aes(yintercept=meanVal),color="red",alpha=0.8,size=1,linetype="dashed")
+         g<-g+geom_text(aes(x=sDate, y=meanVal,label=meanVal),color="red",vjust=-0.4)
+     }
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+ylim(min(ldata$Value), max(ldata$Value))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

> drawLine(ldata,title,sDate,eDate,'1 month',TRUE)    # 画图

05

如图所示,60日的移动平均线是最平滑的,5日的移动平均线是波动最大的。5日平均线和股价的交叉,明显多于60日平均线和股价的交叉。那么可以说在相同的时间周期内,短周期的移动平均线,比长周期的移动平均线更具有均值回归的特点。

我们分别计算不同周期的,股价与移动平均线的差值的平均标准差。


> getMaSd<-function(ldata,mas=20,sDate,eDate){}) # ...代码省略

# 5日平均线的差值、平均标准差
> ldata5<-getMaSd(ldata,5,sDate,eDate)
> head(ldata5)
              Value      ma5        dif        sd  rate
2015-01-05 13.23673 12.78724 -0.4494869 0.1613198 -2.79
2015-01-06 13.03842 12.89961 -0.1388121 0.1909328 -0.73
2015-01-07 12.79055 12.99215  0.2016081 0.3169068  0.64
2015-01-08 12.36089 12.90292  0.5420283 0.4472248  1.21
2015-01-09 12.46004 12.77733  0.3172848 0.3910700  0.81
2015-01-12 12.20390 12.57076  0.3668606 0.2533165  1.45


# 20日平均线的差值、平均标准差
> ldata20<-getMaSd(ldata,20,sDate,eDate)
> head(ldata20)
              Value     ma20         dif        sd  rate
2015-01-05 13.23673 12.18613 -1.05059293 0.6556366 -1.60
2015-01-06 13.03842 12.23778 -0.80064848 0.6021093 -1.33
2015-01-07 12.79055 12.24810 -0.54244141 0.4754686 -1.14
2015-01-08 12.36089 12.29975 -0.06114343 0.5130410 -0.12
2015-01-09 12.46004 12.33651 -0.12352626 0.5150453 -0.24
2015-01-12 12.20390 12.37163  0.16773131 0.5531618  0.30


# 60日平均线的差值、平均标准差
> ldata60<-getMaSd(ldata,60,sDate,eDate)
> head(ldata60)
              Value     ma60       dif       sd  rate
2015-01-05 13.23673 10.06939 -3.167340 1.264792 -2.50
2015-01-06 13.03842 10.14678 -2.891644 1.271689 -2.27
2015-01-07 12.79055 10.22087 -2.569677 1.269302 -2.02
2015-01-08 12.36089 10.28752 -2.073368 1.258813 -1.65
2015-01-09 12.46004 10.35527 -2.104766 1.247967 -1.69
2015-01-12 12.20390 10.41821 -1.785691 1.233989 -1.45

5日的平均线的差值和平均标准差是最小的,而60日的平均线的差值和平均标准差是最大的。如果我们以5日移动平均线做为均值时,会频繁进行交易,但每次收益都很小,可能都不够手续费的成本;另一方面,如果我们以60日移动平均线做为均值时,交易次数会较少,但可能会出现股票成形趋势性上涨或下跌,长时间不能回归的情况,可能会造成现金头寸的紧张。综合上面的2种情况,我们可以选择20日均线作为均值的标的。

根据模型的计算公式,当差值超过2倍的平均标准差时,我们认为股价出现了偏离,以偏离点做为模型的买入信号,当均线和股价再次相交时做为卖出信号。

上一步,我们已经计算出了偏离值,并保存在rate列中。下面我们要找到大于2倍标准化差的点,并画图。


# 差值和平均标准差,大于2倍平均标准差的点
> buyPoint<-function(ldata,x=2,dir=2){})     # ...代码省略

# 画交易信号点
> drawPoint<-function(ldata,pdata,titie,sDate,eDate,breaks="1 year"){
+     ldata<-na.omit(ldata)
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(ldata[,1],melt=TRUE))
+     g<-g+geom_line()
+     g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE))
+     
+     if(is.data.frame(pdata)){
+         g<-g+geom_point(aes(x=Index,y=Value,colour=op),data=pdata,size=4)
+     }else{
+         g<-g+geom_point(aes(x=Index,y=Value,colour=Series),data=na.omit(fortify(pdata,melt=TRUE)),size=4)  
+     }
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits = c(sDate,eDate))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }
 
> buydata<-buyPoint(ldata20,2,2)                                       # 多空信号点
> drawPoint(ldata20[,c(1,2)],buydata$Value,title,sDate,eDate,'1 month')  # 画图

06

图中蓝色的点就是买入的信号点,由于股票我们只能进行单向交易,即低买高卖,并不能直接做空,所以我们要过滤股价高于移动平均线的点,只留下股价低于移动平均线的点,就是我们的买入信号点。

画出买入信号点,只保留股价低于移动平均线的点。


> buydata<-buyPoint(ldata20,2,1)        # 做多信号点
> drawPoint(ldata20[,c(1,2)],buydata$Value,title,sDate,eDate,'1 month') # 画图

07

计算卖出的信号点,当买入后,下一个股价与移动平均线的交点就是卖出的信号点,我们看一下是否可以赚到钱?!


# 计算卖出的信号点
> sellPoint<-function(ldata,buydata){})     # ...代码省略
> selldata<-sellPoint(ldata20,buydata)

# 买出信号
> selldata
           Value  ma20   dif        sd  rate
2015-07-10 14.86 14.61 -0.25 0.7384824 -0.34

我们把买入信号和卖出信号,合并到一张图上显示,如图所示。


> bsdata<-merge(buydata$Value,selldata$Value)
> names(bsdata)<-c("buy","sell")
> drawPoint(ldata20[,c(1,2)],bsdata,title,sDate,eDate,'1 month') #画图

08

从图上看,我们在绿色点位置进行买入,而在蓝色点位置进行卖出,确实是赚钱的。那么究竟赚了多少钱呢?我们还需要精确的计算出来。


# 合并交易信号
> signal<-function(buy, sell){})    # ...代码省略

# 交易信号数据
> sdata<-signal(buydata,selldata)                                   
> sdata
           Value    ma20     dif        sd  rate op
2015-06-19 14.63 16.0965  1.4665 0.6620157  2.22  B
2015-06-26 13.77 15.7720  2.0020 0.8271793  2.42  B
2015-06-29 13.56 15.6840  2.1240 0.9271735  2.29  B
2015-07-03 13.07 15.2545  2.1845 1.0434926  2.09  B
2015-07-10 14.86 14.6100 -0.2500 0.7384824 -0.34  S

利用交易信号数据,进行模拟交易。我们设定交易参数和规则:

  • 以10万元人民币为本金
  • 买入信号出现时,以收盘价买入,每次买入价值1万元的股票。如果连续出现买入信号,则一直买入。若现金不足1万元时,则跳过买入信号。
  • 卖出信号出现时,以收盘价卖出,一次性平仓信号对应的股票。
  • 手续费为0元

# 模拟交易
> trade<-function(sdata,capital=100000,fixMoney=10000){})    # ...代码省略

# 交易结果
> result<-trade(sdata,100000,10000)  

来看一下,每笔交易的明细。


> result$ticks
           Value    ma20     dif        sd  rate op      cash amount     asset     diff
2015-06-19 14.63 16.0965  1.4665 0.6620157  2.22  B  90007.71    683 100000.00     0.00
2015-06-26 13.77 15.7720  2.0020 0.8271793  2.42  B  80010.69   1409  99412.62  -587.38
2015-06-29 13.56 15.6840  2.1240 0.9271735  2.29  B  70016.97   2146  99116.73  -295.89
2015-07-03 13.07 15.2545  2.1845 1.0434926  2.09  B  60018.42   2911  98065.19 -1051.54
2015-07-10 14.86 14.6100 -0.2500 0.7384824 -0.34  S 103275.88      0 103275.88  5210.69

一共发生了5笔交易,其中4笔买入,1笔卖出。最后,资金剩余103275.88元,赚了3275.88元,收益率3.275%。

在卖出时,赚钱的交易有1笔。


> result$rise
           Value  ma20   dif        sd  rate op     cash amount    asset    diff
2015-07-10 14.86 14.61 -0.25 0.7384824 -0.34  S 103275.9      0 103275.9 5210.69

在卖出时,赔钱的交易,没有发生。


> result$fall
 [1] Value  ma20   dif    sd     rate   op     cash   amount asset  diff  
<0 行> (或0-长度的row.names)

接下来,我们再对比一下,资产净值和股价。


# 资产净值曲线
> drawAsset<-function(ldata,adata,sDate=FALSE,capital=100000){
+     if(!sDate) sDate<-index(ldata)[1]
+     adata<-rbind(adata,as.xts(capital,as.Date(sDate)))
+     
+     g<-ggplot(aes(x=Index, y=Value),data=fortify(ldata[,1],melt=TRUE))
+     g<-g+geom_line()
+     g<-g+geom_line(aes(x=as.Date(Index), y=Value,colour=Series),data=fortify(adata,melt=TRUE))
+     g<-g+facet_grid(Series ~ .,scales = "free_y")
+     g<-g+scale_y_continuous(labels=dollar_format(prefix = "¥"))
+     g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks("2 months"),limits = c(sDate,eDate))
+     g<-g+xlab("") + ylab("Price")+ggtitle(title)
+     g
+ }

> drawAsset(ldata20,as.xts(result$ticks['asset']))  # 资产净值曲线

09

刚才我们是对一支股票进行了测试,发现是有机会的,那么我再换另外一支股票,看一下是否用同样的效果呢?我们把刚才数据操作的过程,封装到统一的quick函数,就可以快速验证均值回归在其他股票的表现情况了。


> quick<-function(title,sDate,eDate){}  # ...代码省略

我们用乐视网(300104)试一下,看看有没有赚钱的机会!!


> title<-"300104.SZ"
> sDate<-as.Date("2015-01-01") #开始日期
> eDate<-as.Date("2015-07-10") #结束日期

> quick(title,sDate,eDate)
$ticks
           Value    ma20     dif       sd  rate op      cash amount     asset     diff
2015-06-19 55.04 69.9095 14.8695 5.347756  2.78  B  90037.76    181 100000.00     0.00
2015-06-23 54.30 68.8075 14.5075 5.477894  2.65  B  80046.56    365  99866.06  -133.94
2015-06-24 56.21 67.8735 11.6635 5.404922  2.16  B  70097.39    542 100563.21   697.15
2015-06-25 51.80 66.8775 15.0775 5.770806  2.61  B  60099.99    735  98172.99 -2390.22
2015-06-26 46.79 65.9830 19.1930 6.580622  2.92  B  50133.72    948  94490.64 -3682.35
2015-06-29 47.05 64.9445 17.8945 7.096230  2.52  B  40159.12   1160  94737.12   246.48
2015-07-07 47.86 58.8150 10.9550 5.401247  2.03  B  30204.24   1368  95676.72   939.60
2015-07-10 57.92 57.3520 -0.5680 5.625309 -0.10  S 109438.80      0 109438.80 13762.08

$rise
           Value   ma20    dif       sd rate op     cash amount    asset     diff
2015-07-10 57.92 57.352 -0.568 5.625309 -0.1  S 109438.8      0 109438.8 13762.08

$fall
 [1] Value  ma20   dif    sd     rate   op     cash   amount asset  diff  
<0 行> (或0-长度的row.names)

从数据结果看,我们又赚到了。一共发生了8笔交易,其中7笔买入,1笔卖出。最后,资金剩余109438.80元,赚了9438.80元,收益率9.43%。

画出交易信号图


> title<-"300104.SZ"
> sDate<-as.Date("2015-01-01") #开始日期
> eDate<-as.Date("2015-07-10") #结束日期

> stock<-data[[title]]
> cdata<-stock[dateArea(sDate,eDate,360)]$Close
> ldata<-ma(cdata,c(20))
> ldata<-getMaSd(ldata,20,sDate,eDate)
> buydata<-buyPoint(ldata,2,1)  
> selldata<-sellPoint(ldata,buydata)
> bsdata<-merge(buydata$Value,selldata$Value)
> drawPoint(ldata[,c(1,2)],bsdata,title,sDate,eDate,'1 month') #画图

10

在恐慌的6月份,当别人都被套牢30%以上的情况下,我们还朿9%正收益,那么应该是多么舒心的一件事情啊!!

3. 量化选股

上文中,我们用2支股票进行了测试,发现均值回归模型是适合于股票交易的。如果我们利用模型对全市场的股票进行扫描,应用会产生更多的交易信号,找到更多的投资机会,这样我们就能如何能获得更大的收益。

那么,接下来我们就根据均值回归的理论进行量化选股。

根据我们之前的经验,当股价与平均标准差的偏离越大,有可能带来的收益就越大。那么通过量化的手段,在整个的市场2700多支股票中,把每天偏离最大股票的找出来进行交易,就可以有效地分配我们的资金,进行更有效的投资。我们要试一下,市场是否是和我们的思路是一致的。

对全市场股票进行扫描,首先计算差值、平均值和平均标准差。


> sDate<-as.Date("2015-01-01")                # 开始日期
> eDate<-as.Date("2015-07-10")                # 结束日期

# 计算差值、平均值和平均标准差
> data0<-lapply(data,function(stock){})       # 代码省略

# 去掉空数据
> data0<-data0[!sapply(data0, is.null)]      

# 全市场股票
> length(data)
[1] 2782

# 有效的股票
> length(data0)
[1] 2697

# 查看第1支股票
> head(data0[[1]])
              Value     ma20         dif        sd  rate
2015-01-05 13.23673 12.18613 -1.05059293 0.6556366 -1.60
2015-01-06 13.03842 12.23778 -0.80064848 0.6021093 -1.33
2015-01-07 12.79055 12.24810 -0.54244141 0.4754686 -1.14
2015-01-08 12.36089 12.29975 -0.06114343 0.5130410 -0.12
2015-01-09 12.46004 12.33651 -0.12352626 0.5150453 -0.24
2015-01-12 12.20390 12.37163  0.16773131 0.5531618  0.30

第一次扫描后,有2697支股票是符合条件的,有85支股票由于数据样本不足被排除。

接下来,继续对2697支股票进行筛选,找到符合要求的买入信号点。


# 计算买入信号
> buys<-lapply(data0,function(stock){})  # ...代码省略 

# 去掉空数据
> buys<-buys[!sapply(buys, is.null)] 

# 查看有买入信号的股票
> length(buys)
[1] 1819

# 查看买入信号
> head(buys)
$`000001.SZ`
           Value    ma20    dif        sd rate
2015-06-19 14.63 16.0965 1.4665 0.6620157 2.22
2015-06-26 13.77 15.7720 2.0020 0.8271793 2.42
2015-06-29 13.56 15.6840 2.1240 0.9271735 2.29
2015-07-03 13.07 15.2545 2.1845 1.0434926 2.09

$`000002.SZ`
           Value   ma20   dif        sd rate
2015-03-05 11.90 12.568 0.668 0.2644101 2.53
2015-03-06 11.94 12.509 0.569 0.2674732 2.13

$`000004.SZ`
           Value    ma20     dif        sd rate
2015-01-05 15.69 17.7210  2.0310 0.7395717 2.75
2015-07-06 26.03 39.1540 13.1240 6.3898795 2.05
2015-07-07 23.43 38.2025 14.7725 6.9421723 2.13
2015-07-08 22.22 37.2635 15.0435 7.4287088 2.03

$`000005.SZ`
           Value    ma20    dif       sd rate
2015-07-06  6.02 10.9600 4.9400 2.381665 2.07
2015-07-07  5.42 10.5655 5.1455 2.333008 2.21

$`000006.SZ`
              Value     ma20       dif      sd rate
2015-01-19 5.829283 6.519462 0.6901792 0.26929 2.56

$`000007.SZ`
           Value    ma20    dif        sd rate
2015-02-06 12.47 14.4200 1.9500 0.6182860 3.15
2015-02-09 12.52 14.3270 1.8070 0.7440473 2.43
2015-02-10 12.10 14.1845 2.0845 0.8484250 2.46

通过计算发现,有1819支股票,在这半年中产生过买入信号。每支股票产生的买入信号的时间和频率都是不同,这样我们就可以把钱分散投资到不同的股票上,同时分散风险。如果交易信号同一天出现在多支的股票上,而我们资金有限,又想让收益最大化,那么我们可以选择偏离值最大的股票进行交易。

接下来,我们用程序找到每日偏离最大的股票。


# 合并数据,从list转型到data.frame
buydf<-ldply(buys,function(e){})    # ...代码省略

# 选出同一日rate最大的股票,做为买入信号
buydatas<-ddply(buydf, .(date), function(row){}) # ...代码省略

# 查看买入信号
> nrow(buydatas)
[1] 81

# 查看买入信号细节
> head(buydatas)
         .id       date      Value       ma20        dif         sd rate
1  002551.SZ 2015-01-05  16.573846  19.565446  2.9916000 0.74591596 4.01
2  002450.SZ 2015-01-06  18.548809  19.766636  1.2178275 0.34008453 3.58
3  300143.SZ 2015-01-07  11.480000  12.603000  1.1230000 0.32028018 3.51
4  300335.SZ 2015-01-08  12.113677  13.139601  1.0259238 0.21760484 4.71
5  300335.SZ 2015-01-09  12.243288  13.043888  0.8005994 0.22940845 3.49
6  300335.SZ 2015-01-12  11.994036  12.941694  0.9476584 0.23168313 4.09

最后,我们选出81个买入信号点,基本上每个交易日都是买入信号。有了买入信号,继续找到卖出信号。


# 卖出信号
> selldatas<-data.frame()     # ...代码省略

# 卖出信号去重
> selldatas<-unique(selldatas)  
> nrow(selldatas)
[1] 33

# 查看买出信号
> head(selldatas)
                Value      ma20         dif        sd  rate       .id       date op
2015-01-12  19.232308 18.848908 -0.38340000 0.9051374 -0.42 002551.SZ 2015-01-12  S
2015-01-08  19.814257 19.729006 -0.08525126 0.3782955 -0.23 002450.SZ 2015-01-08  S
2015-01-28  11.210000 11.019500 -0.19050000 0.7781848 -0.24 300143.SZ 2015-01-28  S
2015-01-21  13.190448 12.899321 -0.29112706 0.3871871 -0.75 300335.SZ 2015-01-21  S
2015-01-213  7.140000  6.989500 -0.15050000 0.2007652 -0.75 002505.SZ 2015-01-21  S
2015-01-22   5.561561  5.490668 -0.07089242 0.2127939 -0.33 600077.SH 2015-01-22  S

通过计算,一共有33个买出信号点。最后,合并买入信号和卖出信号,并计算收益。


> buydatas$op<-'B'                              # 买入标志
> selldatas$op<-'S'                             # 卖出标志
> sdatas<-rbind(buydatas,selldatas)             # 合并数据
> row.names(sdatas)<-1:nrow(sdatas)             # 重设行号
> sdatas<-sdatas[order(sdatas$.id),]            # 按股票代码排序

# 查看合并的信号
> head(sdatas)
          .id       date Value     ma20       dif         sd  rate op
36  000002.SZ 2015-03-05 11.90 12.56800  0.668000 0.26441011  2.53  B
100 000002.SZ 2015-03-16 12.49 12.38050 -0.109500 0.23702768 -0.46  S
58  000553.SZ 2015-05-06 14.35 15.50882  1.158824 0.38429912  3.02  B
110 000553.SZ 2015-05-21 16.57 15.18903 -1.380972 0.55647152 -2.48  S
26  000725.SZ 2015-02-09  2.80  3.11400  0.314000 0.07934585  3.96  B
94  000725.SZ 2015-02-16  3.09  3.06500 -0.025000 0.08182388 -0.31  S

最后,按照股票进行分组,分别计算个股的收益。


# 计算个股的收益
> slist<-split(sdatas[-1],sdatas$.id)      # 按股票代码分组
> results<-lapply(slist,trade)

# 查看信号的股票
> names(results)
 [1] "000002.SZ" "000553.SZ" "000725.SZ" "000786.SZ" "000826.SZ" "002240.SZ" "002450.SZ"
 [8] "002496.SZ" "002505.SZ" "002544.SZ" "002551.SZ" "002646.SZ" "002652.SZ" "300143.SZ"
[15] "300335.SZ" "300359.SZ" "300380.SZ" "300397.SZ" "300439.SZ" "300440.SZ" "300444.SZ"
[22] "600030.SH" "600038.SH" "600077.SH" "600168.SH" "600199.SH" "600213.SH" "600375.SH"
[29] "600490.SH" "600536.SH" "600656.SH" "600733.SH" "600890.SH" "601179.SH" "601186.SH"
[36] "601628.SH" "601633.SH" "601939.SH" "603019.SH"

我们查看万科A(000002)的股票。


> results[['000002.SZ']]$ticks
          date Value    ma20     dif        sd  rate op     cash amount    asset  diff
36  2015-03-05 11.90 12.5680  0.6680 0.2644101  2.53  B  90004.0    840 100000.0   0.0
100 2015-03-16 12.49 12.3805 -0.1095 0.2370277 -0.46  S 100495.6      0 100495.6 495.6

通过优化的规则设计,一共有2笔交易,赚了495元。如要我们没有进行算法优化,一直交易万科A,那么会发生3笔交易,我们可以赚955.95元。


> quick('000002.SZ',sDate,eDate)$ticks
           Value    ma20     dif        sd  rate op      cash amount    asset   diff
2015-03-05 11.90 12.5680  0.6680 0.2644101  2.53  B  90004.00    840 100000.0   0.00
2015-03-06 11.94 12.5090  0.5690 0.2674732  2.13  B  80010.22   1677 100033.6  33.60
2015-03-16 12.49 12.3805 -0.1095 0.2370277 -0.46  S 100955.95      0 100955.9 922.35

本文到此就要结束了!但其实还有很多的事情要做,比如对模型参数的优化,用10日均线代替20日均线,用3倍标准差偏移代替2倍标准差偏移,对样本进行正态分布的检验,结合其他趋势类模型共同产生信号等,这些就不是一篇文章可以解决的事情了。大家可以况客金融平台的网站上,发现更多不一样的策略。

本文从均值回归的理论的介绍开始,到市场特征检验,再到数学公式,R语言建模,历史数据回测,最后找到投资机会,是一套完整的从理论到实践的学习方法。虽然困难重重,但做为有理想的极客,我们是有能力来克服这些困难的。

本文同时用到了计算机、金融、数学、统计等多学科知识的结合,我认为这是技术复合人才未来的发展方向。如果说过去10年是房地产的黄金10年,那么未来的10年将是金融的黄金10年。当我们IT人掌握了足够的金融知识,一定会有能力去金融市场抢钱的。

抓住机会!!程序员,加油!

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

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

打赏作者

融资融券开户考试

用IT技术玩金融系列文章,将介绍如何使用IT技术,处理金融大数据。在互联网混迹多年,已经熟练掌握一些IT技术。单纯地在互联网做开发,总觉得使劲的方式不对。要想靠技术养活自己,就要把技术变现。通过“跨界”可以寻找新的机会,创造技术的壁垒。

金融是离钱最近的市场,也是变现的好渠道!今天就开始踏上“用IT技术玩金融”之旅!

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

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

finance-margin-quiz

前言

证券账户开通有半年的时间了,终于可以申请开通融资融券的业务了。在实盘中的各种摸索和对各种金融产品的尝试,让我体会到金融市场的复杂性和风险的多样性。融资融券的开通,将有助我们实现股市下跌的套利策略。继续摸索,继续前行,为了财富自由之路努力。

目录

  1. 融资融券背景知识
  2. 融资融券开户流程
  3. 融资融券模拟试题及答案

1. 融资融券背景知识

融资融券(securities margin trading)又称“证券信用交易”或保证金交易,是指投资者向具有融资融券业务资格的证券公司提供担保物,借入资金买入证券(融资交易)或借入证券并卖出(融券交易)的行为。包括券商对投资者的融资、融券和金融机构对券商的融资、融券。融资融券的启动,让A股市场告别单边做多机制,是中国证券市场发展的里程碑。

通俗的说,融资交易就是投资者以资金或证券作为质押,向券商借入资金用于证券买卖,并在约定的期限内偿还借款本金和利息;融券交易是投资者以资金或证券作为质押,向券商借入证券卖出,在约定的期限内,买入相同数量和品种的证券归还券商并支付相应的融券费用。总体来说,融资融券交易关键在于一个“融”字,有“融”投资者就必须提供一定的担保和支付一定的费用,并在约定期内归还借贷的资金或证券。

1.1 融资融券交易与普通证券交易的区别

  • 保证金要求不同: 投资者从事普通证券交易须提交100%的保证金,即买入证券须事先存入足额的资金,卖出证券须事先持有足额的证券。而从事融资融券交易则不同,投资者只需交纳一定的保证金,即可进行保证金一定倍数的买卖(买空卖空),在预测证券价格将要上涨而手头没有足够的资金时,可以向证券公司借入资金买入证券,并在高位卖出证券后归还借款;预测证券价格将要下跌而手头没有证券时,则可以向证券公司借入证券卖出,并在低位买入证券归还。
  • 法律关系不同: 投资者从事普通证券交易时,其与证券公司之间只存在委托买卖的关系;而从事融资融券交易时,其与证券公司之间不仅存在委托买卖的关系,还存在资金或证券的借贷关系,因此还要事先以现金或证券的形式向证券公司交付一定比例的保证金,并将融资买入的证券和融券卖出所得资金交付证券公司一并作为担保物。投资者在偿还借贷的资金、证券及利息、费用,并扣除自己的保证金后有剩余的,即为投资收益(盈利)。
  • 风险承担和交易权利不同: 投资者从事普通证券交易时,风险完全由其自行承担,所以几乎可以买卖所有在证券交易所上市交易的证券品种(少数特殊品种对参与交易的投资者有特别要求的除外);而从事融资融券交易时,如不能按时、足额偿还资金或证券,还会给证券公司带来风险,所以投资者只能在证券公司确定的融资融券标的证券范围内买卖证券,而证券公司确定的融资融券标的证券均在证券交易所规定的标的证券范围之内,这些证券一般流动性较大、波动性相对较小、不易被操纵。
  • 与普通证券交易相比: 投资者可以通过向证券公司融资融券,扩大交易筹码,具有一定的财务杠杆效应,通过这种财务杆杠效应来获取收益。
  • 交易控制不同: 投资者从事普通证券交易时,可以随意自由买卖证券,可以随意转入转出资金。而从事融资融券交易时,如存在未关闭的交易合约时,需保证融资融券账户内的担保品充裕,达到与券商签订融资融券合同时要求的担保比例,如担保比例过低,券商可以停止投资者融资融券交易及担保品交易,甚至对现有的合约进行部分或全部平仓。另一方面,投资者需要从融资融券账户上转出资金或者股份时,也必须保证维持担保比例超过300%时,才可提取保证金可用余额中的现金或充抵保证金的证券部分,且提取后维持担保比例不得低于300%。

1.2 融资融券业务流程

融资交易中,投资者向证券公司交纳一定的保证金,融入一定数量的资金买入股票的交易行为。投资者向证券公司提交的保证金可以是现金或者可充抵保证金的证券。而后证券公司向投资者进行授信后,投资者可以在授信额度内买入由证券交易所和证券公司公布的融资标的名单内的证券。如果证券价格上涨,则以较高价格卖出证券,此时只需归还欠款,投资者就可盈利;如果证券价格下跌,融入资金购买证券,这就需要投资者补入资金来归还,则投资者亏损。

融券交易中,投资者向证券公司交纳一定的保证金,整体作为其对证券公司所负债务的担保物。融券交易为投资者提供了新的盈利方式和规避风险的途径。如果投资者如果预期证券价格即将下跌,可以借入证券卖出,而后通过以更低价格买入还券获利;或是通过融券卖出来对冲已持有证券的价格波动,以套期保值。

1.3 相关风险

融资融券交易作为证券市场一项具有重要意义的创新交易机制,一方面为投资者提供新的盈利方式、提升投资者交易理念、改变 “单边市”的发展模式,另一方面也蕴含着相比以往普通交易更复杂的风险。除具有普通交易具有的市场风险外,融资融券交易还蕴含其特有的杠杆交易风险、强制平仓风险、监管风险,以及信用、法律等其他风险。投资者在进行融资融券交易前,必须对相关风险有清醒的认知,才能最大程度避免损失、实现收益。

融资融券交易中可能面临的主要风险包括:

1.3.1 杠杆交易风险

融资融券交易具有杠杆交易特点,投资者在从事融资融券交易时,如同普通交易一样,要面临判断失误、遭受亏损的风险。由于融资融券交易在投资者自有投资规模上提供了一定比例的交易杠杆,亏损将进一步放大。例如投资者以100万元普通买入一只股票,该股票从10元/股下跌到8元/股,投资者的损失是20万元,亏损20%;如果投资者以100万元作为保证金、以50%的保证金比例融资200万元买入同一只股票,该股票从10元/股下跌到8元/股,投资者的损失是40万元,亏损40%。投资者要清醒认识到杠杆交易的高收益高风险特征。

此外,融资融券交易需要支付利息费用。投资者融资买入某只证券后,如果证券价格下跌,则投资者不仅要承担投资损失,还要支付融资利息;投资者融券卖出某只证券后,如果证券的价格上涨,则投资者既要承担证券价格上涨而产生的投资损失,还要支付融券费用。

1.3.2 强制平仓风险

融资融券交易中,投资者与证券公司间除了普通交易的委托买卖关系外,还存在着较为复杂的债权债务关系,以及由于债权债务产生的担保关系。证券公司为保护自身债权,对投资者信用账户的资产负债情况实时监控,在一定条件下可以对投资者担保资产执行强制平仓。

投资者应特别注意可能引发强制平仓的几种情况:

  • 投资者在从事融资融券交易期间,如果不能按照合同约定的期限清偿债务,证券公司有权按照合同约定执行强制平仓,由此可能给投资者带来损失;
  • 投资者在从事融资融券交易期间,如果证券价格波动导致维持担保比例低于最低维持担保比例,证券公司将以合同约定的通知与送达方式,向投资者发送追加担保物通知。投资者如果不能在约定的时间内足额追加担保物,证券公司有权对投资者信用账户内资产执行强制平仓,投资者可能面临损失;
  • 投资者在从事融资融券交易期间,如果因自身原因导致其资产被司法机关采取财产保全或强制执行措施,投资者信用账户内资产可能被证券公司执行强制平仓、提前了结融资融券债务。

1.3.3监管风险

监管部门和证券公司在融资融券交易出现异常、或市场出现系统性风险时,都将对融资融券交易采取监管措施,以维护市场平稳运行,甚至可能暂停融资融券交易。这些监管措施将对从事融资融券交易的投资者产生影响,投资者应留意监管措施可能造成的潜在损失,密切关注市场状况、提前预防。

  • 投资者在从事融资融券交易期间,如果发生标的证券暂停交易或终止上市等情况,投资者将可能面临被证券公司提前了结融资融券交易的风险,由此可能会给投资者造成损失;
  • 投资者在从事融资融券交易期间,如果证券公司提高追加担保物和强制平仓的条件,造成投资者提前进入追加担保物或强制平仓状态,由此可能会给投资者造成损失;
  • 投资者在从事融资融券交易期间,证券公司制定了一系列交易限制的措施,比如单一客户融资规模、融券规模占净资本的比例、单一担保证券占该证券总市值的比例等指标,当这些指标到达阈值时,投资者的交易将受到限制,由此可能会给投资者造成损失;
  • 投资者从事融资融券交易的证券公司有可能因融资融券资质出现问题,而造成投资者无法进行融资融券交易,由此可能给投资者带来损失。

1.3.4 其他风险

  • 投资者在从事融资融券交易期间,如果中国人民银行规定的同期金融机构贷款基准利率调高,证券公司将相应调高融资利率或融券费率,投资者将面临融资融券成本增加的风险;
  • 投资者在从事融资融券交易期间,相关信息的通知送达至关重要。《融资融券合同》中通常会约定通知送达的具体方式、内容和要求。当证券公司按照《融资融券合同》要求履行了通知义务后即视为送达,如果投资者未能关注到通知内容并采取相应措施,就可能因此承担不利后果。
  • 投资者在从事融资融券交易期间,如果因信用证券账户卡、身份证件和交易密码等保管不善或者将信用账户出借给他人使用,可能遭受意外损失,因为任何通过密码验证后提交的交易申请,都将被视为投资者自身的行为或投资者合法授权的行为,所引起的法律后果均由该投资者承担。
  • 投资者在从事融资融券交易期间,如果其信用资质状况降低,证券公司会相应降低对投资者的信用额度,从而造成投资者交易受到限制,投资者可能遭受损失。

投资者在参与融资融券交易前,应认真学习融资融券相关法律法规、掌握融资融券业务规则,阅读并理解证券公司融资融券合同和风险揭示条款,充分评估自身的风险承受能力、做好财务安排,合理规避各类风险。

1.4 融资融券对市场的影响

信用交易中产生的融资余额(每天融资买进股票额与偿还融资额间的差额)和融券余额(每天融券卖出股票额与偿还融券间的差额)提供了一个测度投机程度及方向的重要指标:融资余额大,股市将上涨;融券余额大,股票将下跌。融资融券额越大,这种变动趋势的可信度越大。因此,在融资融券正式推出以后,公开的融资融券的市场统计数据可以为投资者的投资分析提供新的信息。

市场每日融资融券数据
margin

1.5 融券交易特点

融券标的证券:可供融券卖出的证券品种,称为融券标的证券。沪深证券交易所根据证券的股东人数、流通市值、换手率、波动幅度等条件确定融券标的证券名单,证券公司可在交易所公布的融券标的证券范围内进一步选择,并随交易所名单变动而相应调整。融券标的证券品种可以是股票、证券投资基金、债券及其他证券,投资者仅可在此范围内融券卖出。

融券委托价格:投资者在进行融券交易前,应了解融券交易委托价格规则:

  • 融券卖出交易只能采用限价委托,不能采用市价委托;
  • 融券卖出申报价格不得低于该证券的最新成交价,如该证券当天未产生成交的,申报价格不得低于前收盘价。若投资者在进行融券卖出委托时,申报价格低于上述价格,该笔委托无效。

融券保证金比例:是指投资者融券卖出时交付的保证金与融券交易金额的比例,计算公式为:

融券保证金比例=保证金/(融券卖出证券数量×卖出价格)×100%

沪深交易所规定,融券保证金比例不得低于50%。

融券债务偿还:投资者可通过直接还券、买券还券两种方式偿还融券负债。直接还券是指,投资者使用信用证券账户中与其负债证券相同的证券申报还券,买券还券是指,投资者通过其信用证券账户选择“买券还券”的交易类型进行证券买入,
投资者买券还券时应注意三个要点:

  • 买券还券先使用融券卖出冻结资金,如融券卖出资金不足,则使用投资者信用账户内自有资金;
  • 买券还券委托的数量必须为100股的整数倍;
  • 投资者买券还券超过融券负债数量的部分称为余券,存放在证券公司融券专用证券账户。投资者可申请将余券从证券公司融券专用证券账户划转至投资者信用证券账户。

投资者在融券卖出时还应注意:

  • 融券卖出负债以市值计算,将随卖出证券价格而波动;
  • 融券交易具有杠杆交易特性,证券价格的合理波动即可能引致较大风险。

1.6 融资交易特点

融资标的证券:可供融资买入的证券品种,称为融资标的证券。沪、深交易所《融资融券交易试点实施细则》规定,融资标的证券品种可以是在交易所上市的股票、证券投资基金、债券及其他证券。沪深证券交易所将按照规定确定融资标的证券名单,证券公司可在交易所公布的融资标的证券范围内进一步选择,并随交易所名单变动而相应调整,投资者仅可在此范围内融资买入。

融资保证金比例:融资保证金比例是指,投资者融资买入时交付的保证金与融资交易金额的比例,计算公式为:

融资保证金比例=保证金/(融资买入证券数量×买入价格)×100%

沪深交易所规定,融资保证金比例不得低于50%。

融资债务偿还:投资者可通过直接还款、卖券还款两种方式偿还融资负债。直接还款是指,投资者在信用资金账户内存入资金,通过融资融券交易系统中“直接还款”指令偿还融资债务,

融资交易应注意的二个风险:

  • 投资者在从事融资交易期间,如果中国人民银行规定的同期金融机构贷款基准利率调高,证券公司将相应调高融资利率,投资者的融资成本将增加。
  • 投资者在从事融资交易期间,如果发生融资标的证券范围调整、标的证券暂停上市或终止上市等情况,投资者可能被证券公司要求提前了结融资交易并可能因此带来损失。

在融资买入时还应注意:融资交易具有杠杆交易特性,证券价格的合理波动就能放大投资者的盈利和亏损,投资者需要有较强的风险控制能力和承受能力。

2. 融资融券开户流程

第一步:投资者需确定拟开户的证券公司及营业部是否具有融资融券业务资质

证券公司开展融资融券业务试点,必须经中国证监会的批准;未经证监会批准,任何证券公司不得向客户融资、融券,也不得为客户与客户、客户与他人之间的融资融券活动提供任何便利和服务。而且,证券公司对其下属营业部开展融资融券业务也有资格规定,不一定所有营业部都可办理融资融券业务。

第二步:投资者需确定自身是否符合证券公司融资融券客户条件

融资融券业务对投资者的资产状况、专业水平和投资能力有一定的要求,证券公司出于适当性管理的原则,将对申请参与融资融券业务的投资者进行初步选择。投资者在办理融资融券业务开户手续前,需评估、确定自身是否满足证券公司的融资融券客户选择标准。

第三步:投资者需通过证券公司总部的征信

证券公司在向客户融资、融券前,将对申请融资融券业务的投资者进行征信,了解客户的身份、财产与收入状况、证券投资经验和风险偏好,并以书面和电子方式予以记载、保存。证券公司将根据投资者提交的申请材料、资信状况、担保物价值、履约情况、市场状况等因素,综合确定投资者的信用额度。

第四步:投资者需与证券公司签订融资融券合同、风险揭示书等文件

投资者与证券公司签订融资融券合同前,应当认真听取证券公司相关人员讲解业务规则、合同内容,了解融资融券业务规则和风险,并在融资融券合同和风险揭示书上签字确认。投资者只能与一家证券公司签订融资融券合同,向其融入资金和证券。

对融资融券合同的如下内容,投资者应当特别关注和了解:(一)融资、融券的额度、期限、利(费)率、利息(费用)的计算方式;(二)保证金比例、维持担保比例、可充抵保证金证券的种类及折算率、担保债权范围;(三)追加保证金的通知方式、追加保证金的期限;(四)投资者清偿债务的方式及证券公司对担保物的处分权利;(五)担保证券和融券卖出证券的权益处理等。

第五步:投资者在开户营业部开立信用证券账户与信用资金账户

开立信用证券账户:投资者与证券公司签订融资融券合同后,证券公司将按照证券登记结算机构的规定,为投资者开立实名信用证券账户。投资者信用证券账户是证券公司客户信用交易担保证券账户的二级账户,用于记载投资者委托证券公司持有的担保证券的明细数据。投资者用于一家证券交易所上市证券交易的信用证券账户只能有一个。投资者信用证券账户与其普通证券账户的开户人的姓名或者名称应当一致。

信用证券账户独立于普通证券账户,是新开的证券账户。投资者在进行融资融券交易前,需将用于担保的可充抵保证金证券从普通证券账户划转至信用证券账户。融资融券交易了结后,投资者可以将担保证券划转回普通证券账户。在融资融券交易期间,经证券公司同意,投资者可将超过维持担保比例300%以上部分的担保证券划转回普通证券账户。

开立信用资金账户:投资者在与证券公司签订融资融券合同后,需与证券公司、商业银行签订客户信用资金第三方存管协议。证券公司应当通知第三方存管银行,根据投资者的申请,为其开立实名信用资金账户。投资者信用资金账户是证券公司客户信用交易担保资金账户的二级账户,用于记载投资者交存的担保资金的明细数据。投资者只能开立一个信用资金账户。
经过以上步骤,投资者在证券公司的开户手续已经办妥。当投资者提交了足额的担保物之后,就可以开始进行融资融券交易了。

3. 融资融券模拟试题及答案

在办理开户流程的时候,还要进行两个在线的考试,基础测试 和 综合测试,分别是20道单选题,都必须80分以上才能算通过(每天只能考一次)。考试大纲其实就是融资融券的各种条款,我们能从网上找到一些试题及答案(题库都有变化,必须要理解记住)。以我亲身经历来说,大家一定要在家踏踏实实把题做完,不要去营业厅在百忙之中临时答题,不仅耽误时间,还很容易考试不及格。

我就是之前没准备,到了营业厅临时通知要先做题,然后我就站在热闹的大厅里,花了1个半小时才完成试题,不时还有各种大妈的观摩、各种的乱出主意,好在是一次性通过了 80分 和 85分。开放的电脑,鼠标那么的难用,而且只能用IE7浏览器,再通过百度搜索找答案,怎么都感觉都是不靠谱的。目前,就是坐等融资融券开通了!

最后附上网上的找到的融资融券试题及答案,因为考题有变化,与原题不是完全一样。

1、假设客户提交市值100万元的股票A作为进行融资融券交易的担保物,折算率为70%,融资保证金比例为0.5。则客户可以融资买入的最大金额为( 140万元 )。本例中客户的佣金及融资利息、融券费用均忽略不计。
A. 200万元 B. 50万元 C . 140万元 D. 70万元

2、客户信用账户维持担保比例超过( 300% )时,客户可以提取保证金可用余额中的现金或充抵保证金的有价证券,但提取后维持担保比例不得低于( 300% )。交易所另有规定的出外。
A 150%,130%
B 150%,150%
C 300% 300%
D 300% 150%

3、目前,融资融券的交易期限最长是( 180天 )
A.30 B.60 C.90 D.180

4、其他条件不变,可充抵保证金的证券折算率下降会导致保证金可用余额( 减少 )。
A、 无法判断; B、减少; C、 不变; D、 增加。

5、以下关于信用证券账户内资产的说法,正确的是( C )
A. 信用账户内仅证券作为担保财产
B.信用账户内证券所派生的红利不作为担保财产
C.信用账户内的所有资产均作为担保资产
D.信用账户内仅资金作为担保资产

6、担保证券涉及投票权行使时,应当由( C )
A、证券公司根据自己的意愿直接进行投票
B、证券公司通知客户到证券持有人会议(如股东大会、基金持有人大会、债权人会议等)进行投票
C、证券公司作为名义持有人直接参加投票,但投票前事先征求客户投票意愿,根据客户的意愿进行投票
D、证券公司可自行放弃投票

7、融资融券合同应约定融资融券特定的( B )关系
A、财产委托
B、财产信托
C、财产买卖
D、财产托管

8、下列说法错误的是(D )
A、投资者在开立信用账户前应在证券公司融资融券风险揭示书上签字留痕
B、投资者办理信用账户销户前应当了结融资融券交易,有剩余证券的将其划至普通证券账户
C、投资者在开户从事融资融券交易前,必须了解所在证券公司是否具有开展融资融券业务资格
D、投资者更换融资融券交易委托证券公司的,可以直接申请信用证券账户的转托管,而不需要注销其原先的信用证券账户。(必须再原公司先注销,再去新证券公司重新签订合同,重开信用证券账户)

9、客户维持担保比例低于平仓维持担保比例时,证券公司通知客户追加担保物是( A )
A、合同约定的义务
B、为了提高客户服务质量
C、其他三项都不对
D、客户提出的服务要求

10、某投资者当前融资融券债务为10万元,信用账户的资产总额为12万元,维持担保比例为120%,证券公司通知投资者在约定的期限追加担保物,并使追加后的维持担保比例不得低于150%,投资者至少需要追加(D )现金或等值证券。
A、4万元 B、1万元 C、2万元 D、3万元

11、投资者信用账户内有60万元现金和100万元市值的某证券,假设该证券的折算率为60%,那么,该投资者信用账户内的保证金金额为( C )万元。
A、160 B、136 C、120 D、100

12、投资者追加担保物后的维持担保比例不得低于(B )
A、140% B、150% C、120% D、130%

13、维持担保比例的计算公式是(A ):
A、维持担保比例=(现金+信用证券账户内证券市值)/(融资买入金额+融券卖出证券数量×市价+利息及费用)
B、维持担保比例=(现金+信用证券账户内证券市值)/(融资买入金额+融券卖出证券数量×市价)
C、维持担保比例=(现金+信用证券账户内证券前一交易日收盘价)/(融资买入金额+融券卖出证券数量×市价+利息及费用)
D、 维持担保比例=信用证券账户内证券市值/(融资买入金额+融券卖出证券数量×市价+利息及费用)

14、某投资者信用账户中有100元保证金可用余额,拟融券卖出融券保证金比例为50%的证券C,则该投资者理论上可融券卖出(D200)元市值的证券C。本例中客户的佣金及融资利息、融券费用均忽略不计。
A、50 B、100 C、150 D、200

15、资者融资余额为100万元,担保物的价值为125万。投资者需追加的担保物最少为(C )。
A、100万元x300%-125万元=175万元
B、100万元x130%-125万元=5万元
C、100万元x150%-125万元=25万元
D、100万元x200%-125万元=75万元

16、某投资者当前融资融券债务为10万元,信用账户的资产总额为12万元,维持担保比例为120%,证券公司通知投资者在约定的期限追加担保物,并使追加后的维持担保比例不得低于150%,投资者选择卖券还款了结部分债务使维持担保比例达到150%的要求,投资者至少需要了结(D )债务。 (12-X/(10-X)=150%
A、 4万元 B、8万元 C、2万元 D、6万元

17、客户甲向其信用账户提交了150000元现金和5000股“证券A”作为担保品。假设“证券A”市价为20元,其折算率为70%,“证券B”市价为10元,客户甲以每股10元融资买入20000股“证券B”,此时其信用账户的维持担保比例是(B225% )。本例中客户的佣金及融资利息、融券费用均忽略不计。
A.2.25% B、225% C、125% D、1.25%

18、融券卖出的申报价格( )该证券的最近成交价;当天没有产生成交的,申报价格( A)其前收盘价。
A、不得低于;不得低于
B、不得高于;不得高于
C、不得低于;不得高于
D、不得高于;不得低于

19、假设“证券A”属于交易所规定的可充抵保证金证券,折算率为70%,证券公司甲将其折算率下调为50%。当前“证券A”市价为20元,如果客户向证券公司甲提交10000股“证券A”作为担保物,则其可充抵保证金为(A )元。

A、100000
B、10000
C、140000
D、200000

20、假设客户信用账户有市值100万元的可充抵保证金证券A,融券卖出50万元的标的证券B,A和B的折算率均为70%,则维持担保比例为( B)。本例中客户的佣金及融资利息、融券费用均忽略不计。(100+50/50)
A、200%
B、300%
C、210%
D、140%
维保比例与保证金、折算率无关

21投资者从信用账户转出资产受到的限制有(A )

A、只有账户中维持担保比例超过300%部分的资产,经过证券公司审核同意后才能从信用账户中转出,转出后维持担保比例不低于300%

B、账户中维持担保比例超过150%部分的资产可以从信用账户中转出

C、没有限制,投资者可根据意愿自行转出

D、只需要经过中国证券登记结算公司审核同意即可,不受维持担保比例限制

22、假设客户提交市值100万元的股票A作为进行融资融券交易的担保物,折算率为70%,融资保证金比例为0.5。客户融资买入50万元的股票B,则保证金可用余额为(C)。本例中客户的佣金及融资利息、融券费用均忽略不计。
A、20万元 、B、70万元 C、45万元 D、50万元 100万元市值X70%=保证金70万 保证金比例50%融资买入50万需要交付25万保证金
70万-25万=45万

23、客户进行融资融券交易时,能融资买入或融券卖出的证券范围是(C )
A、所有上市证券 B、可充抵保证金的有价证券 C、标的证券 D、大盘蓝筹

24、在保证金金额一定的情况下(D ):
A、保证金比例越低,投资者融资融券的规模就越小,财务杠杆效应越高
B、保证金比例越高,投资者融资融券的规模就越大,财务杠杆效应越高
C、保证金比例越低,投资者融资融券的规模就越大,财务杠杆效应越低
D、保证金比例越高,投资者融资融券的规模就越小,财务杠杆效应越低

25、交易所规定的可充抵保证金的证券的折算率中,深圳100指数成份股股票的折算率最高不超过(D )。 A 、65% B、80% C、90% D、70%

26、根据沪深交易所实施细则,证券公司可以根据不同标的证券的折算率相应地确定其保证金。假设某证券公司公布的最低融资保证金比例为60%,具体到某标的证券的融资保证金比例=60%+(1-该证券的折算率)。现某客户信用账户内有资金余额1万元、股票A为1万股(折算率为0.65,最新价位5元)。该客户拟以4.5元价格融资买入股票B(折算率为0.75),请问该客户的保证金余额、最多可融资金额、可融资买入股票B数量分别为( A),本例中客户的佣金及融资利息、融券费用均忽略不计: (A)

A、42500元、50000.00元、11100股
B、42500元、50000.00元,11111股
C、60000元、70588.23元、15600股
D、42500元、56666.67元、12500股

27、投资者从事融资融券交易,可以通过( D )方式向信用资金账户转入现金。
A、从普通资金账户直接转入 B、其他三项都不对 C、柜台现金转入 D、通过银行第三方存管转入

28、以下叙述错误的是(A )。
A 、融资融券可以采用大宗交易方式。
B、未了结相关融券交易前,投资者融券卖出所得价款除买券还券外不得他用。
C、投资者信用证券账户不得买入或转入除担保物和标的证券范围以外的证券,不得用于从事债券回购交易。
D、 投资者卖出信用证券账户内证券所得价款,须先偿还其融资欠款。

30、某客户账户内有100万元市值的股票A,如果该股票的折算率为0.7,则100万元股票A股票可以充抵的保证金是(A )?
A 、70万元 B、50万元 C、80万元 D、100万元

31、、( D)是客户在证券公司开立的用于记载客户委托证券公司持有的担保证券的明细数据,是证券公司客户信用交易担保证券账户的二级账户。
A 、融资专用资金账户 B、融券专用证券账户 C、信用资金账户 D、信用证券账户

32、《融资融券合同必备条款》中规定,下列哪种情形不属于合同必须载明的情形(B )。 A、投资者的姓名 B、投资者的配偶姓名 C、投资者的住所 D、开立信用账户的有关内容

33、融资利率的收取标准为:( D )
A、不低于金融机构同期存款基准利率 B、不低于行业水平 C、不低于金融机构5年期贷款基准利率 D、不低于金融机构同期贷款基准利率

34、投资者信用证券账户明细数据在证券公司和证券登记结算机构查询结果不一致的,由(B )负责向投资者作出解释
A、 证券登记结算机构 B、证券公司 C、证券交易所 D、存管银行

35、客户向证券公司提供的,可以作为“担保物”充抵保证金的是以下哪种(C)?
A汽车 B房产 C现金+符合规定条件的股票 D定期存折

36、客户及其一致行动人持有一家上市公司股票或其权益的数量,合计达到规定的比例时,应当依法履行相应的信息报告、披露或者要约收购义务。即当出现下列情形(A )时,须履行相应的信息报告、披露或者要约收购义务。
A其他三项中的任何情形
B客户及其一致行动人信用账户持有数量达规定比例客户及其一致行动人普通账户持有数量达规定比例
C客户及其一致行动人普通账户持有数量未达规定比例,
D客户及其一致行动人信用账户持有数量未达规定比例,但是客户及其一致行动人普通账户和信用账户持有数量之和达规定比例

37、标的证券是投资者融入资金可买入的证券和证券公司可对投资者融出的证券,(A )按照从严到宽、从少到多、逐步扩大的原则,根据融资融券业务试点的进展情况,在满足规定的证券范围内审核、选取标的证券名单,并向市场公布。
A 、证券交易所 B、中国证券业协会 C、中国证监会 D、证券公司

38、证券公司不得向下列(D)客户融资融券
A、交易结算资金已纳入第三方存管
B、已在该证券公司从事证券交易二年以上
C、具有一定的投资能力和风险承受能力
D、有重大违约记录

39、证券公司向客户收取融资融券的利息费用时,按( C)时间标准计算。 A、 按“季”计息 B、 按“月”计息 C、 按“天”计息 D 、按“年”计息(按日计提,按月计收)

40、投资者卖出信用证券账户内证券所得价款(B)
A、可以自行考虑是否归还融资欠款
B、先偿还其融资欠款
C、可以在当日交易收市前买入其他证券
D、可以直接转出信用证券账户

41、、“融资”是指客户向证券公司借入什么(C )?
A、债券 B、 基金 C、资金 D、股票

42、客户及其一致行动人(B )达到规定的比例时,应当依法履行相应的信息报告、披露或者要约收购义务。
A、只有通过普通证券账户持有一家上市公司股票的数量,或只有通过信用证券账户持有一家上市公司权益的数量
B、合计通过普通证券账户和信用证券账户持有一家上市公司股票或其权益的数量
C、只有通过普通证券账户持有一家上市公司股票的数量
D、只有通过信用证券账户持有一家上市公司权益的数量

43、根据交易所的规定,投资者融资买入或融券卖出时,融资、融券保证金比例不得低于( A)。 A、50% B、60% C、80% D、70%

44、融资融券业务试点期间,券商可以将以下证券融给客户(C)
A、券商其他客户的证券
B、券商自有证券和基金公司提供的证券
C、券商自有的证券
D、券商自有的证券和金融公司提供的证券

45、客户到期未偿还融资融券债务的,则证券公司将采取下列哪项措施( D )。
A、给客户延期
B、给客户增加新的融资融券额度
C、根据约定采取强制平仓措施,处分客户担保物,不足部分不得向客户追索
D、根据约定采取强制平仓措施,处分客户担保物,不足部分可以向客户追索

46、客户信用账户的维持担保比例不得低于(C )。
A 100%
B 150%
C 130%
D 300%

47、担保证券上市公司股东大会议案需要投票赞成、反对或弃权时( B )。
A、不允许参加投票
B、按客户的意见以券商的名义投票
C、以每位客户的名义投票
D、按券商的意见以券商的名义投票

48、客户查询信用证券账户的明细数据(D )。
A、只能在券商查询
B、只能在登记公司查询
C、可以在券商和登记公司查询,两者查询结果不一致时以登记公司的为准
D、可以在券商和登记公司查询,两者查询结果不一致时由券商向客户解释

49、融资融券业务涉及的基本的法律关系包括(C)
A、借贷关系
B、买卖关系
C、委托买卖关系、借贷关系及因借贷产生的债权债务的担保关系
D、因借贷产生的债权债务的担保关系

50、在交易所上市的下列证券,不在标的证券范围的是(C)
A、证券投资基金
B、交易所认可的其他证券
C、ST股票
D、债券

51、证券公司一般规定以下哪些客户不能申请融资融券业务(D)
A、拒绝提供相关资料,或提供虚假资料的客户
B、公司认定其证券投资经验,风险承受能力不足以开展融资融券交易的客户
C、本证券公司的股东及相关关联人
D、其他三项都包括
52、根据证监会《证券公司融资融券业务试点管理办法》的规定,投资者可以选择(B1 )家证券公司签订融资融券合同,在一个证券市场可委托证券公司为其开( B1)个信用证券账户
A 1,2 B 1,1 C 2,2 D多,多

53、关于“标的证券”正确的说法是(D)
A、证券公司确定标的证券名单,可以超出证券交易所公布的标的证券名单
B、标的证券名单由中国证监会确定并向市场公布
C、在沪深交易所上市的所以证券
D、标的证券是投资者融入资金可买入的证券和证券公司可对投资者融出的证券

54、某投资者信用账户内有100元现金和200元市值的证券A,假设证券A的折算率为60%,拟融资买入融资保证金比例为50%的证券B,则该投资者理论上可融资买入(A)元市值的证券B。本例中客户的佣金及融资利息、融券费用均忽略不计。
A、440 B、400 C、480 D、600

55、投资者用于一家证券交易所的上市证券交易的信用(融资融券交易)证券账户可以有( C)个
A 3个 B 2个 C 1个 没有限制

56、在融资融券交易期间,投资者信用账户维持担保比例超过 (C )时,客户可以提取保证金可用余额中的现金或充抵保证金的有价证券,但提取后维持担保比例不得低于300%。交易所另有规定的除外
A 100% B 200% C 300% D 400%

57、证券公司在向客户融资、融券前,应当与其签订载入中国证券业协会规定的必备条款的融资融券合同,应明确约定的事项包括(A)
A、其他三项都包括
B、融资、融券的额度、期限、利率(费率)、利息(费用)的计算方式
C、追加保证金的通知方式、追加保证金的期限、客户清偿债务的方式及证券公司对担保物的处分权
D、保证金比例、维持担保比例、可充地保证金的证券的种类及折算率、担保债权范围

58、当投资者维持担保比例低于130%时,会接到证券公司的补仓通知,若通知日为T日投资者追加担保物的期限不得超过(B)个交易日,否则将面临被证券公司强制平仓的风险
A、T+4
B、T+2
C、T+1
D、T+3

59、当投资者信用账户当日清算后维持担保比例低于警戒线时,证券公司发出《追加担保物通知》,投资者必须在(B )追加担保金使维持担保比例高于150%
A1个交易日内 B 2个交易日内 C 3个交易日内 D 4个交易日内

60、客户提高信用账户维持担保比例的方式包括(C )
A、转入可充抵保证金的证券
B、转入资金
C、其他三项都包括
D、卖出证券

61、交易所规定单只标的证券的融券余额达到该证券上市可流通市值的( A )时,交易所可以在次一交易日暂停其融券卖出,并向市场公布。
A、25% B20% C30% D35%

62、(A )是指投资者通过其信用证券账户申报买券,结算时买入证券直接划转至证券公司融券专用账户的一种债务偿还方式。
A、买券还券
B、融券卖出
C、卖券还款
D、融资买入

63、交易所规定的可充地保证金的证券的折算率中,证券交易所交易型开放式指数基金折算率不超过90%(A)
A、90% B、80% C、75% D、95%

64、(D)是指证券公司在与客户签订融资融券合同后,根据客户的申请,按照证券登记结算机构的规定,为其开立实名证券账户
A、融券专用账户 B、信用交易证券交收账户 C、客户信用交易担保证券账户 D、客户信用证券账户

65、在客户信用账户权益处置时,以下优先级别最高的是:(D )
A、客户权益 B财产保全 C强制执行 D公司债权

66、投资者通过系统提交和返回担保证券时每笔划转被扣除 D 元非交易过户费。 D
A、30; B、10; C、5; D、20

67、投资者申请变更信用证券账户时,需系统同时变更普通证券账户的是 C 。 B
A、上海; B、深圳; C、上海、深圳。

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

打赏作者