摘要
俗话说:牛市在静悄悄中开启,在狂热中结束。在牛市开始时往往已经经过了数年的熊市,市场内大部分股票跌跌不休,市场投资者逐渐不在关注股市,在股市无人问津的时候,股票的估值达到了很低的水平,出现了投资价值,一些聪明的资金开始慢慢建仓,当这些资金建仓到一定程度,为了出货就会快速拉伸并舆论造势。到这个时候后知后觉的投资者才关注股市,并在一路上涨的走势中上车,成为新一轮的韭菜。本文就对这个 现象进行定性分析,分析表明,当股市走到半山腰时,股市相关的微博热度才起来,待到股市已经走完了牛市,舆论才达到顶点。
介绍
根据之前写的爬取微博的博文,爬取微博上具有代表性的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 = 0comments_sum = 0reposts_sum = 0for 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'))#新建一个空DataFrameeach_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] = 1outcome_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] += 1outcome_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或研究生生活感兴趣的同学关注我的个人微信公众号。