用Python分析微博股市热度和A股走势的关联

4 篇文章 1 订阅
3 篇文章 1 订阅

摘要

俗话说:牛市在静悄悄中开启,在狂热中结束。在牛市开始时往往已经经过了数年的熊市,市场内大部分股票跌跌不休,市场投资者逐渐不在关注股市,在股市无人问津的时候,股票的估值达到了很低的水平,出现了投资价值,一些聪明的资金开始慢慢建仓,当这些资金建仓到一定程度,为了出货就会快速拉伸并舆论造势。到这个时候后知后觉的投资者才关注股市,并在一路上涨的走势中上车,成为新一轮的韭菜。本文就对这个 现象进行定性分析,分析表明,当股市走到半山腰时,股市相关的微博热度才起来,待到股市已经走完了牛市,舆论才达到顶点。
在这里插入图片描述

介绍

根据之前写的爬取微博的博文,爬取微博上具有代表性的10位博主的微博,并对其进行数据处理,得到每天每位博主发布的微博条数、平均每条微博点赞、平均每条微博评论数和平均每条微博转发数,并以此作为股市热度。并对比股市走势和股市热度的走势,分析之间的联系。

具体实现

具体代码如下:
首先,导入需要的模块

import talib as ta#技术分析模块
import pandas as pd

talib是进行技术分析使用很广的模块,pandas就不说了

def weibo_hot(name):#name是读取的微博博主名字
    f = open('D:\\python_project\\crawl\\weibo\\base_data_%s.txt'%name,'r+',encoding='utf-8')#读取数据
    dic = eval(f.read())#读取数据转化为字典
    f.close()
    
    data_date = {}#储存每个日期对应的微博数据
    for item in dic.values():
        date = item['created_at']
        if date in data_date:#data_date按点赞数、评论数、转发数来存储数据
            data_date[date].append([item['attitudes'],item['comments'],item['reposts']])
        else:
            data_date[date] = [[item['attitudes'],item['comments'],item['reposts']]]
    
    date_all = sorted(data_date)[500:]#将data_date中的微博数据按日期排列,排列顺序为日期最早的在最前面,且只取开通微博500天后的数据
    
    used_data = {}#存储用得到的数据
    for date in date_all:
        number = len(data_date[date])
        attitudes_sum = 0
        comments_sum = 0
        reposts_sum = 0
        for i in range(0,len(data_date[date])):
            attitudes_sum  += data_date[date][i][0]#该日期所有微博总点赞数
            comments_sum  += data_date[date][i][1]#该日期所有微博总评论数
            reposts_sum  += data_date[date][i][2]#该日期所有微博总转发数
        attitudes = (attitudes_sum/len(data_date[date]))#求平均
        comments = (comments_sum/len(data_date[date]))
        reposts = (reposts_sum/len(data_date[date]))
        used_data[date] = [number,attitudes,comments,reposts]
    return used_data#返回的是字典

以上代码是用来读取单个博主微博信息的代码,返回的是一个记录每天发博数、平均点赞数、平均评论数、平均转发数的一个字典。接下来需要将所有的博主的微博数据读取,代码如下;

def outcome():
    all_person = ['李大霄','花荣','上海徐晓峰','天津股侠','微博股票','天狼50陈浩','雪球','云财经','宇辉战舰','港股通AiH']#所有人的微博名
    outcome_data = pd.DataFrame(columns=('number','attitudes','comments','reposts'))#新建一个空DataFrame
    each_num = {}
    for person in all_person:
        data = pd.DataFrame(weibo_hot(name = person)).T#返回的是字典
        for each in data.index.values:#index是日期
            if each not in outcome_data.index.values:
                each_num[each] = 1
                outcome_data.loc[each] = {'number':data.loc[each][0],'attitudes':data.loc[each][1],'comments':data.loc[each][2],'reposts':data.loc[each][3]}
            else:
                each_num[each] += 1
                outcome_data.loc[each]['number'] += data.loc[each][0]
                outcome_data.loc[each]['attitudes'] += data.loc[each][1]
                outcome_data.loc[each]['comments'] += data.loc[each][2]
                outcome_data.loc[each]['reposts'] += data.loc[each][3]
    for each in outcome_data.index.values:
        outcome_data.loc[each]['number'] /= each_num[each]#取每个博主的日平均发博
        outcome_data.loc[each]['attitudes'] /= each_num[each]#取每个博主的日平均点赞数
        outcome_data.loc[each]['comments'] /= each_num[each]#取每个博主的日平均评论数
        outcome_data.loc[each]['reposts'] /= each_num[each]#取每个博主的日平均转发数
        
    outcome_data = outcome_data.sort_index(inplace = False)
    return outcome_data

对得到的微博热度进行平滑化处理。

if __name__ == '__main__':
    outcome_data = outcome()
    number_ema = ta.EMA(outcome_data.number,timeperiod = 30)
    attitudes_ema = ta.EMA(outcome_data.attitudes,timeperiod = 30)
    comments_ema = ta.EMA(outcome_data.comments,timeperiod = 30)
    reposts_ema = ta.EMA(outcome_data.reposts,timeperiod = 30)

结果

由于上证指数易受到GJD的调控而产生指数失真的情况,所以这里对比的是中小板指和微博热度的关系。
在这里插入图片描述
可以看到在2014年这波牛市初期,热度缓慢上涨,而到了热度疯狂上涨的时候,股市已经迎来2015年中的股灾了。最终在股灾导致的股市快速下跌后,热度逐步回到正常区间(考虑到这几年微博的用户和股市投资者的增长)。在17年到18年的白马股上涨中虽然指数在涨,但是热度不增反减,说明散户参与少,白马股的上涨是机构报团取暖的结果。而最近热度又开始逐步上涨,说明最近的股市上涨是有一些散户参与的,或许在2020年会有一波牛市也不一定(不构成任何建议,不承担任何责任)。

讨论

分析结果和经验较符合,但是微博的数据不专业,也许雪球会是一个较好的数据来源。此类社交平台的舆论监控也可集成到量化交易系统中作为一个模块,用来分析股市的点数位置,确定风险系数。

本人中部某基科在读研究生,欢迎对量化交易和python或研究生生活感兴趣的同学关注我的个人微信公众号。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值