R解决方案
01 library(gdata)#use excel function library
02 A1<-read.xls("e:\data\all.xlsx") #import data
03 A2<-subset(A1,as.POSIXlt(Date)>=as.POSIXlt('2012-06-01')& as.POSIXlt(Date)<=as.POSIXlt('2012-06-30')) #filter by date
04 A3<- split(A2,A2$Code) #group by Code
05 A8<-list()
06 for(iin 1:length(A3)){
07 A3[[i]][order(as.numeric(A3[[i]]$Date)),]#sort by Date in each group
08 A3[[i]]$INC<-with(A3[[i]],Close-c(0,Close[- length (Close)])) #add a column, increased price
09 if(nrow(A3[[i]])>0){ #add a column, continuous increased days
10 A3[[i]]$CID[[1]]<-1
11 for(j in 2:nrow(A3[[i]])){
12 if(A3[[i]]$INC[[j]]>0 ){
13 A3[[i]]$CID[[j]]<-A3[[i]]$CID[[j-1]]+1
14 }else{
15 A3[[i]]$CID[[j]]<-0
16 }
17 }
18 }
19 if(max(A3[[i]]$CID)>=5){ #stock max CID is bigger than 5
20 A8[[length(A8)+1]]<-A3[[i]]
21 }
22 }
23 A9<-lapply(A8,function(x)x$Code[[1]]) #finally,stock code
01:启用Excel支持。要注意的是R对Excel的支持第三方的包l,需要先行下载安装,R对第三方包比较挑剔,找到一个兼容可能的不大容易
02:导入Excel的数据。可能是找来的Excel解析包不好用,这个过程大约需要8-10分钟,内存占用也比集算器多几百M,好在导入数据后内存就释放了。事实上R本身的运算速度还是比较快的,取数据库中的数据时会很好的体现这一点。
03,04:按时间过滤,并按Code分组。分组后的数据查看起来不易理解,点击右侧的变量看到的结果是这样的:
如果在控制台直接输入命令则相对好一些,如下:
05:A8<-list(),定义一个list类型的变量A8,它将用来存放连涨天数大于等于5的股票。
06-22:由于R不能像集算器那样方便的用~来操作每个分组,因此这里需要一个大循环,每次循环针对一个股票进行计算。
07:按日期排序。分组前就排序代码会更简单,但我考虑到最直观的思路是:分组前数据是混在一起的,看不出是否排序;分组后经过观察才发现顺序混乱,不排序则无法进行下一步的行间运算。
08:增加一个列INC,计算”当日收盘价”-“前一日收盘价”。R不支持行间运算,所以这里巧妙的将收盘价整体下移一行,再和原来的收盘价相减。代码是:Close-c(0,Close[- length (Close)])。
09-18:增加一个列CID,计算连涨天数。09行的if(nrow(A3[[i]])>0)是为了避免有些股票没数据(比如暂时停牌),否则后面会报空指针错误。10行的A3[[i]]$CID[[1]]<-1是为了赋初值和避免后面运算报空指针错误。集算器中不需要做类似的检查,看来它对非专业技术人员更友好些。11-17:计算连涨天数。代码虽然很多,其实算法同集算器完全一样。
19-21:过滤,如果某只股票最大的连涨天数大于等于5,则它就是需要的优质股票。代码虽然较多,其实算法和集算器完全一样。结果如下:
23:取出分组中的代码,A9<-lapply(A8,function(x) x$Code[[1]]),如下图:
一些体会:
R和集算器凭借自身的能力都可以实现较复杂的股票分析。集算器的代码更简单易懂,避免了大部分的循环语句,数组越界等容易犯错的地方也做了些人性化的处理。基本上,会用基本的Excel公式应该就能用集算器来做股票分析了。
使用R来完成股票分析需要一定的编程技巧和数学知识,这样才能灵活运行R的各项功能。R还具备优秀的扩展性,比如有针对股票的第三方库函数和统计图;再比如完全可以自己写一个更高效的读取Excel的函数
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。