俗话说:牛市在静悄悄中开启,在狂热中结束。在牛市开始时往往已经经过了数年的熊市,市场内大部分股票跌跌不休,市场投资者逐渐不在关注股市,在股市无人问津的时候,股票的估值达到了很低的水平,出现了投资价值,一些聪明的资金开始慢慢建仓,当这些资金建仓到一定程度,为了出货就会快速拉伸并舆论造势。到这个时候后知后觉的投资者才关注股市,并在一路上涨的走势中上车,成为新一轮的韭菜。本文就对这个 现象进行定性分析,分析表明,当股市走到半山腰时,股市相关的微博热度才起来,待到股市已经走完了牛市,舆论才达到顶点。
根据之前写的爬取微博的博文,爬取微博上具有代表性的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年会有一波牛市也不一定(不构成任何建议,不承担任何责任)。
分析结果和经验较符合,但是微博的数据不专业,也许雪球会是一个较好的数据来源。此类社交平台的舆论监控也可集成到量化交易系统中作为一个模块,用来分析股市的点数位置,确定风险系数。