AI Stock 助手应用程序
本文将介绍一个使用 Streamlit 构建的 AI 股票助手应用程序。该应用程序能够实时更新股票数据,并提供市场分析和见解。以下是代码的详细说明和注释。
代码结构
1. 导入必要的库
import streamlit as st
import pandas as pd
import schedule
import time
import ollama
from datetime import datetime, timedelta
- streamlit: 用于构建Web应用程序的库。
- pandas: 用于数据处理和分析的库。
- schedule: 用于定时任务调度的库。
- time: 提供时间相关的功能。
- ollama: 用于生成自然语言响应的模型。
- datetime: 用于处理日期和时间的模块。
2. 设置Streamlit用户界面
# Streamlit UI
st.title("AI Stock 助手")
logtxtbox = st.empty()
- 使用
st.title()
设置应用程序的标题。 logtxtbox
是一个空的占位符,用于后续显示当前时间。
3. 读取和处理股票数据
# 读取 stock.cxv 文件
file_path = './stock.csv' # 请替换为您的文件路径
data = pd.read_csv(file_path)
# 将数据转换为适合处理的格式
data['Date'] = pd.to_datetime(data['Date']) # 确保日期列为 datetime 类型
data.set_index('Date', inplace=True) # 将日期设置为索引
- 从 CSV 文件中读取股票数据,并将日期列转换为
datetime
类型。 - 将日期设置为数据框的索引,以便后续分析。
4. 读取道琼斯数据
# 读取 Dow 数据文件
dow_file_path = './stock.csv' # 请替换为您的 Dow 数据文件路径
dow_data = pd.read_csv(dow_file_path)
# 将 Dow 数据转换为适合处理的格式
dow_data['Date'] = pd.to_datetime(dow_data['Date']) # 确保日期列为 datetime 类型
dow_data.set_index('Date', inplace=True) # 将日期设置为索引
- 同样读取道琼斯指数的数据,并进行相同的格式转换。
5. 初始化变量
# 使用读取的数据替换 yf.Ticker
rolling_window = data[['Close']].copy() # 复制收盘价数据
# 计算每日的高低价
daily_high = rolling_window['Close'].max()
daily_low = rolling_window['Close'].min()
# Global variables to store rolling data for analysis
rolling_window = pd.DataFrame()
dow_rolling_window = pd.DataFrame()
# Variables to track daily context
daily_high = float('-inf')
daily_low = float('inf')
buying_momentum = 0
selling_momentum = 0
- 初始化用于存储滚动数据的变量,并计算每日的最高价和最低价。
6. 定义处理股票更新的函数
# Function to process a new stock update every minute
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:
# Simulate receiving a new data point for AAPL and Dow Jones
update = data.iloc[0].to_frame().T
# 获取当前时间并格式化
current_time = datetime.now().strftime("%H:%M:%S")
logtxtbox.caption(current_time) # 更新显示的时间
dow_update = dow_data.iloc[0].to_frame().T
data = data.iloc[1:] # Safely remove the first row without causing index issues