今天给大家分享一个关于基本面的公式,提前申明一下这个公式不是我想出来的,不做投资依据。这个公式出自《股市稳赚》作者是(美)乔尔·格林布拉特,我在百度上粘贴一段他的介绍下来:“乔尔·格林布拉特是Gotham资本公司的创始人和合伙经理人,自1985年这一私人投资公司成立以来,它的年均回报率达到了40%。他不仅是哥伦比亚大学商学院的客座教授,一家《财富》500强公司的前董事长,价值投资者俱乐部网站的合作发起人,还是《你能成为股市天才》一书的作者。格林布拉特拥有理学学士学位,并从沃顿学院获得工商管理硕士学位。”
公式的内容是:分别对PE、ROE进行排序,PE越低排名越高、ROE越高排名越高,最后把PE、ROE的排名加起来,挑出排名前30位的股票进行投资,当然还有一些细节的操作,大家感兴趣的话可以看看这本书。
![c12b85918177750db44fe7a68ef1ad5d.jpeg](https://i-blog.csdnimg.cn/blog_migrate/f0d2bde4ed4bd7c6cdb1d0b9c6b92258.jpeg)
这次我们需要获取的数据就是个股PE、ROE。
目标网站:
aHR0cDovL3F1b3RlLmVhc3Rtb25leS5jb20vY2VudGVyL2dyaWRsaXN0Lmh0bWwjaHNfYV9ib2FyZA==
目录:
1、环境
2、分析网站
3、实现爬取
1、环境
Python3.7、requests
2、分析网站
![ed15a9b9f4098533f7c06edf8ead19b0.jpeg](https://i-blog.csdnimg.cn/blog_migrate/38644a5a62c10d48e0950e7f3918109a.jpeg)
随便输入一个股票代码如:000001,选取第一个结果,
![0b8c22ce5002088914f0578acf1cb475.jpeg](https://i-blog.csdnimg.cn/blog_migrate/869f4d4ca5a3251c204de6248df61e47.jpeg)
我们就是要这两个数据,打开开发者工具Ctrl+F直接查找,我是根据公司市值进行查询的如图2-3
![c13cc8fbdf9172358ef7bb42322a7518.jpeg](https://i-blog.csdnimg.cn/blog_migrate/19a6845080074ed80bb3ef5dfed614c3.jpeg)
找到数据接口就简单了,请求拿数据就好了,我们只要f12、f14、f23、f37
3、代码实现
注意了这里返回的不符合json格式,因此需要自己转换,可以用正则直接提取数据,这是我之前一直用的方法,但是最近我发现了一个好方法可以轻松解决
a = '[1, 2, 3]'
print(type(a))
print(type(eval(a)))
运行结果:
<class 'str'>
<class 'list'>
eval()可以将符合列表、字典等格式的字符串直接转为对应的类型
将返回的字符数据切片出目标的字符串再进行转换就好了
def jquery_list(jquery, data_mode='[') -> dict:
reverse_mode = {'[': ']', '{': '}', '(': ')'}
tail_str = jquery[-5:][::-1]
return eval(jquery[jquery.index(data_mode): -tail_str.index(reverse_mode[data_mode])])
请求得到数据
def get_page(url, json=False):
"""
获取源码
"""
if json:
return requests.get(url=url, headers=headers).json()
return requests.get(url=url, headers=headers).text
def jquery_list(jquery, data_mode='[') -> dict:
reverse_mode = {'[': ']', '{': '}', '(': ')'}
tail_str = jquery[-5:][::-1]
return eval(jquery[jquery.index(data_mode): -tail_str.index(reverse_mode[data_mode])])
def main(end):
date = time.strftime('%Y-%m-%d', time.localtime())
for page in range(1, end):
url = 'http://65.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124020466762984478337' \
f'_1609556336027&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&' \
'fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2,m:1+t:23&' \
'fields=f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,' \
f'f24,f25,f22,f11,f62,f128,f136,f115,f152,f37,f100,f102&_={int(time.time() * 1000)}'
content = get_page(url=url)
result = jquery_list(content, data_mode='{')
for i in result['data']['diff']:
f12, f14, f9, f37 = i['f12'], i['f14'], i['f9'], i['f37']
data = {"date": date, "stock_code": f12, "name": f14, 'PE': f9, 'ROE': f37}
print(data)
运行结果:
![8cfcf65b6b4d9117c7c0ae9a6f234e7f.png](https://i-blog.csdnimg.cn/blog_migrate/91c04927d9494cb86e14d5f63a6e91a9.png)
main函数的参数end是首页的最大页数
![3068fcce182011db369837e8ab5c4b1d.png](https://i-blog.csdnimg.cn/blog_migrate/ddbb770993765914f355d3d735ba36bd.png)
这个基本面公式不是一直有效的,每几年就可能会失效一次,如果你想使用这个公式的话建议先把原著看一遍。