python金融数据挖掘与分析(七)——基于评级报告的投资决策分析

@[toc]

1. 获取券商研报网站的表格数据

和讯研报网是和讯网旗下专注于披露券商分析师研究报告信息的网站。
和讯研报网将延保分为不同的种类,如目标涨幅最大股、机构强烈推荐股等,这里以券商评级调升股为例进行相关数据的获取和分析。
网址:http://yanbao.stock.hexun.com/ybsj5.shtml

在这里插入图片描述

1.1 表格数据的常规获取方法

这里分两种情况来介绍:第一种是文件形式的表格数据,如世界银行的项目表格数据;第二种是网页形式的表格数据,如新浪财经的大宗交易表格数据。

  1. 文件形式的表格数据——世界银行项目表
    在浏览器中打开世界银行项目数据官网(https://datacatalog.worldbank.org/dataset/world-bank-projects-operations),利用F12查看源码,发现存储数据的csv文件的下载链接是固定的,因此我们可以直接采用Requests库访问该下载链接,即可下载csv文件。
import requests
url = 'https://search.worldbank.org/api/projects/all.csv'
res = requests.get(url)
file = open('data.csv', 'wb')
file.write(res.content)
file.close()
  1. 网页形式的表格数据——新浪财经大宗交易表
    表格直接呈现在网页上,如下图所示为新浪财经数据中心提供的大宗交易的表格数据。网址为:http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/dzjy/index.phtml大宗交易针对的是一笔数额较大的股票或债券交易,有时可以透露出较强的交易信号。
    在这里插入图片描述

    这里通过pandas库即可获取网页中的表格。
    url = 'http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/dzjy/index.phtml'
    table = pd.read_html(url)[0]
    table.to_excel('大宗交易表.xlsx', index=False)

1.2 用Selenium库爬取和讯研报网表格数据

对于和讯研报网的表格数据,如果使用pd.read_html()方式解析,会被网站拒绝访问,因此这里采用Selenium库来访问网页并获取网页源代码,然后使用pd.read_html()函数进行解析。

    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument('--headless')
    browser = webdriver.Chrome(options=chrome_option)

    url = 'http://yanbao.stock.hexun.com/ybsj5.shtml'
    browser.get(url)
    data = browser.page_source
    table = pd.read_html(data)[0]

通过上面的操作已经获得了比较全面的评级数据,但为了便于后面获取股票信息,这里需要对股票代码信息进行补充,通过F12查看网页源码发现,源码中包含有股票代码信息,可通过编写正则化规则实现。

    code_pattern = '<a href="yb_(.*?).shtml'
    code = re.findall(code_pattern, data)
    table['股票代码'] = code

如果想获取所有页的表格数据,可通过for循环语句来实现。

    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument('--headless')
    browser = webdriver.Chrome(options=chrome_option)
    
    data_all = pd.DataFrame()
    
    for pg in range(1, 90):

        url = 'http://yanbao.stock.hexun.com/ybsj5_'+ str(pg) +'.shtml'
        browser.get(url)
        data = browser.page_source
        table = pd.read_html(data)[0]
    
        code_pattern = '<a href="yb_(.*?).shtml'
        code = re.findall(code_pattern, data)
        table['股票代码'] = code
        
        data_all = pd.concat([data_all, table], ignore_index=True)
        
    data_all.to_excel('分析师评级报告.xlsx', index=False)

2. 评估券商分析师预测准确度

2.1 读取分析师评级报告数据进行数据预处理

    # 代码为数字,如果直接读进来,那么以0开头的代码会省略掉0
    df = pd.read_excel('分析师评级报告.xlsx', dtype={'股票代码': str})

    # 删除重复行和空行
    df = df.drop_duplicates()
    df = df.dropna(thresh=5)    # 如果该行的非空值少于5个,则删除

    # 连接‘研究机构’列和‘分析师’列
    df['研究机构-分析师'] = df.apply(lambda x: x['研究机构'] + '-' + x['分析师'], axis=1)

    # 选取需要的列
    columns = ['股票名称', '股票代码', '研究机构-分析师', '最新评级', '评级调整', '报告日期']
    df = df[columns]

    # 筛选日期:预测之后30天内的股票涨跌幅作为判断标准,所以这里需要将距离当前日期不足30天的数据剔除
    today = datetime.datetime.now()
    t = today - datetime.timedelta(days=30)
    t = t.strftime('%Y-%m-%d')
    df = df[df['报告日期'] < t]

2.2 用Tushare库计算股票收益率

收益率 = \frac{结束日收盘价格}{开始日收盘价格} - 1.0

def calculate_rate(df_use):
    rate = []   # 创建一个空列表,用来存储每只股票的收益率

    for i, row in df_use.iterrows():
        code = row['股票代码']
        analysist_date = row['报告日期']

        # 推算开始日,即第二天
        begin_date = datetime.datetime.strptime(analysist_date, '%Y-%m-%d')     #转化成datetime.datetime格式
        begin_date = begin_date + datetime.timedelta(days=1)
        begin_date = begin_date.strftime('%Y-%m-%d')    # 转化成字符串格式

        # 推算结束日,即第30天
        end_date = datetime.datetime.strptime(analysist_date, '%Y-%m-%d')
        end_date = end_date + datetime.timedelta(days=30)
        end_date = end_date.strftime('%Y-%m-%d')

        # 通过Tushare库计算股票收益率
        ts_result = ts.get_hist_data(code, begin_date, end_date)
        if ts_result is None or len(ts_result)<5:   # 防止无数据或数据较少
            return_rate = 0
        else:
            start_price = ts_result.iloc[-1]['open']
            end_price = ts_result.iloc[0]['close']
            return_rate = (end_price / start_price) - 1.0
        print('收益率:{}'.format(return_rate))
        rate.append(return_rate)

    return rate

主函数调用:

   df_use = df.iloc[0:100]     # 取一部分数据

    df_use['30天收益率'] = calculate_rate(df_use)

    for i, row in df_use.iterrows():
        print(i)
        print(row)

    df_use.to_excel('30天收益率.xlsx')

2.3 计算平均收益率并进行分析师预测准确度排名

接下来计算各个分析师所推荐股票的30天平均收益率及分析师的预测次数,并对分析师的预测准确度进行排名。

df = pd.read_excel('30天收益率.xlsx')

means = df.groupby('研究机构-分析师')[['30天收益率']].mean()
count = df.groupby('研究机构-分析师')[['30天收益率']].mean()
count = count.rename(columns={'30天收益率':'预测次数'})
df_final = pd.concat([means, count], axis=1)
df_final.sort_values(by='30天收益率', ascending=False, inplace=True)
df_final.to_excel('分析师预测结果.xlsx')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • AI+金融技术分层解构 从分层的视角来看,AI+金融技术可分为基础层、技术层和应用层三个层面。作为AI在金融领域落...
    shenciyou阅读 2,789评论 1 5
  • 金融知识大全(最全整理版) 本文实战财经 转自 优维金融空间,转载请注明来源! 第一部分:银行系金融知识大全! 1...
    cnnjzc阅读 6,226评论 0 14
  • 很久没有看电影了,因为对国产电影有太多失望。记得大二的时候开始接触安妮宝贝,尤其喜欢她的《莲花》,她的作品首次搬上...
    一枝山茶阅读 418评论 6 5
  • 我们 都在这个世界存活 难过是一天 开心也是一天 阳光会照在每个人的心上 难过的人也是 开心的人也是 严寒也不会缺...
    青只阅读 87评论 0 0