投资有风险,入市需谨慎
今天给大家分享一个关于股市的公式,提前申明一下这个公式不是我想出来的,不做投资依据。这个公式出自《股市稳赚》作者是(美)乔尔·格林布拉特,我在百度上粘一段他的介绍下来:“乔尔·格林布拉特是Gotham资本公司的创始人和合伙经理人,自1985年这一私人投资公司成立以来,它的年均回报率达到了40%。他不仅是哥伦比亚大学商学院的客座教授,一家《财富》500强公司的前董事长,价值投资者俱乐部网站的合作发起人,还是《你能成为股市天才》一书的作者。格林布拉特拥有理学学士学位,并从沃顿学院获得工商管理硕士学位。”
公式的内容是:分别对PE、ROE进行排序,PE越低排名越高、ROE越高排名越高,最后把PE、ROE的排名加起来,挑出排名前30位的股票进行投资,当然还有一些细节的操作,大家感兴趣的话可以看看这本书。
这次我们需要获取的数据就是个股PE、ROE。
目标网站:
aHR0cDovL3F1b3RlLmVhc3Rtb25leS5jb20vY2VudGVyL2dyaWRsaXN0Lmh0bWwjaHNfYV9ib2FyZA==
目录:
1、环境
2、分析网站
3、实现爬取
1、环境
Python3.7、requests、pymongo
2、分析网站
随便输入一个股票代码如:000001,选取第一个结果。
我们就是要这两个数据,打开开发者工具Ctrl+F直接查找,我是根据公司市值进行查询的如图2-3
找到数据接口就简单了,请求拿数据就好了,我们只要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 save_data(data):
"""
存储数据
"""
collection = pymongo.MongoClient("localhost", 27017).stock2.stock_data
collection.insert_one(data)
def cleaning_data():
"""
清洗数据,剔除*ST、ST、PT、S开头的股票
对于基本面数据还需要清洗PE、ROE小于0的数据
"""
collection = pymongo.MongoClient("localhost", 27017).stock2.stock_data
collection.delete_many({'PE': {'$lte': 0}})
collection.delete_many({'ROE': {'$lte': 0}})
collection.delete_many({'name': {'$regex': r'\*ST.+'}})
collection.delete_many({'name': {'$regex': 'ST.+'}})
collection.delete_many({'name': {'$regex': 'PT.+'}})
collection.delete_many({'name': {'$regex': 'S.+'}})
print('清洗完成')
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():
date = time.strftime('%Y-%m-%d', time.localtime())
url = 'http://push2.eastmoney.com/api/qt/slist/get?spt=1&np=3&fltt=2&invt=2&fields=f9,f12,f13,f14,f20,f23,' \
'f37,f45,f49,f134,f135,f129,f1000,f2000,f3000&ut=bd1d9ddb04089700cf9c27f6f7426281&' \
'cb=jQuery11240852247440623479_1617697154297&secid=0.000001&_=1617697154298'
content = get_page(url=url)
result = jquery_list(content, data_mode='{')
f12 = result['data']['diff'][0]['f12']
f14 = result['data']['diff'][0]['f14']
f23 = result['data']['diff'][0]['f23']
f37 = result['data']['diff'][0]['f37']
pe_rank, roe_rank, rank = None, None, None
data = {"date": date, "stock_code": f12, "name": f14, 'PE': f23, 'PE_rank': pe_rank,
'ROE': f37, 'ROE_rank': roe_rank, 'rank': rank}
save_data(data=data)
cleaning_data()
这里只是获取一个公司的数据,如果需要获取全部公司的数据就需要把全部公司的股票代码获取到,然后循环获取。
这个方法不是一直有效的,每几年就可能会失效一次,如果你想使用这个公式的话建议先把原著看一遍,心急是吃不了热豆腐的。