第一步股票量化分析(一)获取A股列表 篇我们获取了所有的A股上市的代码列表 ,第二步需要从所有的股票列表中进一步缩小范围,将2千多支股票缩小到三四十支股票,并从中获取目标股票。

一、分析

1、动静分析

stock中有很多指标,比如市盈率(PE)、流通市值、委比、量比、换手率、获利比率、财物指标等等。其中一部分属于短期内变化不大的指标,如PE、流通市值。所以这类参数,我们可以将这类参数看为静态参数,可以一到一周其一次值的数据。像时时变化的委比、量比、换手率等为动态数据,这部分需要时时刷新的。

2、参数信息

本次实现的目标为:

市盈率:0 ~ 20 之间

总流通市值:50亿以下

为什么选取这两个值,先看下网上的介绍:

市盈率指在一个考察期(通常为12个月的时间)内,股票的价格和每股收益的比例,也称为拖动PE。投资者通常利用该比例值估量某股票的投资价值。一般来说,市盈率水平为

一般来说,市盈率水平为:

  • 0-13-即价值被低估
  • 14-20-即正常水平
  • 21-28-即价值被高估
  • 28+-反映股市出现投机性泡沫

市盈率极高(如大于100倍)的股票,其股息收益率为零。因为当市盈率大于100倍,表示投资者要超过100年的时间才能回本,股票价值被高估,没有股息派发。

第二个值,流通市值为什么也要取小一些的呢?因为总股本越低,股价也较容易被拉升。像中石油、中石化这种流通市值在千亿的股票机构想要操作很困难。所以选取了这两个指标。

3、选取采集源

可以采集的数据源有深沪两市官方站、sina财经、东方财富、大智慧、同花顺、qq财经等。比较了两家后选取了同花顺,因为其PE值和官方数据同步(其他站上发现也和这个值相同),而sina财经的值比官方值略大。另外一个原因是其分析出的数据格式比较接近于json格式,略做处理就可以json化分析。

其实时行情页面为:http://stockpage.10jqka.com.cn/stockid/,例如:http://stockpage.10jqka.com.cn/600030/ ,对应的类 json js页面地址为:http://d.10jqka.com.cn/v2/realhead/hs_stockid/last.js ,如http://d.10jqka.com.cn/v2/realhead/hs_600030/last.js ,具体看下图(点击图片看大图):

stockid

json中的键值对应关系为:

12034120:市盈率
23475914:流通市值 以元为单位,需除以(/1000/1000/100)得到亿元单位
310:当前价
4461256:委比
51968584:换手率

更多对应关系可以通过JSON值和页面值比对取得。

二、采集分析

由于这里只取两个静态值进行范围缩小,其代码写起来也比较简单,如下:

 1[root@361way stock]# more get_pe.py
 2#!/usr/bin/python
 3#coding=utf-8
 4# code by 运维之路(www.361way.com)
 5# 1、pe在 0~20 之间的企业
 6# 2、流通股本小于50亿的企业
 7import urllib2
 8import time
 9import json
10#header段代码进行了伪装,避免被源站墙掉
11def get_pe(stockid):
12    try:
13        url = 'http://d.10jqka.com.cn/v2/realhead/hs_%s/last.js' % stockid
14        send_headers = {
15            'Host':'d.10jqka.com.cn',
16            'Referer':'http://stock.10jqka.com.cn/',
17            'Accept':'application/json, text/javascript, */*; q=0.01',
18            'Connection':'keep-alive',
19            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36',
20            'X-Forwarded-For':'124.160.148.178',
21            'X-Requested-With':'XMLHttpRequest'
22        }
23        req = urllib2.Request(url,headers=send_headers)
24        f = urllib2.urlopen(req)
25        data = f.read().split('items":',1)[1]
26        data = data.split('})',1)[0]
27        J_data = json.loads(data)
28        #J_data = json.dumps(data,indent=4,encoding='utf-8')
29        stockpe = J_data['2034120']
30        stockname = J_data['name']
31        sumvalue = J_data['3475914']
32        currentprice = J_data['10']
33        #print stockid,stockname,stockpe
34        return stockname,stockpe,sumvalue,currentprice
35    except urllib2.HTTPError, e:
36        #return stockid ,'get happed httperror'
37        return e.code
38if __name__ == '__main__':
39    print 'stockid  stockname  currentprice  stockpe  Billvalue'
40    stockids = [line.strip() for line in open("stock_exp.txt", 'r')]
41    for stockid in stockids:
42      try:
43        stockname,stockpe,sumvalue,currentprice = get_pe(stockid)
44        if sumvalue:
45           Billvalue = round(float(sumvalue)/1000/1000/100)
46        else:
47           Billvalue = 0
48        if stockpe:
49           if float(stockpe) > 0 and float(stockpe) < 20 and Billvalue < 50 :
50              print stockid,stockname,currentprice,stockpe,Billvalue
51        #else:
52        #   print stockid
53      except TypeError ,e:
54        print stockid ,'get is error'

执行后,得到的结果类似如下结果:

stock_result

写在最后:

这里只用了两个指标相对比较简单,可以再通过增加财物指标分析,范围缩到10支以内。不过代码和程序是死的,只不过其根据人的意志减少人力分析的过程,帮助我们更快更优的找到结果,并最终决策。在真正操作时,可能还会涉及到政策、行业前景、牛熊行情等综合分析。

另外程序方面也还有优化的余地,这里只是一个简单的遍历版,采集效率不高。在动态数据采集时,如果使用这种方法,显然延时会较高。后续可以考虑加入多进程或多线程进行并发执行。