量化交易入门——选股第一式空穴来风

本文介绍如何利用Python网络爬虫从东方财富贴吧抓取含有特定关键词的股票帖子,通过筛选发帖人和过滤标题,挖掘可能的内幕信息,以此作为量化交易的参考,并对数据进行初步分析。
摘要由CSDN通过智能技术生成

         所谓内幕信息,是指证券交易活动中,涉及公司的经营、财务或者对该公司证券的市场价格有重大影响的尚未公开的信息。 

         内幕信息所具备的三大特质。

         1、是该信息所在集体,内部运作人员所知悉的信息。

          2、是该信息所在集体,尚未对外公开的信息。

           3、是对于信息所在集体或行业具备商业价值的信息。

        本文思路:通过网络爬虫获取贴吧信息,进行智能提取疑似的内幕信息

        工具:PYTHON

        目标:东方财富贴吧

        源码如下:

import requests
import re
import time
from bs4 import BeautifulSoup

import io
import sys




# 抓取网页的通用框架,获取页面的内容
def getHtml(url):
    try:
        r = requests.get(url, timeout=30)
        # 状态码不是200就发出httpError的异常
        r.raise_for_status()
        # 获取正确的编码格式
        # r.encoding=r.apparent_encoding
        r.encoding = "utf-8"
        # 打印内容
        return r.text


    except:
        return "wrong!"

def get_author(url):
    # 将网页内容格式化利用bs4库
    authorsoup = BeautifulSoup(getHtml(url), 'lxml')

    # 获取所有的li标签属性为 j_thread_list clearfix,用列表接收
    divTag = authorsoup.find('div', attrs={"id": "mainlist"}).text.strip()

    s = int(re.sub("\D", "", divTag))

    if s<magic_comment:
        return True
    else :
        return False







# 分析贴吧帖子的html文件,整理信息,保存问列表文件中
def get_content(url):
    # 初始化一个列表来保存所有的帖子信息
    contents = []

    # 获取网页的内容
    html = getHtml(url)

    # 将网页内容格式化利用bs4库
    soup = BeautifulSoup(html, 'lxml')

    # 获取所有的li标签属性为 j_thread_list clearfix,用列表接收
    divTags = soup.find_all('div', attrs={"class": "articleh normal_post"})


    # 循环这个内容li集合
    for div in divTags:

        # 将爬取到了每一条信息。保存到字典里
        content = {}

        tempo = ""


        # 将异样抛出,避免无数据时,停止运
        try:
            # 标题
            content['title'] = div.find('span', attrs={"class": "l3 a3"}).text.strip()  # .strip()  翻译为中文

            ########### 正则表达式搜索关键字符
            m = re.search(target,content['title'])
            d = re.search(gulu, content['title'])

            if m == None or d != None:
                continue


            ########### 按帖子编号形成索引
            # 获取标题连接
            tempo = div.find('span', attrs={"class": "l3 a3"}).find('a').get('href')
            content['index'] = tempo[13:22]
            # 如果索引不是9位数字,跳出本次循环
            if content['index'].isdigit() == False:
                continue
            content['link'] = link + tempo

            ########### 获取其他信息
            # 作者
            content['author'] = div.find('span', attrs={"class": "l4 a4"}).text.strip()
            # 评论
            content['responseNum'] = div.find('span', attrs={"class": "l2 a2"}).text.strip()
            # 创建时间
            content['creatTime'] = div.find('span', attrs={"class": "l5 a5"}).text.strip()

            ########### 如果不是本月的帖子,直接过滤
            n = re.search(month, content['creatTime'])
            if n:
                print(n.group(0))
            else:
                continue

            ########### 发帖人发帖数量是否符合要求
            # 获取发帖人信息
            content['authorlink'] = div.find('span', attrs={"class": "l4 a4"}).find('a').get('href')
            if get_author(content['authorlink']) == False:
                continue



            # 将字典加入到列表中
            contents.append(content)


        except:
            print('出问题')

        # 返回数据
    return contents


def writeTxt(content,i):
    # 这里不能写成 f=open("data.txt",'a+')否则会乱码,设置沉utf-8的格式,与getHtml(url):中的encoding一致
    f = open("data"+str(i)+ txt, 'a+', encoding='utf-8')

    for c in content:
        f.write('索引: {} \t 标题: {} \t 链接:{} \t 回复数量: {}  \t 发帖人:{} \t 发帖时间:{} \t 发帖人信息:{}\n'.format(
            c['index'], c['title'],  c['link'], c['responseNum'], c['author'], c['creatTime'],  c['authorlink']))


def main(url):
    url_list = []
    # 将所需要爬去的url放到列表中
    for i in range(stock_min, stock_max):
        for j in range(page_min, page_max):
            content = get_content(url + str(i) + "_"+ str(j) + last )
            if content:
               writeTxt(content,i)
            else:
                continue





url = "http://guba.eastmoney.com/list,"
cont = "http://guba.eastmoney.com/"
link = "http://guba.eastmoney.com"
last = ".html"
txt =".txt"
stock_min = 600001
stock_max = 602000
magic_comment = 5
page_min = 1
page_max = 10
month = time.strftime("%m", time.localtime()) +'-'
target='发财|上车|赚钱|机会|收购|重组|停牌|速买|满仓'
gulu = '我|你|预感|感觉|吗|?|留下|再见|走'
main(url)


              方案思路:

          (1)网络爬虫东方财富贴吧,获取最近的股票帖子,对标题进行敏感词定位,诸如“重组”,“上车”,“发财”等关键词的均进行帖子临时保存为A数据

          (2)对A数据的发帖人信息进行二次网络爬虫,爬取发帖人发帖数量(发帖量越少则表明该帖子更靠近内幕),过滤的数据为B

           (3)对B数据的标题进行二次过滤,排除诸如“预感”,“感觉”,“?”,“再见”等关键词的帖子,将最终数据保存为文本

            (4)对文本进行发帖时间与第二天股票走势进行匹配(目前人工判断)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三翔馆主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值