为了账号安全,请及时绑定邮箱和手机立即绑定

基于Ollama和Streamlit的实时AI股票分析助手

此项目基于大型语言模型的洞察力,每分钟抓取股票数据,分析市场趋势,并提供实时且易于理解的市场解释。

在为一个金融科技项目制作股票数据可视化时,我产生了这样的想法:如果数据能够用简单的英语来解释自己会怎样?就这样,这个小项目开始了。利用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)。以下是它们的工作原理:

    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  
                )

第五步:利用 Ollama 获取自然语言洞察力

为了让这个项目更互动,我们可以每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 来运行应用程序。

就这样,你就可以打造你自己的实时的股票投资顾问了!

改进和未来的增强措施

这是一个专注于最近一个交易日趋势的原型项目。可以通过增加历史数据、新闻整合或高级模型,如时间序列神经网络,来改进它。这里有一些改进的建议。

  1. 历史数据整合:目前,该应用仅处理前一天的交易数据。你可以通过整合数周或数月的滚动历史数据来增强功能。
  2. 新闻整合:股票走势经常受到新闻事件的影响。添加实时新闻源可以提供更好的背景支持。
  3. 高级时间序列预测:你可以通过整合时间序列分析的神经网络进一步提高预测准确性,从而获得更深入的洞察。
  4. 自定义警报:实现基于重要股票变动或如RSI等指标的自定义警报,从而让这个应用更适合日内交易者使用。

完整的源代码和Jupyter笔记本可以在GitHub仓库上找到。如果您有任何关于优化提示语或改进的想法,欢迎随时联系交流。

InsiderFinance 给大家带来了一条消息

感谢你加入我们的社区!在你离开前:

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消