【python量化】用python搭建一个股票舆情分析系统(python详细安装教程)
寫在前面
下面的這篇文章將手把手教大家搭建一個簡單的股票輿情分析系統,其中將先通過金融界網站爬取指定股票在一段時間的新聞,然后通過百度情感分析接口,用于評估指定股票的正面和反面新聞的占比,以此確定該股票是處于利好還是利空的狀態。
1
環境準備
本地環境:
Python3.7
IDE:Pycharm
庫版本:
re 2.2.1
lxml 4.6.3
requests 2.24.0
aip4.15.5
matplotlib 3.2.1
其中用到了百度的ai接口,通過pip安裝的方式如下:
pip install baidu-aip
然后,導入需要用到的所有庫:
import requests
import matplotlib.pyplot as plt
import pandas as pd
from lxml import etree
from aip import AipNlp
2
代碼實現
1、獲取新聞數據
首先,我們需要通過金融界(http://stock.jrj.com.cn/share)的網站爬取股票的新聞信息。獲取指定股票的新聞資訊的接口形式是:
http://stock.jrj.com.cn/share,股票代碼,ggxw.shtml
如:http://stock.jrj.com.cn/share,600381,ggxw.shtml
如600381股票的新聞資訊如下圖所示:
需要注意的是,當獲取后面幾頁的新聞時,其接口需要加一個后綴,形式如下:
http://stock.jrj.com.cn/share,600381,ggxw_page.shtml
如獲取第二頁,http://stock.jrj.com.cn/share,600381,ggxw_2.shtml
首先,我們定義一個函數,傳入一個股票代碼的列表,表示用于下載到本地的股票新聞的代碼。然后將每個股票的代碼拼接到api中,然后調用parse_pages()函數用于爬取該api下網頁中的數據。
# 下載指定的股票的新聞數據
def download_news(codes):
for code in codes:
print(code)
url = "http://stock.jrj.com.cn/share," + str(code) + ",ggxw.shtml"
parse_pages(url, code)
接下來,我們實現上面的parse_pages()函數。其中需要先獲取每一頁新聞數據的總的頁數,然后針對每一頁拼接對應的api接口,最后再對每一頁的新聞數據進行下載。
# 解析每個頁面的數據
def parse_pages(url, code):
max_page = get_max_page(url)
for i in range(1, max_page + 1):
if i != 1:
url = "http://stock.jrj.com.cn/share," + str(code) + ",ggxw_" + str(i) + ".shtml"
download_page(url, code)
獲取最大頁數的函數如下,其中用到了lxml下的etree模塊來解析html代碼,然后通過正則表達式獲取最大頁數。
# 獲取url下的最大page數
def get_max_page(url):
page_data = requests.get(url).content.decode("gbk")
data_tree = etree.HTML(page_data)
if page_data.find("page_newslib"):
max_page = data_tree.xpath("http://*[@class=\"page_newslib\"]//a[last()-1]/text()")
return int(max_page[0])
else:
return 1
接下來實現download_page()函數,它的作用通過正則表達式匹配頁面中的新聞標題,并將獲取的標題數據保存到本地文件中。
# 解析指定頁面的數據并保存至本地
def download_page(url, code):
try:
page_data = requests.get(url).content.decode("gbk")
data_tree = etree.HTML(page_data)
titles = data_tree.xpath("http://*[@class = \"newlist\"]//li/span/a/text()")
for title in titles:
title = title + "\r\n"
with open(str(code) + ".txt", "a") as file:
file.write(title)
file.flush()
return
except:
print("服務器超時")
接下來,通過調用上面的download_news()函數,并傳入需要爬取新聞的股票代碼列表,就可以將新聞數據爬取到本地了。
codes = [600381, 600284, 600570, 600519, 600258, 601179]
download_news(codes)
得到的新聞數據形式如下圖所示:
2、新聞情緒分析以及統計
在獲取了股票的新聞數據之后,我們接下來需要對每支股票的所有新聞進行情感分析了。其中用到了百度人工智能接口aip下的aipNLP用于對所有新聞數據進行自然語言處理,并進行情感分析。需要注意的是,在通過百度人工智能接口進行情感分析之前需要先注冊并獲取APP_ID、API_KEY以及SECRET_KEY。獲取的方式如下:
首先,登錄并注冊百度人工智能平臺(https://ai.baidu.com/):
然后,在自己的控制臺中找到自然語言處理,并創建應用,如下圖所示:
創建完成之后就可以得到自己的APP_ID、API_KEY以及SECRET_KEY,如下圖所示:
接下來通過一個函數來實現對指定的股票進行情感分析并保存到本地:
# 對指定的股票進行情感分析并保存到本地
def analyze_stocks(codes):
df = pd.DataFrame()
for code in codes:
print(code)
stock_dict = analyze(code)
df = df.append(stock_dict, ignore_index=True)
df.to_csv('./stocks.csv')
其中的analyze()函數實現如下,其中需要將前面申請的APP_ID、API_KEY以及SECRET_KEY進行定義。之后讀取包含每個股票的所有新聞的文件,其中每一行表示一個新聞標題。然后通過aipNLP對每個標題進行情感分析,進而基于得到的分析結果來統計積極新聞和消極新聞的個數,最后將針對每支股票的分析結果返回:
# 對指定股票的所有新聞數據進行情感分析并進行統計
def analyze(code):
APP_ID = 'your app id'
API_KEY = 'your api key'
SECRET_KEY='yoursecretkey'
positive_nums = 0
nagative_nums = 0
count = 0
aipNlp = AipNlp(APP_ID, API_KEY, SECRET_KEY)
lines = open(str(code) + '.txt').readlines()
for line in lines:
if not line.isspace():
line = line.strip()
try:
result = aipNlp.sentimentClassify(line)
positive_prob = result['items'][0]['positive_prob']
nagative_prob = result['items'][0]['negative_prob']
count += 1
if positive_prob >= nagative_prob:
positive_nums += 1
else:
nagative_nums += 1
except:
pass
avg_positive = positive_nums / count
avg_nagative = nagative_nums / count
print('股票代碼:',code, '消極比例:', avg_nagative, '積極比例:',avg_positive)
return {'股票代碼':code, '消極比例':avg_nagative, '積極比例':avg_positive}
調用下面的代碼進行分析,并生成統計結果:
codes=[600381,600284,600570,600519,600258,601179]
analyze_stocks(codes)
3、數據可視化
最后我們將得到的結果進行可視化,可以直觀地看到每支股票的消極新聞和積極新聞所占的比例。
def show():
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('./stocks.csv', index_col='股票代碼', usecols=['股票代碼', '消極比例','積極比例'])
df.plot(kind='barh', figsize=(10, 8))
plt.show()
效果圖如下所示:
3
總結
在這篇文章中,我們介紹了如何基于python搭建一個簡單的股票輿情分析系統,其中將先通過金融界網站爬取指定股票在一段時間的新聞,然后通過百度情感分析接口對新聞進行情感分析,最后統計股票的正面和反面新聞的占比,以此確定該股票是處于利好還是利空的狀態。基于此系統,大家可以進行進一步的進行擴展以應用。
完整代碼請在《人工智能量化實驗室》公眾號后臺回復“080”關鍵字。本文內容僅僅是技術探討和學習,并不構成任何投資建議。
了解更多人工智能與
量化金融知識
<-請掃碼關注
讓我知道你在看
總結
以上是生活随笔為你收集整理的【python量化】用python搭建一个股票舆情分析系统(python详细安装教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP Netweaver里的那些月亮
- 下一篇: 在SAP Cloud Platform