抓取深圳或上海股市,或香港美国等有关股市某时间段内全部股票行情数据,进行主成分分析构造你个人的股市指数,然后分析你的私家指数和该股市常用官方股票指数的相关性,判断主成分分析在构造股市指数上是否可用。

本人偷懒了,直接用ML_for_Hackers-master 书中的数据了。

> prices<-read.csv("stock_prices.csv")
> prices[1,]
        Date Stock Close
1 2011-05-25   DTE 51.12
> # 原始数据集并不是我们喜欢使用的格式,因此需要进行预处理。
> # 第一步,把数据集中的时间戳转换为正确编码的日期变量。这要用到lubridate包中的ymd函数
> # install.packages("lubridate")
> library(lubridate)
> prices<-transform(prices,Date=ymd(Date))
> # 一旦完成这一步,就能适用reshape函数库中的cast函数
> library(reshape)

Attaching package: ‘reshape’

The following object is masked from ‘package:lubridate’:

stamp

> date.stock.matrix<-cast(prices,Date~Stock,value="Close")
> which(complete.cases(date.stock.matrix)==F) # 22 875条记录有缺失值
[1]  22 875
> # 分析了这个生成结--巨大的日期-股票矩阵之后,我们注意到缺失了一些元素。
> date.stock.matrix[22,];date.stock.matrix[875,]
         Date ADC AFL ARKR AZPN CLFD DDR DTE ENDP FLWS FR GMXR GPC HE ISSC ISSI KSS MTSC
22 2002-02-01  NA  NA   NA   NA   NA  19  NA   NA   NA NA   NA  NA NA   NA   NA  NA   NA
   NWN ODFL PARL RELV SIGM STT TRIB UTR
22  NA   NA   NA   NA   NA  NA   NA  NA
          Date  ADC   AFL  ARKR AZPN CLFD DDR   DTE  ENDP FLWS    FR  GMXR   GPC    HE
875 2005-06-22 30.4 43.49 26.56 5.76 1.47  NA 46.89 25.88 7.23 41.45 13.45 42.76 27.21
     ISSC ISSI   KSS  MTSC   NWN  ODFL  PARL RELV SIGM   STT TRIB   UTR
875 35.42 7.22 56.06 34.54 36.87 27.74 28.96 10.3 8.12 49.22 6.69 49.98
> # 因此回到最初的prices数据集,删除那些缺失元素的数据,再运行cast函数:
> prices<-subset(prices,Date!=ymd('2002-02-01'))
> prices<-subset(prices,Stock !='DDR')
> date.stock.matrix<-cast(prices,Date~Stock,value="Close")
> which(complete.cases(date.stock.matrix)==F)  #0
integer(0)
> # 接下来可以适用cor函数来找到这个矩阵中所有数字列之间的相关性。然后将相关性矩阵转换成一个数值向量,并且画一个相关性密度图,
> # 以此来获得两个直观认识:a)相关性的均值;b)低相关性出现的频率。
> cor.matrix<-cor(date.stock.matrix[,2:ncol(date.stock.matrix)])
> correlations<-as.numeric(cor.matrix)
> library(ggplot2)
> ggplot(data.frame(Correlation=correlations),
+        aes(x=Correlation,fill=1))+
+   geom_density()+opts(legend.position='none')

> #正如密度图所示,大部分相关性是正数,因此PCA适合用于这份数据集.
> # 我们适用princomp函数来运行PCA:
> pca<-princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
> # 我们只对第一主成份感兴趣,所以只把pca载荷的第一列提取出来:
> principal.component<-pca$loadings[,1]
> # 完成这些之后,我们可以分析载荷的密度图,直观地了解第一主成份是如何形成的。
> loadings<-as.numeric(principal.component)
> ggplot(data.frame(Loadings=loadings),
+        aes(x=Loadings,fill=1))+
+   geom_density()+opts(legend.position="none")

> # 这个结果有点让人疑惑,因为载荷有一个相当不错的分布,但是几乎全是负数。它实际上是个很小的麻烦,我们用一行代码就能解决。
> # 到目前为止我们获得了主成分,接下来可以把这些数据总结成一列了。可以使用predict函数完成这个目标:
> market.index<-predict(pca)[,1]
> # 如何才能知道这些预测值的效果呢?幸运的是,对这个实例我们可以很容易地判断结果好坏
> # ,因为可以把结果和著名的市场指数做比较。在本章中,我们用道琼斯指数(Down Jones Index DJI).
> dji.prices<-read.csv("DJI.csv")
> dji.prices<-transform(dji.prices,Date=ymd(Date))
> # 因为使用整个DJI运行的时间比我们预想的要长很多,所以需要取一个它的自己,仅仅获得我们感兴趣的那些日期。
> dji.prices<-subset(dji.prices,Date>ymd('2001-12-31'))
> dji.prices<-subset(dji.prices,Date !=ymd('2002-02-01'))
> # 然后,提取DJI中我们感兴趣的部分,也就是每日收盘价格和我们记录过的那些日期。
> # 因为它们的顺序和我们现在的数据集相反,用rev函数反转它们即可:
> dji<-with(dji.prices,rev(Close))
> dates<-with(dji.prices,rev(Date))
> # 现在我们可以绘制一些简单的图,将使用PCA生成的市场指数和DJI相比较:
> comparison<-data.frame(Date=dates,MarketIndex=market.index,DJI=dji)
> ggplot(comparison,aes(x=MarketIndex,y=DJI))+
+   geom_point()+geom_smooth(method="lm",se=FALSE)

> #从图可以看出,那些之前看上去烦人的负载荷,真的成为了麻烦的源头:我们的指数和DJI付相关。
> # 但是,我们可以很容易地解决这个麻烦。只需要对指数乘以-1,即可生成一个和DJI正相关的指数
> comparison<-transform(comparison,MarketIndex=-1*MarketIndex)
> # 现在可以再尝试一次进行比较:
> ggplot(comparison,aes(x=MarketIndex,y=DJI))+
+   geom_point()+geom_smooth(method="lm",se=FALSE)

+   geom_point()+geom_line(

)

> #如图,我们已经修正了指数的方向,并且它看上去和DJI真的很匹配。
> # 剩下的最后一件事情,就是获得我们的指数随着时间推移与DJI的趋势保持一直的程度。
> # 首先,使用melt函数获得一个数据框,它可以很容易地一次性对两个指标进行可视化。
> # 然后,我们对每个指数活出一条以日期为x轴,以价格为y轴的线。
> alt.comparison<-melt(comparison,id.vars="Date")
> names(alt.comparison)<-c("Date","Index","Price")
> ggplot(alt.comparison,aes(x=Date,y=Price,group=Index,color=Index))+
+   geom_point()+geom_line()

> # 这一次结果并不是很好,因为DJI都是很高的值,而我们的指数都是很小的值,但是可以使用scale函数解决这个问题。
> comparison$MarketIndex<-scale(comparison$MarketIndex)
> comparison$DJI<-scale(comparison$DJI)
> alt.comparison<-melt(comparison,id.vars="Date")
> names(alt.comparison)<-c("Date","Index","Price")
> ggplot(alt.comparison,aes(x=Date,y=Price,group=Index,color=Index))+
+   geom_point()+geom_line()

> # 看上去与DJI的趋势保持得相当好。总之,用PCA真的能够产生一副股票价格的趋势图。

【读书笔记】抓取深圳或上海股市,或香港美国等有关股市某时间段内全部股票行情数据,进行主成分分析构造你个人的股市指数相关推荐

  1. 爬取东方财富网股票行情数据和资讯

    爬取东方财富网股票行情数据和资讯 这个需求源于我的一个练手项目 本篇博客参考:https://zhuanlan.zhihu.com/p/50099084 该博客介绍的东西本博客不做论述 使用技术: 语 ...

  2. 使用C#爬取网页港股股票行情数据——附C#源码

    GitHub地址:TEST/HttpWebRequest at master · yangwohenmai/TEST · GitHub 爬取港交所数据最大的问题是如何获取港交所页面的Token,有了T ...

  3. python3爬虫抓取链家上海租房信息

    环境:win10,anaconda3(python3.5) 爬取对象网站:链家上海租房 方法一:利用requests获取网页信息,再利用正则提取数据,并将结果保存到csv文件. 代码地址:代码 抓取到 ...

  4. 笔记--抓取王者荣耀盒子图片视频

    此文章借鉴:https://blog.csdn.net/c406495762/article/details/76850843 作者思路很新奇,所以学习测试了一下,可以成功,特意跟大家分享一下. 准备 ...

  5. php 获取新浪股票行情数据,python 抓取新浪财经股票数据

    新浪并未提供API,但我们可以通过抓包来获取实时或历史行情数据. 实时行情 比如我们可以通过浏览器访问: ?== 来获取证券代码为的实时行情数据,可以看到内容为: ="华泰证券,,,,20. ...

  6. A股市场上股票行情数据接口有那几种?

    L2行情数据接口相比Level-1接口相比,L2行情市场具有数据更完整.推送速度更及时的优势,帮助投资者及时把握盘中主要资金流,做出更准确的投资决策.简而言之,Level-2最大的作用就是提前看到主力 ...

  7. selenium爬取上市公司全部行业及分行业股票行情数据

    上次制作了输入股票代码,显示股票行情.历史数据.股评词云图的网页,但是,想要判断一只股票的投资价值仅看它自己的历史走势是不够的,还要与其他个股尤其是同行业个股进行比较.当然,行业轮动时选对行业是投资成 ...

  8. scrapy使用selenium抓取深圳证券交易所考评表数据

    文章目录 步骤一:selenium爬虫代码 步骤2:清洗数据 步骤3. 整理格式并导出excel 附:百度网盘-信息考评数据文件 网址:http://www.szse.cn/disclosure/su ...

  9. Python爬虫笔记————抓取 猫眼电影排行榜Top100

    注:初学爬虫,本节仅使用requests库和使用正则作为解析工具 最近学习爬虫,找个比较简单的网页练习了一下,作为初入爬虫的小白,不足之处还请大家多多指教. 一.分析url 首先,打开目标站点http ...

最新文章

  1. 大数据项目一般金额多少_大数据分析师年薪一般多少?学什么专业才能从事大数据?...
  2. [ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了
  3. 基于Hibernate+spring的公司网站打造中(二)
  4. CF617E XOR and Favorite Number
  5. Linux命令(8):headtail命令
  6. 数组在内存中存储方式
  7. FTP用户无法登陆排错详解
  8. 关于Java书籍的最佳阅读顺序
  9. mysql sys cpu_MySQL SYS CPU高的案例分析(一)
  10. My97DatePickerBeta日期控件乱码问题解决方案
  11. 安装scipy报错的解决方案
  12. 请和我一起学习机器学习算法(高斯混合聚类)
  13. 戴钊《自我教练:迈向自我实现之路》读书笔记
  14. jbX和finss的一些问题
  15. IBM X 345服务器无法从光驱启动配置解决方法——非常规方法
  16. android延迟时间设置,控制Android上的延迟
  17. 微信小程序:升级版手机检测微信工具小程序源码
  18. 数据脱敏(Data Masking)- 模块功能设计
  19. https防止注入_离子注入新法,将钢的耐磨性提高百倍
  20. PAT-Head of Hangs

热门文章

  1. cartographer建图,重定位及发布消息结构为nav_msgs::Odometry的odom话题
  2. 十进制正整数转16进制
  3. HTML5网站大观:15个精美的 HTML5 单页网站作品欣赏
  4. ANSYS渡槽槽身动水压力的施加(1)——矩形渡槽
  5. JS实现curry(柯里化)的四种简单方式
  6. 更改SQL Server数据库名、数据库文件名的方法
  7. 关于保守与创新,核心竞争力与核心战略
  8. 输出二叉树中从每个叶子结点到根结点的路径,统计二叉树的度为1的结点个数,二叉树算表达式(C语言)
  9. CMWAP 和 CMNET 的区别是什么?
  10. python 新式类与旧式类的区别