股票量化分析(二)PE和流通市值

2015年6月21日 发表评论 阅读评论

第一步股票量化分析(一)获取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中的键值对应关系为:

2034120:市盈率
3475914:流通市值 以元为单位,需除以(/1000/1000/100)得到亿元单位
10:当前价
461256:委比
1968584:换手率

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

二、采集分析

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

[root@361way stock]# more get_pe.py
#!/usr/bin/python
#coding=utf-8
# code by 运维之路(www.361way.com)
# 1、pe在 0~20 之间的企业
# 2、流通股本小于50亿的企业
import urllib2
import time
import json
#header段代码进行了伪装,避免被源站墙掉
def get_pe(stockid):
    try:
        url = 'http://d.10jqka.com.cn/v2/realhead/hs_%s/last.js' % stockid
        send_headers = {
            'Host':'d.10jqka.com.cn',
            'Referer':'http://stock.10jqka.com.cn/',
            'Accept':'application/json, text/javascript, */*; q=0.01',
            'Connection':'keep-alive',
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36',
            'X-Forwarded-For':'124.160.148.178',
            'X-Requested-With':'XMLHttpRequest'
        }
        req = urllib2.Request(url,headers=send_headers)
        f = urllib2.urlopen(req)
        data = f.read().split('items":',1)[1]
        data = data.split('})',1)[0]
        J_data = json.loads(data)
        #J_data = json.dumps(data,indent=4,encoding='utf-8')
        stockpe = J_data['2034120']
        stockname = J_data['name']
        sumvalue = J_data['3475914']
        currentprice = J_data['10']
        #print stockid,stockname,stockpe
        return stockname,stockpe,sumvalue,currentprice
    except urllib2.HTTPError, e:
        #return stockid ,'get happed httperror'
        return e.code
if __name__ == '__main__':
    print 'stockid  stockname  currentprice  stockpe  Billvalue'
    stockids = [line.strip() for line in open("stock_exp.txt", 'r')]
    for stockid in stockids:
      try:
        stockname,stockpe,sumvalue,currentprice = get_pe(stockid)
        if sumvalue:
           Billvalue = round(float(sumvalue)/1000/1000/100)
        else:
           Billvalue = 0
        if stockpe:
           if float(stockpe) > 0 and float(stockpe) < 20 and Billvalue < 50 :
              print stockid,stockname,currentprice,stockpe,Billvalue
        #else:
        #   print stockid
      except TypeError ,e:
        print stockid ,'get is error'

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

stock_result

写在最后:

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

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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.