股市稳赚

投资有风险,入市需谨慎

今天给大家分享一个关于股市的公式,提前申明一下这个公式不是我想出来的,不做投资依据。这个公式出自《股市稳赚》作者是(美)乔尔·格林布拉特,我在百度上粘一段他的介绍下来:“乔尔·格林布拉特是Gotham资本公司的创始人和合伙经理人,自1985年这一私人投资公司成立以来,它的年均回报率达到了40%。他不仅是哥伦比亚大学商学院的客座教授,一家《财富》500强公司的前董事长,价值投资者俱乐部网站的合作发起人,还是《你能成为股市天才》一书的作者。格林布拉特拥有理学学士学位,并从沃顿学院获得工商管理硕士学位。”

公式的内容是:分别对PE、ROE进行排序,PE越低排名越高、ROE越高排名越高,最后把PE、ROE的排名加起来,挑出排名前30位的股票进行投资,当然还有一些细节的操作,大家感兴趣的话可以看看这本书。

2c0c4caa36d07417a23864ccd5e97731.jpeg

这次我们需要获取的数据就是个股PE、ROE。


目标网站:

aHR0cDovL3F1b3RlLmVhc3Rtb25leS5jb20vY2VudGVyL2dyaWRsaXN0Lmh0bWwjaHNfYV9ib2FyZA==


目录:

1、环境

2、分析网站

3、实现爬取


1、环境

Python3.7、requests、pymongo


2、分析网站

04ba0d427c0cb6f6dde4b0f355f089b1.jpeg
图2-1

随便输入一个股票代码如:000001,选取第一个结果。

d55d9cb0c6fbd82b949fdfeafa2e7ffc.jpeg
图2-2

我们就是要这两个数据,打开开发者工具Ctrl+F直接查找,我是根据公司市值进行查询的如图2-3

cd29782e3a559bbce3ad4fe8973b821c.jpeg
图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()

这里只是获取一个公司的数据,如果需要获取全部公司的数据就需要把全部公司的股票代码获取到,然后循环获取。

这个方法不是一直有效的,每几年就可能会失效一次,如果你想使用这个公式的话建议先把原著看一遍,心急是吃不了热豆腐的。

投资有风险,入市需谨慎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值