滚雪球 -- 收集中证指数各项指标
[csindex;hs300;influxdb;grafana;aws lambda;aws s3]
中证指数有限公司由上海证券交易所和深圳证券交易所共同出资成立,是一家从事指数编制、运营和服务的专业性公司。依托沪深证券交易所的信息和技术资源优势,管理和发展中证系列指数、交易所系列指数以及客户定制类指数,正逐步成为国内规模最大、产品最多、服务最全、最具市场影响力的专业指数服务公司。
最常听说的沪深300指数就是这个公司编制的。公司网站会每天更新指数信息,包括现在点位涨跌,指数成分与权重以及一些指数指标数据(PB,PE等)。
思路
从中证指数网站可以发现所需要的数据都以Excel形式提供下载。所以可以从Excel中解析数据,并转存到系统中,再由展示端形成监控图。
系统基于AWS云计算服务构建,分为收集,存储,转换,展示四个部分。
所有计算的部分都由AWS Lambda形式托管部署,源文件存储到AWS S3上,数据库采用InfluxDB,用Grafana做监控仪表。INfluxDb与Grafana部署到具备公网IP的AWS EC2 Instance上。
InfluxDB是时间序列数据库,对按天存储的金融数据有天然优势,缺点就是太吃内存了。Grafana有强大的图形展示功能,可添加Influxdb作为数据源。
具体结构如下:
Lambda Fetch
从CS INDEX 站点获取包含指数指标的Excel文件,然后存储到S3Lambda Fetch
由 CloudWatch的定时任务触发,每日一次- S3 Bucket配置了触发器,一旦有文件更新则继续触发
Lamda Parse
Lamda Parse
的工作就是解析S3上的新文件,并以时序数据的形式存储到InfluxDB上。- 在Grafana前台配置图形界面
部署AWS Lambda时使用的是Serverless,配置文件如下:
service: fetch-csindex-loop
provider:
name: aws
runtime: python3.6
stage: dev
region: us-east-1
memorySize: 128
timeout: 300
environment:
DYNAMODB_TS: market-repo-${opt:stage, self:provider.stage}
INFLUXDB: XXX
URL_PERF: http://www.csindex.com.cn/uploads/file/autofile/perf/{{INDEX}}perf.xls
URL_CONS: http://www.csindex.com.cn/uploads/file/autofile/cons/{{INDEX}}cons.xls
BUCKET_DATA: csindex-data-files-${opt:stage, self:provider.stage}
CODES: 000300|000016|000922|000905|000925|000015|000808|000806|000807|000918|000919|000913|000912|H30269|399975
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
- dynamodb:DescribeTable
Resource:
- arn:aws:dynamodb:us-east-1:*:table/${self:provider.environment.DYNAMODB_TS}
- Effect: Allow
Action:
- s3:GetObject
- s3:DeleteObject
- s3:PutObject
Resource:
- arn:aws:s3:::csindex-data-files-${opt:stage, self:provider.stage}/*
functions:
fetch-perf:
handler: handler.fetch_perf_file
events:
- schedule: cron(0 0-1/1 ? * MON-FRI *)
parse-perf:
handler: handler.parse_perf_file
events:
- s3:
bucket: csindex-data-files-${opt:stage, self:provider.stage}
event: s3:ObjectCreated:*
rules:
- prefix: 'csindex_pref'
resources:
Resources:
FetchDashperfLogGroup:
Type: AWS::Logs::LogGroup
Properties:
RetentionInDays: "90"
ParseDashperfLogGroup:
Type: AWS::Logs::LogGroup
Properties:
RetentionInDays: "90"
成果
以下是Grafana的监控图表,可以自己配置出数据涨跌的热力图,指数价格的变动,指数PE的变化等。