19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来聊聊基于A股获取新闻与社交媒体数据。
在自动化交易系统中,新闻与社交媒体数据能够提供市场情绪和事件驱动的交易信号。及时了解市场新闻和社交媒体上的舆论变化可以帮助交易者预测市场波动并做出合理的决策。以下是通过 Python 编写的代码示例,利用 A 股常用的公开 API(如东方财富和新浪财经等)获取新闻与社交媒体数据的详细开发内容。
1. 使用东方财富 API 获取新闻数据
东方财富网提供了 A 股市场相关的新闻数据,开发者可以利用这些新闻数据分析市场情绪和事件影响。以下代码示例展示了如何通过东方财富 API 获取 A 股的新闻数据。
import requests
import pandas as pd
def get_eastmoney_news(stock_code, limit=20):
"""
获取东方财富 A 股的新闻数据。
:param stock_code: 股票代码,例如 '600519' 表示贵州茅台
:param limit: 获取新闻的数量
:return: 新闻数据的 pandas DataFrame
"""
url = f"https://search-api.eastmoney.com/api/suggest/get"
params = {
"input": stock_code,
"type": "search",
"count": limit
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
news_items = data.get("data", {}).get("result", [])
news_list = [{"标题": item["title"], "链接": item["url"], "时间": item["time"]} for item in news_items]
df = pd.DataFrame(news_list)
return df
else:
raise Exception(f"Error fetching news data: {response.status_code}")
# 获取贵州茅台(600519)的最近 20 条新闻数据
news_df = get_eastmoney_news("600519")
print(news_df)
在这个示例中,通过调用东方财富的 API 获取与指定股票代码相关的新闻数据。API 返回的数据包含新闻标题、链接和发布时间,返回的结果被转换为 Pandas DataFrame 格式,便于后续的处理和分析。
2. 使用新浪财经 API 获取新闻数据
新浪财经也提供了市场新闻数据接口,可以通过 HTTP 请求获取特定股票的相关新闻。以下代码示例展示了如何通过新浪财经获取 A 股的新闻数据。
import requests
import pandas as pd
def get_sina_news(stock_code, limit=20):
"""
获取新浪财经 A 股的新闻数据。
:param stock_code: 股票代码,例如 '600519'
:param limit: 获取新闻的数量
:return: 新闻数据的 pandas DataFrame
"""
url = f"https://finance.sina.com.cn/realstock/company/{stock_code}/nc.shtml"
response = requests.get(url)
if response.status_code == 200:
data = response.text
# 解析新闻数据(由于新浪 API 的复杂性,这里假设解析 HTML 内容)
news_list = []
# 这里使用 BeautifulSoup 等库进行 HTML 解析,提取新闻标题、链接、时间等内容
# 示例代码略(需要先安装 BeautifulSoup: pip install beautifulsoup4)
df = pd.DataFrame(news_list, columns=["标题", "链接", "时间"])
return df.head(limit)
else:
raise Exception(f"Error fetching news data: {response.status_code}")
# 获取贵州茅台(600519)的最近 20 条新闻数据
# news_df_sina = get_sina_news("600519")
# print(news_df_sina)
在此示例中,通过访问新浪财经的网页,获取与特定股票相关的新闻数据。可以使用 BeautifulSoup
库对 HTML 页面进行解析,提取新闻标题、链接和发布时间等信息,这些数据可以帮助分析市场情绪和事件对价格的影响。
3. 获取社交媒体数据(微博和论坛)
社交媒体数据可以反映市场参与者的情绪和对某只股票的关注度。微博等平台上面的讨论往往能够提供重要的市场情绪信号。以下是通过 Python 获取社交媒体数据的代码示例。
import requests
import pandas as pd
def get_weibo_data(stock_keyword, limit=20):
"""
获取微博上关于某只股票的讨论数据。
:param stock_keyword: 股票关键词,例如 '茅台'
:param limit: 获取微博的数量
:return: 微博数据的 pandas DataFrame
"""
url = "https://m.weibo.cn/api/container/getIndex"
params = {
"containerid": f"100103type=1&q={stock_keyword}",
"count": limit
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
cards = data.get("data", {}).get("cards", [])
weibo_list = [{"内容": card["mblog"]["text"], "发布时间": card["mblog"]["created_at"]} for card in cards if "mblog" in card]
df = pd.DataFrame(weibo_list)
return df
else:
raise Exception(f"Error fetching weibo data: {response.status_code}")
# 获取关于茅台的微博讨论数据
weibo_df = get_weibo_data("茅台")
print(weibo_df)
在这个示例中,我们使用了微博的 API 来获取某个关键词(如“茅台”)的微博讨论数据。返回的结果被转换为 Pandas DataFrame 格式,包含微博的内容和发布时间等信息,用于后续情绪分析。
4. 数据存储与处理
新闻与社交媒体数据在采集后需要进行存储,以供后续的情感分析和策略决策支持。
-
持久化存储:新闻和社交媒体数据可以存储在关系型数据库(如 MySQL)中,方便后续查询和分析。
import mysql.connector def save_news_to_mysql(df, stock_code): """ 将新闻数据保存到 MySQL 数据库中。 :param df: 新闻数据 DataFrame :param stock_code: 股票代码 """ connection = mysql.connector.connect( host="localhost", user="root", password="password", database="stock_data" ) cursor = connection.cursor() create_table_query = f""" CREATE TABLE IF NOT EXISTS news_{stock_code} ( 标题 VARCHAR(255), 链接 TEXT, 时间 VARCHAR(50) )""" cursor.execute(create_table_query) for _, row in df.iterrows(): insert_query = f""" INSERT INTO news_{stock_code} (标题, 链接, 时间) VALUES ('{row['标题']}', '{row['链接']}', '{row['时间']}') """ cursor.execute(insert_query) connection.commit() cursor.close() connection.close() # 将新闻数据保存到 MySQL 数据库 save_news_to_mysql(news_df, "600519")