雪球股票历史数据
㈠ 雪球地球假说哪一年提出
1992年J.L. Kirschvink首先提出在新元古代(8亿—5.5亿年前)曾经出现过几次“雪球地球”事件。
雪球地球:是地质史上的一个名词。指的是地球表面从两极到赤道全部被结成冰,地球被冰雪覆盖变成一个大雪球。
地球历史上曾出现过两次雪球地球事件,一次是在大约距今约8亿到5.5亿年之间,地球表面从两极到赤道全部结成冰只有海底残留了少量液态水。还有一次则出现在地球刚刚出现生物的时候。但是这两次冰期,都没有发生在8亿—5.5亿年之间的全球性冰期事件来的更戏剧和更残酷。在很久之前发生的雪球地球事件使得整个地球被冻成一个大雪球,导致无数物种灭绝。
雪球地球假说的历史:
1964年,剑桥大学的B.W. Harland最早对全球范围内新元古代(大概8亿—5.5亿年前)的冰期沉积物做了研究,他提出在全世界各个大洲都有8亿—5.5亿年前的冰期沉积物。同时,他通过简单的地磁学分析指出,当时这些大洲其实并没有像现在那样被海洋分开,而是在赤道附近汇聚成一整块巨大的大陆。
而在当时,板块漂移学说也才慢慢被接受。而且由于分析手段缺乏,加上数据有限,所以B.W. Harland的说法并没有明确的得到广泛地证实,更没有人能解释,冰期沉积怎么到了赤道附近。
1987年,加州理工学院的J.L. Kirschvink等研究了澳大利亚的一块新元古代的粉砂岩之后,证实了它是属于当时沉积在赤道附近的浅海环境,确凿地说明了冰川曾经到达了赤道附近,而且这个研究成果也被后来的研究反复检测所证实,其中就包括随着古地磁学的发展。
D.A.D. Evans等人在2000年研究了这个时期(8亿—5.5亿年前)各个大陆的冰川沉积地层学、地质年代学、古地磁学后指出,许多冰期沉积的杂砾岩出现在南北纬10°以内甚至没有超过60°的。
1992年J.L. Kirschvink首先提出在新元古代(8亿—5.5亿年前)曾经出现过几次“雪球地球”事件。可以想象赤道附近都结冰了,那么整个地球还不冻的严严实实成为一个“雪球”?
㈡ 入选雪球精选什么意思
雪球100』是天弘基金和雪球投资达人的评论信息和投资组合数据,模拟现实投资所构建的国内首支纯正的互联网大数据指数。
天弘基金帮助雪球对原始数据进行了梳理,测试了各种策略后,选择符合基金公司投资路径的标准化方式,最终确定了该指数编制的策略。目前市场上的互联网大数据指数,除了用到互联网大数据本身,还应用了股票的财务因子和动量因子,主要由于这些大数据是基于普通财经数据或者搜索数据的大数据,并不包含股票本身的研究信息。
但雪球本身是一个社交投资平台,用户的讨论信息和投资组合信息已经包含了对股票基本面的分析判断。天弘基金可以仅仅基于雪球的大数据通过量化来构建指数,于是,一只纯正的互联网大数据指数——『雪球100』诞生了。
模拟历史历史数据证明,雪球100的掘金能力突出:自其基日2012年4月5日至2015年8月11日,雪球100累计收益达172.54%,远超沪深300同期64.25%的收益,雪球100期间年化收益多达45.64%,年化超额收益也超过30%。
除了收益能力突出,『雪球100』的风险控制能力较强,今年6月中旬到7月初的此轮市场调整中,雪球100的最大回撤仅34.81%,而同类指数最大回撤均在40%以上。
行业分布方面,最近一期的雪球100指数成分股一级行业市值分布,主要集中于消费、金融、材料、医疗保健等行业。
㈢ 如何使用 Python 抓取雪球网页
#start coding
首先要知道自己在爬什么~楼主说找到HTML的代码云云,思路其实是错误的。因为我们想要的内容不在原始的html里面。但是肯定在浏览器和服务器之间的通信里,我们只要找到这部分数据就好。
#我用的是Firefox的FireBug
选择网络(Chrome中应该是Network),点击调仓历史记录
可以看到浏览器和服务器之间进行了一次通信。我们截获了一个网址。打开看看。可以看到浏览器和服务器之间进行了一次通信。我们截获了一个网址。打开看看。
看上去像是一堆乱码,但是细心的话就会发现……
也就是说我们要的数据都在这里了,所以只要先获取这个页面的内容然后在提取数据就好了~
#python3项目,python2中请使用urllib和urllib2
import urllib.request
url = '?cube_symbol=ZH010389&count=20&page=1'
req = urllib.request.Request(url,headers=headers)
html = urllib.request.urlopen(req).read().decode('utf-8')
print(html)
运行一下~
报错了~报错没关系,兵来将挡水来土掩~
403禁止访问…应该是headers的问题…什么是headers呢…403禁止访问…应该是headers的问题…什么是headers呢…
你现在用python去访问网页,网页得到的请求就是你是python程序,但是网页并不想让程序看到自己,因为他是给人看的,资源都被程序占了算什么,所以我们要让python伪装成浏览器。
依然是用Firebug查看headers信息。
然后我们完善代码在访问过程中添加headers~然后我们完善代码在访问过程中添加headers~
import urllib.request
headers = {'X-Requested-With': 'XMLHttpRequest',
'Referer': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
'Host': 'xueqiu.com',
#'Connection':'keep-alive',
#'Accept':'*/*',
'cookie':'s=iabht2os.1dgjn9z; xq_a_token=; xq_r_token=; __utma=1.2130135756.1433017807.1433017807.1433017807.1;'
'__utmc=1; __utmz=1.1433017807.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_=1433017809; Hm_lpvt_=1433017809'}
url = '?cube_symbol=ZH010389&count=20&page=1'
req = urllib.request.Request(url,headers=headers)
html = urllib.request.urlopen(req).read().decode('utf-8')
print(html)
这次得到想要的结果了~
我们回过头再去看headers会发现,其实有些我并没有写进去,你也可以自己尝试把headers中的某一行注释掉运行。但是每个站是不一样的,你把所有的都填上去是一定能运行成功的,但是可能其中某一些不是必需的。
比如我们这里只要有User-Agent(缺少报错403)和cookie(缺少报错400)。
好~我们现在拿到了想要的数据,但是看上去太复杂了,一点都不友好。现在我们来解析一下这个网页。其实这个网页是json格式的数据包。
然后我们来观察这个数据的解析。然后我们来观察这个数据的解析。
#你可以直接点击Firebug中的JSON来看,也可以复制到Notepad++中使用json viewer插件查看。
大概是这个样子的……大概是这个样子的……
有了json的构成结构我们就可以来解析它了…
我直接拿Python Shell调试,一会儿完善代码
没什么问题~一切看起来很完美的样子~这一步其实没什么难度,只要你能看懂上一步里我们分析的json数据的组成结构,然后一层一层地向下解析数据就可以了。
完善代码。
import urllib.request
import json
headers = {#'X-Requested-With': 'XMLHttpRequest',
#'Referer': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0',
#'Host': 'xueqiu.com',
#'Connection':'keep-alive',
#'Accept':'*/*',
'cookie':'s=iabht2os.1dgjn9z; xq_a_token=; xq_r_token=; __utma=1.2130135756.1433017807.1433017807.1433017807.1;'
'__utmc=1; __utmz=1.1433017807.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_=1433017809; Hm_lpvt_=1433017809'}
url = '?cube_symbol=ZH010389&count=20&page=1'
req = urllib.request.Request(url,headers=headers)
html = urllib.request.urlopen(req).read().decode('utf-8')
#print(html)
data = json.loads(html)
print('股票名称',end=':')
print(data['list'][0]['rebalancing_histories'][0]['stock_name'],end=' 持仓变化')
print(data['list'][0]['rebalancing_histories'][0]['prev_weight'],end='-->')
print(data['list'][0]['rebalancing_histories'][0]['target_weight'])
print('股票名称',end=':')
print(data['list'][0]['rebalancing_histories'][1]['stock_name'],end=' 持仓变化')
print(data['list'][0]['rebalancing_histories'][1]['prev_weight'],end='-->')
print(data['list'][0]['rebalancing_histories'][1]['target_weight'])
运行程序~
好嘞!搞定收工!
当然也还不能收工……只是我不干了而已……
To-dos:
可以看到程序是面向过程的…重复代码很多,可以通过定义类或方法实现调用
大概……大概得写点注释……不过这么简单直接无脑面向过程的代码真的需要注释吗
如果是想在他持仓变化时收到提醒,需要爬虫定时爬取页面数据与之前数据进行比较
如果你更细心的话会发现最初的json网址的构成是这样的…cube_symbol='#此处可添加任意组合的号码例如ZH010389'&count=‘#此处数字是一次获取的交易变化数量,也就是说你一次性拿到了20次的交易,你点开之前交易记录的时候并不会重新请求数据而是读取了本地现有的数据此处数据可以任意修改哦~很神奇的试一试吧~20’&page=‘和前面联系起来,前面是一次性获取20条记录,这边便是页码,通过对page数的控制利用循环可以输出所有交易过程,当然,40一页和20两页的效果显然是一样的,看你怎么玩儿了~1’
如果你有耐心看完上面那一大段话的话想必你可以有更多的想法。让别人来指导我们的思路是好的,可是投资的机会稍瞬即逝,跟在别人后面是没有前途的,我们要学习。大数据的时代为什么不试试爬更多人的更多投资记录呢?比如在雪球首页爬取首页推荐的组合,然后自动爬取这些组合所做的所有操作~这样你是不是就有了很厚的一本交易目录,结合过去的股市数据(这些能不能想办法自动获取呢?),你可以自己尝试分析别人作出投资决定的原因(是不是可以把数据自动写入一个excel?提示:xlwt3)…最终指导自己的投资。大数据学习,想想都炫酷。可惜我不炒股…
大概就酱紫~希望有帮助~
写这么多是因为我自己在学爬虫…一周了…看到实践的机会就来试一下…所以是边调BUG边写答案~
大概就写这么多吧…后面的To-dos哪天我突然感兴趣了会试着写一下或者过来补充的…
看到这个答案的…前辈还希望多多指教;看到这个答案的新手…欢迎交流:P
㈣ 怎样在日线k线图中看北上资金的动向历史数据
怎样在日线k线图中看资金的动向历史数据?
在股票的软件,上面有一个资金盘
资金动向的页面,上面就会显示。
所有的大批量数据都会有一个总结显示。
㈤ 股票里入选雪球100是什么意思
『雪球100』是天弘基金和雪球投资达人的评论信息和投资组合数据,模拟现实投资所构建的国内首支纯正的互联网大数据指数。 天弘基金帮助雪球对原始数据进行了梳理,测试了各种策略后,选择符合基金公司投资路径的标准化方式,最终确定了该指数编制的策略。目前市场上的互联网大数据指数,除了用到互联网大数据本身,还应用了股票的财务因子和动量因子,主要由于这些大数据是基于普通财经数据或者搜索数据的大数据,并不包含股票本身的研究信息。 但雪球本身是一个社交投资平台,用户的讨论信息和投资组合信息已经包含了对股票基本面的分析判断。天弘基金可以仅仅基于雪球的大数据通过量化来构建指数,于是,一只纯正的互联网大数据指数——『雪球100』诞生了。 模拟历史历史数据证明,雪球100的掘金能力突出:自其基日2012年4月5日至2015年8月11日,雪球100累计收益达172.54%,远超沪深300同期64.25%的收益,雪球100期间年化收益多达45.64%,年化超额收益也超过30%。 除了收益能力突出,『雪球100』的风险控制能力较强,今年6月中旬到7月初的此轮市场调整中,雪球100的最大回撤仅34.81%,而同类指数最大回撤均在40%以上。 行业分布方面,最近一期的雪球100指数成分股一级行业市值分布,主要集中于消费、金融、材料、医疗保健等行业。 千山入选雪球100成分股,这意味今后几个月天弘发布这两指数基金的话,将购买千山!
㈥ 雪球地球的研究历史
1964年,剑桥大学的B.W. Harland最早对全球范围内新元古代(大概8亿—5.5亿年前)的冰期沉积物做了研究,他提出在全世界各个大洲都有8亿—5.5亿年前的冰期沉积物。
同时,他通过简单的地磁学分析指出,当时这些大洲其实并没有像现在那样被海洋分开,而是在赤道附近汇聚成一整块巨大的大陆。
而在当时,板块漂移学说也才慢慢被接受。而且由于分析手段缺乏,加上数据有限,所以B.W. Harland的说法并没有明确的得到广泛地证实,更没有人能解释,冰期沉积怎么到了赤道附近。 在随后的二三十年里面,通过科学家在海洋生物学、地球化学等领域的进一步努力,获得了不少新的进展。
1987年,加州理工学院的J.L. Kirschvink等研究了澳大利亚的一块新元古代的粉砂岩之后,证实了它是属于当时沉积在赤道附近的浅海环境,确凿地说明了冰川曾经到达了赤道附近,而且这个研究成果也被后来的研究反复检测所证实,其中就包括随着古地磁学的发展。
D.A.D. Evans等人在2000年研究了这个时期(8亿—5.5亿年前)各个大陆的冰川沉积地层学、地质年代学、古地磁学后指出,许多冰期沉积的杂砾岩出现在南北纬10°以内,甚至没有超过60°的。
1992年,J.L. Kirschvink首先提出在新元古代(8亿—5.5亿年前)曾经出现过几次“雪球地球”事件。可以想象,赤道附近都结冰了,那么整个地球还不冻的严严实实,成为一个“雪球”? 8亿年前地球上的大陆并不是分离的,而是在赤道附近连在一起,我们称为罗迪尼亚超大陆。
罗迪尼亚超大陆因为一次著名的”超级地幔柱“的火山活动分裂了,形成几个小的陆地,这个就使得陆地的海岸线增加了很多;海岸线的增加带来两个后果:一个是生物在岸边的活动增加,光合作用的加强导致大量CO2被吸收,二个是同样增加了大陆的硅酸岩风化,而吸收了不少CO2,这两个结果导致大气的CO2迅速减少,“温室”变“冰室”,产生巨大的冰雪覆盖,进而产生了失控的反照率事件,而最终形成了“雪球”。
经过计算,当时冰盖有1公里厚,推进到赤道附近,地球温度下降到零下50°C左右。因为被冰雪埋藏,光合作用和大陆的硅酸岩风化作用都被终止,但是地球的火山活动还在继续,向外释放了大量的CO2。经过长达1000万年的积累,这些CO2终于足够强大,形成“温室效应”,从而迅速融化了“雪球地球”,在融化的时候整个海洋温度能够达到50°C以上。 美国加州理工学院研究小组还证明了一个机制,借助这一机制,地球才能摆脱“雪球地球”。在变成“雪球地球”后大约几千万年里,地球的二氧化碳积聚到一定程度,闪耀的亮白色冰层能反映太阳光线和热量,因此雪球在2亿年间一直处于像冰冻的雪球。
最终,由火山喷发出的二氧化碳温室气体进入空气中,由此地球气候逐渐转暖,厚厚的冰层也慢慢融化。温室效应再一次发生了,地球温度又逐渐升高,冰层融化,生命重返地球。研究小组的科学家认为,如果地球环境继续恶化,地球有可能再次成为“雪球”,地球上的生物将面临被再次毁灭的危险。
㈦ 同花顺如何查询个股的历史收盘价
同花顺如何查询个股的历史收盘价炒股就是从事股票的买卖活动。炒股的核心内容就是通过证券市场的买入与卖出之间的股价差额,获取利润。面,不再受相思之苦。你说但愿我们的爱情
㈧ 怎样查询股票分红
一般分红都是除权除息日当天就能到账,不过也有例外。这个看上市公司安排,一般半月之内肯定会到账。分红送股都会自动进行,不需要任何操作,只要耐心等待就可以了。 比如,像盘子比较大的股票,分红涉及的金额很大,结算就需要比较多的时日,这样公司就会有个具体公告,公告上会说明分红具体到账日期。
㈨ 如何通过雪球查询股票之前的变动状况
一. 雪球公司介绍
雪球 聪明的投资者都在这里。
web 1.0:新闻资讯,股价信息,K线图
web 2.0:SNS 订阅,分享,聊天
web 3.0:移动 APP,交易闭环
雪球现在员工数还不到100,其中技术人员占一半。去年9月C轮融资4kw刀。我们现在的技术栈由下列组件组成:Java,Scala,Akka,Finagle,Nodejs,Docker ,Hadoop。我们当前是租用IDC机房自建私有云,正在往“公私混合云”方向发展。
在雪球上,用户可以获取沪深港美2w+股票的新闻信息,股价变化情况,也可以获取债券,期货,基金,比特币,信托,理财,私募等等理财产品的各类信息,也可以关注雪球用户建立的百万组合,订阅它们的实时调仓信息,还可以关注雪球大V。雪球当前有百万日活跃用户,每天有4亿的API调用。App Store 财务免费榜第 18 名。历史上曾排到财务第二,总免费榜第 19。
二. 雪球当前总体架构
作为一个典型的移动互联网创业公司,雪球的总体架构也是非常典型的设计:
最上层是三个端:web端,android端和iOS端。流量比例大约为 2:4:4 。web3.0 的交易功能,在 web 端并不提供。
接入层以及下面的几个层,都在我们的自建机房内部。雪球当前只部署了一个机房,还属于单机房时代。正在进行“私有云+公有云混合部署”方案推进过程中。
我们当前使用 nodejs 作为 web 端模板引擎。nodejs 模块与android 和 ios 的 app 模块一起属于大前端团队负责。
再往下是位于 nginx 后面的 api 模块。跟 linkedin 的 leo 和微博的 v4 一样,雪球也有一个遗留的大一统系统,名字就叫 snowball 。最初,所有的逻辑都在 snowball 中实现的。后来慢慢的拆出去了很多 rpc 服务,再后来慢慢的拆出去了一些 http api 做成了独立业务,但即便如此,snowball 仍然是雪球系统中最大的一个部署单元。
在需要性能的地方,我们使用 netty 搭建了一些独立的接口,比如 quoto server,是用来提供开盘期间每秒一次的股价查询服务,单机 qps 5w+,这个一会再细说;而 IM 服务,起初设计里是用来提供聊天服务,而现在,它最大的用途是提供一个可靠的 push 通道,提供 5w/s 的消息下发容量,这个也一会再细说。
雪球的服务化拆分及治理采用 twitter 开源的 finagle rpc 框架,并在上面进行了一些二次开发和定制。定制的功能主要集中在 access log 增强,和 fail fast,fail over 策略及降级开关等。 finagle 的实现比较复杂,debug 和二次开发的门槛较高,团队内部对此也进行了一些讨论。
雪球的业务比较复杂,在服务层中,大致可以分为几类:第一类是web1.0,2.0 及基础服务,我们称为社区,包括用户,帖子,新闻,股价,搜索等等,类比对象就是新浪财经门户+微博;第二类是组合及推荐,主要提供股票投资策略的展示和建议,类比对象是美国的motif;第三类是通道,类似股市中的“支付宝”,接入多家券商,提供瞬间开户,一键下单等等各种方便操作的功能。
雪球的业务实现中,包含很多异步计算逻辑,比如搜索建索引,比如股票涨跌停发通知,比如组合收益计算等等,为此,我们设计了一个独立的 Thread/Task 模块,方便管理所有的后台计算任务。但随着这些 task 越来越多,逻辑差异越来越大,一个统一的模块并不是总是最佳的方案,所以,我们又把它拆成了两大类:流式的,和批量式的。
雪球的推荐体系包括组合推荐“买什么”和个性化推荐。我们最近正在重新梳理我们的大数据体系,这个感兴趣的话可以单聊。
最下面是基础设施层。雪球基础设施层包括:redis,mysql,mq,zk,hdfs,以及容器 docker。
线上服务之外,我们的开发及后台设施也很典型:gitlab开发,jenkins打包,zabbix 监控系统向 openfalcon 迁移,redimine向confluence迁移,jira,以及内部开发的 skiing 后台管理系统。
** 三. 雪球架构优化历程**
首先描述一下标题中的“股市动荡”定语修饰词吧:
上证指数从年初的3000点半年时间涨到了5000多,6月12号达到最高点5200点,然后就急转直下,最大单日跌幅 8.48%,一路跌回4000点以下。最近一周都在3900多徘徊。
3月最后一周,A股开户 166万户,超过历史最高纪录 2007年5月第二周165万户。
4月份,证监会宣布A股支持单用户开设多账户。
6月底,证金公司代表国家队入场救市。
7月份,证监会宣布严打场外配资。
中国好声音广告第一晚,带来超过平时峰值200倍的注册量
挑战:小 VS 大:
小:小公司的体量,团队小,机器规模小
大:堪比大公司的业务线数量,业务复杂度,瞬间峰值冲击
雪球的业务线 = 1个新浪财经 + 1 个微博 + 1 个 motif + 1 个大智慧/同花顺。由于基数小,API调用瞬间峰值大约为平时峰值的 30+ 倍。
挑战:快速增长,移动互联网 + 金融,风口,A股大盘剧烈波动。
首先,在app端,在我们核心业务从 web2.0 sns 向 3.0 移动交易闭环进化的过程中,我们开发了一个自己的 hybrid 框架:本地原生框架,加离线 h5 页面,以此来支撑我们的快速业务迭代。当前,雪球前端可以做到 2 周一个版本,且同时并行推进 3 个版本:一个在 app store 等待审核上线,一个在内测或公测,一个在开发。我们的前端架构师孟祥宇在今年的 wot 上有一个关于这方面的详细分享,有兴趣的可以稍后再深入了解。
雪球App实践—构建灵活、可靠的Hybrid框架 http://wot.51cto.com/2015mobile/ http://down.51cto.com/data/2080769
另外,为了保障服务的可用性,我们做了一系列的“端到端服务质量监控”。感兴趣的可以搜索我今年4月份在环信SM meetup上做的分享《移动时代端到端的稳定性保障》。其中在 app 端,我们采用了一种代价最小的数据传输方案:对用户的网络流量,电池等额外消耗几乎为0
每个请求里带上前一个请求的结果
succ or fail : 1 char
失败原因:0 - 1 char
请求接口编号: 1 char
请求耗时:2 - 3 char
其它:网络制式,etc
炒股的人大多都会盯盘:即在开盘期间,开着一个web页面或者app,实时的看股价的上下跳动。说到“实时”,美股港股当前都是流式的数据推送,但国内的A股,基本上都是每隔一段时间给出一份系统中所有股票现价的一个快照。这个时间间隔,理论上是3秒,实际上一般都在5秒左右。 交了钱签了合同,雪球作为合作方就可以从交易所下属的数据公司那里拿到数据了,然后提供给自己的用户使用。
刚才介绍总体架构图的时候有提到 quote server ,说到这是需要性能的地方。
业务场景是这样的,雪球上个人主页,开盘期间,每秒轮询一次当前用户关注的股票价格变动情况。在内部,所有的组合收益计算,每隔一段时间需要获取一下当前所有股票的实时价格。起初同时在线用户不多,这个接口就是一个部署在 snowball 中的普通接口,股价信息被实时写入 redis ,读取的时候就从 redis 中读。后来,A股大涨,snowball 抗不住了。于是我们就做了一个典型的优化:独立 server + 本地内存存储。开盘期间每次数据更新后,数据接收组件主动去更新 quote server 内存中的数据。 后续进一步优化方案是将这个接口以及相关的处理逻辑都迁移到公有云上去。
对于那些不盯盘的人,最实用的功能就是股价提醒了。在雪球上,你除了可以关注用户,还可以关注股票。如果你关注的某只股票涨了或跌了,我们都可以非常及时的通知你。雪球上热门股票拥有超过 50w 粉丝(招商银行,苏宁云商)粉丝可以设置:当这支股票涨幅或跌幅超过 x%(默认7%)时提醒我。曾经连续3天,每天超过1000股跌停,证监会开了一个会,于是接下来2天超过1000股涨停
原来做法:
股票涨(跌)x%,扫一遍粉丝列表,过滤出所有符合条件的粉丝,推送消息
新做法:
预先建立索引,开盘期间载入内存
1%:uid1,uid2
2%:uid3,uid4,uid5
3%:uid6
问题:有时候嫌太及时了:频繁跌停,打开跌停,再跌停,再打开。。。的时候
内部线上记录:
4台机器。
单条消息延时 99% 小于 30秒。
下一步优化目标:99% 小于 10 秒
IM 系统最初的设计目标是为雪球上的用户提供一个聊天的功能:
送达率第一
雪球IM:Netty + 自定义网络协议
Akka : 每个在线client一个actor
推模式:client 在线情况下使用推模式
多端同步:单账号多端可登录,并保持各种状态同步
移动互联网时代,除了微信qq以外的所有IM,都转型成了推送通道,核心指标变成了瞬间峰值性能。原有架构很多地方都不太合适了。
优化:
分配更多资源:推送账号actor池
精简业务逻辑:重复消息只存id,实时提醒内容不推历史设备,不更新非活跃设备的session列表等等
本地缓存:拉黑等无法精简的业务逻辑迁移到本地缓存
优化代码:异步加密存储,去除不合理的 akka 使用
akka这个解释一下:akka 有一个自己的 log adapter,内部使用一个 actor 来处理所有的 log event stream 。当瞬间峰值到来的时候,这个 event stream 一下子就堵了上百万条 log ,导致 gc 颠簸非常严重。最后的解决办法是,绕过 akka 的 log adapter,直接使用 logback 的 appender
线上记录:5w/s (主动限速)的推送持续 3 分钟,p99 性能指标无明显变化
7月10号我们在中国好声音上做了3期广告。在广告播出之前,我们针对广告可能带来的对系统的冲击进行了压力测试,主要是新用户注册模块,当时预估广告播出期间2小时新注册100万
压测发现 DB 成为瓶颈:
昵称检测 cache miss > 40%
昵称禁用词 where like 模糊查询
手机号是否注册 cache miss > 80%
注册新用户:5 insert
优化:
redis store:昵称,手机号
本地存储:昵称禁用词
业务流程优化:DB insert 操作同步改异步
下一步优化计划:
将 sns 系统中所有的上行操作都改成类似的异步模式
接口调用时中只更新缓存,而且主动设置5分钟过期,然后写一个消息到 mq 队列,队列处理程序拿到消息再做其它耗时操作。
为了支持失败重试,需要将主要的资源操作步骤都做成幂等。
前置模块HA:
合作方合规要求:业务单元部署到合作方内网,用户的敏感数据不允许离开进程内存
业务本身要求:业务单元本身为有状态服务,业务单元高可用
解决方案:
使用 Hazelcast In-Memory Data Grid 的 replication map 在多个 jvm 实例之间做数据同步。
java 启动参数加上 -XX:+DisableAttachMechanism -XX:-UsePerfData,禁止 jstack,jmap 等等 jdk 工具连接
关于前置模块,其实还有很多很奇葩的故事,鉴于时间关系,这里就不展开讲了。以后有机会可以当笑话给大家讲。
组合净值计算性能优化:
一支股票可能在超过20万个组合里(南车北车中车,暴风科技)
离线计算,存储计算后的结果
股价3秒变一次,涉及到这支股票的所有组合理论上也需要每 3 秒重新计算一次
大家可能会问,为什么不用户请求时,实时计算呢?这是因为“组合净值”中还包括分红送配,分股,送股,拆股,合股,现金,红利等等,业务太过复杂,开发初期经常需要调整计算逻辑,所以就设计成后台离线计算模式了。当前正在改造,将分红送配逻辑做成离线计算,股价组成的净值实时计算。接口请求是,将实时计算部分和离线计算部分合并成最终结果。
实际上,我们的计算逻辑是比较低效的:循环遍历所有的组合,对每个组合,获取所有的价值数据,然后计算。完成一遍循环后,立即开始下一轮循环。
优化:
分级:活跃用户的活跃组合,其它组合。
批量:拉取当前所有股票的现价到 JVM 内存里,这一轮的所有组合计算都用这一份股价快照。
关于这个话题的更详细内容,感兴趣的可以参考雪球组合业务总监张岩枫在今年的 arch summit 深圳大会上的分享:构建高可用的雪球投资组合系统技术实践 http://sz2015.archsummit.com/speakers/201825
最后,我们还做了一些通用的架构和性能优化,包括jdk升级到8,开发了一个基于 zookeeper 的 config center 和开关降级系统
四. 聊聊关于架构优化的一些总结和感想
在各种场合经常听说的架构优化,一般都是优化某一个具体的业务模块,将性能优化到极致。而在雪球,我们做的架构优化更多的是从问题出发,解决实际问题,解决到可以接受的程度即可。可能大家看起来会觉得很凌乱,而且每个事情单独拎出来好像都不是什么大事。
我们在对一个大服务做架构优化时,一般是往深入的本质进行挖掘;当我们面对一堆架构各异的小服务时,“架构优化”的含义其实是有一些不一样的。大部分时候,我们并不需要(也没有办法)深入到小服务的最底层进行优化,而是去掉或者优化原来明显不合理的地方就可以了。
在快速迭代的创业公司,我们可能不会针对某一个服务做很完善的架构设计和代码实现,当出现各种问题时,也不会去追求极致的优化,而是以解决瓶颈问题为先。
即使我们经历过一回将 snowball 拆分服务化的过程,但当我们重新上一个新的业务时,我们依然选择将它做成一个大一统的服务。只是这一次,我们会提前定义好每个模块的 service 接口,为以后可能的服务化铺好路。
在创业公司里,重写是不能接受的;大的重构,从时间和人力投入上看,一般也是无法承担的。而“裱糊匠”式做法,哪里有性能问题就加机器,加缓存,加数据库,有可用性问题就加重试,加log,出故障就加流程,加测试,这也不是雪球团队工作方式。我们一般都采用最小改动的方式,即,准确定义问题,定位问题根源,找到问题本质,制定最佳方案,以最小的改动代价,将问题解决到可接受的范围内。
我们现在正在所有的地方强推3个数据指标:qps,p99,error rate。每个技术人员对自己负责的服务,一定要有最基本的数据指标意识。数字,是发现问题,定位根源,找到本质的最重要的依赖条件。没有之一。
我们的原则:保持技术栈的一致性和简单性,有节制的尝试新技术,保持所有线上服务依赖的技术可控,简单来说,能 hold 住。
能用cache的地方绝不用db,能异步的地方,绝不同步。俗称的:吃一堑,长一智。
特事特办:业务在发展,需求在变化,实现方式也需要跟着变化。简单的来说:遗留系统的优化,最佳方案就是砍需求,呵呵。
㈩ 股票入选雪球100什么意思
原标题:中证雪球智选大数据100指数下月发布
中证指数有限公司将于9月16日发布中证雪球智选大数据100指数。该指数由博时基金管理公司定制开发。据悉,博时基金并正在开发基于该指数的基金产品。
据介绍,雪球是一家社交投资平台,其用户的讨论信息和投资组合信息包含了对股市的实时分析判断。基于这些投研信息,中证雪球智选大数据100指数在编制时采用动量与反转策略,及时挖掘价值洼地,规避热度较高板块。
根据编制方案,以雪球的百万自选组合为基础,选取历史超额收益前1000名的组合作为智选组合。将个股同期入选不同智选组合的次数作为情绪参考指标,即雪球热度因子,并给予入选次数较多的个股以较低的因子得分。最后从智选组合所覆盖的全部个股中,根据综合财务因子、市场驱动因子、雪球热度因子的得分选取综合得分最高的100名作为样本股,并以等权重加权。
作者:周松林
来源中国证券报·中证网)