在为一个金融科技项目制作股票数据可视化时,我产生了这样的想法:如果数据能够用简单的英语来解释自己会怎样?就这样,这个小项目开始了。利用LLM(如Llama 3)提供的洞察,这个脚本每分钟获取股票数据,分析趋势,并提供简单的解读。再也不用费劲看图表了——就像是有一个个人股票顾问实时解读市场,告诉你发生了什么。
第一步:搭建环境在我们开始写代码之前,你需要安装几个关键库,让这个项目成为可能。我们将使用Streamlit
来构建界面,使用yfinance
来获取股票行情,并使用Ollama
来生成自然语言解读。
import streamlit as st # 导入streamlit用于构建Web应用界面
import yfinance as yf # 导入yfinance用于获取金融数据
import pandas as pd # 导入pandas用于数据分析
import schedule # 导入schedule用于任务调度
import time # 导入time用于时间处理
import ollama # 导入ollama,此处假设为自定义模块,具体功能需参考文档
from datetime import datetime, timedelta # 导入datetime和timedelta用于日期和时间处理
第二步:获取股票行情用于分析
接下来,我们获取Apple(AAPL)和道琼指数(DJI)的历史股票行情。我们将使用yfinance
来获取前一天每分钟的股票数据。
# 以下代码用于获取苹果公司(AAPL)和道琼斯指数(DJI)的最新交易日每分钟的历史数据
stock = yf.Ticker("AAPL")
dow_jones = yf.Ticker("^DJI")
data = stock.history(period="1d", interval="1m")
dow_data = dow_jones.history(period="1d", interval="1m")
现阶段,我们已经有了股票数据,并将用它来做进一步分析。为了演示目的,我使用了最新的交易日数据。你可以轻松地修改这里,直接从API获取实时股票信息,来处理实时市场动态。
步骤 3:处理实时的股票行情现在,让我们通过每分钟处理一个股票数据点的方式来模拟实时更新。我们将计算诸如滚动平均值和动量等指标来理解市场趋势。
# 全局变量用于存储滚动数据
rolling_window = pd.DataFrame()
dow_rolling_window = pd.DataFrame()
daily_high = float('-inf')
daily_low = float('inf')
buying_momentum = 0
selling_momentum = 0
# 每分钟处理一次新的股票更新的函数
def process_stock_update():
global rolling_window, data, dow_rolling_window, dow_data
global daily_high, daily_low, buying_momentum, selling_momentum
if not data.empty and not dow_data.empty:
# 模拟接收AAPL和道琼斯的新数据点
update = data.iloc[0].to_frame().T
dow_update = dow_data.iloc[0].to_frame().T
data = data.iloc[1:] # 移除已处理的行
dow_data = dow_data.iloc[1:]
# 将新数据点追加到滚动窗口
rolling_window = pd.concat([rolling_window, update], ignore_index=False)
dow_rolling_window = pd.concat([dow_rolling_window, dow_update], ignore_index=False)
# 更新当天的最高和最低价格:
daily_high = max(daily_high, update['Close'].values[0])
daily_low = min(daily_low, update['Close'].values[0])
# 计算动量值:
如果滚动窗口的长度大于等于2:
price_change = update['Close'].values[0] - rolling_window['Close'].iloc[-2]
if price_change > 0:
buying_momentum += price_change
else:
selling_momentum += abs(price_change)
}
每个新数据点都会被添加到一个用于5分钟分析的滚动时间窗口中。每日的最高/最低值和价格趋势会根据连续数据点的变化进行更新。
第4步:分析股票行情为了分析实时数据,我们计算移动平均、价格波动、成交量变化和一些技术指标,如指数移动平均线(EMA)、布林带和相对强弱指标(RSI)。以下是它们的工作原理:
- 指数移动平均线 (EMA): 更侧重近期价格,以识别短期趋势。
- 相对强弱指数 (RSI): 衡量价格变动的速度,并在 0 到 100 之间波动,以识别超买或超卖状态。
- 布林带 (Bollinger Bands): 通过上、下带围绕移动平均线,帮助评估市场波动性。
def calculate_insights(window, dow_window):
if len(window) >= 5:
# 5分钟滚动平均值
rolling_avg = window['Close'].rolling(window=5).mean().iloc[-1]
# 指数平滑移动平均(EMA)
ema = window['Close'].ewm(span=5, adjust=False).mean().iloc[-1]
# 波林格带(使用5个周期窗口)
std = window['Close'].rolling(window=5).std().iloc[-1]
bollinger_upper = rolling_avg + (2 * std)
bollinger_lower = rolling_avg - (2 * std)
# 相对强弱指数(RSI)计算
delta = window['Close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=14, min_periods=1).mean().iloc[-1]
avg_loss = loss.rolling(window=14, min_periods=1).mean().iloc[-1]
rs = avg_gain / avg_loss if avg_loss != 0 else float('nan')
rsi = 100 - (100 / (1 + rs))
# 再次计算RSI
delta = window['Close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=14, min_periods=1).mean().iloc[-1]
avg_loss = loss.rolling(window=14, min_periods=1).mean().iloc[-1]
rs = avg_gain / avg_loss if avg_loss != 0 else float('nan')
rsi = 100 - (100 / (1 + rs))
# 计算道琼斯指数的滚动平均值
dow_rolling_avg = dow_window['Close'].rolling(window=5).mean().iloc[-1]
market_open_duration = get_market_open_duration(window)
if int(market_open_duration) % 5 == 0: # 每5分钟触发一次LLM事件
get_natural_language_insights(
rolling_avg, ema, rsi, bollinger_upper, bollinger_lower,
price_change, volume_change, dow_rolling_avg, market_open_duration,
dow_price_change, dow_volume_change, daily_high, daily_low,
buying_momentum, selling_momentum
)
为了让这个项目更互动,我们可以每5分钟让Llama 3模型生成自然语言摘要,从而让项目更互动。
def get_natural_language_insights(
rolling_avg, ema, rsi, bollinger_upper, bollinger_lower,
price_change, volume_change, dow_rolling_avg, market_open_duration, dow_price_change, dow_volume_change,
daily_high, daily_low, buying_momentum, selling_momentum, timestamp
):
prompt = f"""
您是一名专业的股票经纪人。苹果公司的股票5分钟滚动平均值为{rolling_avg:.2f}。
指数移动平均线(EMA)为{ema:.2f},相对强弱指标(RSI)为{rsi:.2f}。
布林带的上轨为{bollinger_upper:.2f},下轨为{bollinger_lower:.2f}。
价格变动为{price_change:.2f},成交量变动为{volume_change}。
道琼斯指数价格变动为{dow_price_change:.2f},成交量变动为{dow_volume_change}。
同时,道琼斯指数的5分钟滚动平均值为{dow_rolling_avg:.2f}。
市场已开放了{market_open_duration:.2f}分钟。
今日最高价为{daily_high:.2f},最低价为{daily_low:.2f}。
买入动量为{buying_momentum:.2f},卖出动量为{selling_momentum:.2f}。
根据这些数据,提供当前股票趋势和总体市场情绪的见解。
见解应不超过100字,且不应包含介绍。
"""
response = ollama.chat(
model="llama3",
messages=[{"role": "user", "content": prompt}]
)
response_text = response['message']['content'].strip()
print("自然语言见解:", response_text)
此功能利用过去5分钟的技术指标和趋势,用简单的英语总结股票的表现。
步骤 6:搭建 Streamlit 用户界面现在让我们用Streamlit搭建一个简单的UI,实时显示股票更新和分析。
# 下列代码用于在聊天界面中显示时间戳和响应文本。
# `message` 是一个聊天消息对象,`timestamp` 是时间戳,`response_text` 是响应文本。
message = st.chat_message("assistant")
message.write(timestamp)
message.write(response_text)
在命令行中输入 streamlit run app.py
来运行应用程序。
就这样,你就可以打造你自己的实时的股票投资顾问了!
改进和未来的增强措施这是一个专注于最近一个交易日趋势的原型项目。可以通过增加历史数据、新闻整合或高级模型,如时间序列神经网络,来改进它。这里有一些改进的建议。
- 历史数据整合:目前,该应用仅处理前一天的交易数据。你可以通过整合数周或数月的滚动历史数据来增强功能。
- 新闻整合:股票走势经常受到新闻事件的影响。添加实时新闻源可以提供更好的背景支持。
- 高级时间序列预测:你可以通过整合时间序列分析的神经网络进一步提高预测准确性,从而获得更深入的洞察。
- 自定义警报:实现基于重要股票变动或如RSI等指标的自定义警报,从而让这个应用更适合日内交易者使用。
完整的源代码和Jupyter笔记本可以在GitHub仓库上找到。如果您有任何关于优化提示语或改进的想法,欢迎随时联系交流。
感谢你加入我们的社区!在你离开前:
- 👏 给这个故事鼓掌并关注作者 👉
- 📰 在 InsiderFinance Wire 查看更多内容
- 📚 参加我们的 免费大师课
- 📈 了解强大的交易工具
共同学习,写下你的评论
评论加载中...
作者其他优质文章