微信扫码
添加专属顾问
 
                        我要投稿
这是关于股票技术指标评价的绝佳指南,没有之一。 核心内容: 1. 使用 streamlit 可视化股票数据 2. 计算多种指标了解市场趋势 3. 利用 Llama 3 对数据做解释
 
                                import yfinance as yfimport pandas as pdimport scheduleimport timeimport ollamafrom datetime import datetime, timedelta
# Fetching historical data for Apple (AAPL) and Dow Jones (DJI) for yesterday (1-minute intervals)
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")data.head()Global variables to store rolling data for analysisrolling_window = pd.DataFrame()dow_rolling_window = pd.DataFrame()# Variables to track daily contextdaily_high = float('-inf')daily_low = float('inf')buying_momentum = 0selling_momentum = 0
这段代码定义了一些全局变量,用于存储滚动数据和跟踪每日的市场情况。
rolling_window和dow_rolling_window用于存储苹果公司和道琼斯指数的滚动数据。然后定义了几个变量来跟踪每日的市场情况。
daily_high和 daily_low分别初始化为负无穷大和正无穷大,用于记录当天的最高价和最低价。通过将它们初始化为极端值,可以确保在实际数据更新时,这些变量会被正确地设置为当天的实际最高价和最低价。
buying_momentum和selling_momentum变量初始化为0,用于跟踪当天的买入和卖出动量。这些变量可以帮助分析市场情绪和趋势,判断市场是处于买入还是卖出状态。
get_market_open_duration:Extract current time from the last element of the windowdef get_market_open_duration(window):    # Extract current time from the last element of the window    current_time = window.index[-1].time()  # Returns a datetime.time object        # Get the previous trading day's date    previous_trading_day = datetime.today() - timedelta(days=1)        # Combine the previous trading day with the current time    current_datetime = datetime.combine(previous_trading_day, current_time)        # Define the market opening time as 09:30:00 on the previous trading day    market_start_time = datetime.combine(previous_trading_day, datetime.strptime("09:30:00", "%H:%M:%S").time())        # Calculate the duration the market has been open in minutes    market_open_duration = (current_datetime - market_start_time).total_seconds() / 60  # in minutes        return market_open_durationget_natural_language_insights:generate natural language insights using Ollama(******重点这里,可以换成其他模型。)
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):prompt = f"""You are a professional stock broker. Apple's stock has a 5-minute rolling average of {rolling_avg:.2f}.The Exponential Moving Average (EMA) is {ema:.2f}, and the Relative Strength Index (RSI) is {rsi:.2f}.The Bollinger Bands are set with an upper band of {bollinger_upper:.2f} and a lower band of {bollinger_lower:.2f}.The price has changed by {price_change:.2f}, and the volume has shifted by {volume_change}.The DOW price has changed by {dow_price_change:.2f}, and the volume has shifted by {dow_volume_change}.Meanwhile, the Dow Jones index has a 5-minute rolling average of {dow_rolling_avg:.2f}.The market has been open for {market_open_duration:.2f} minutes.Today's high was {daily_high:.2f} and low was {daily_low:.2f}.The buying momentum is {buying_momentum:.2f} and selling momentum is {selling_momentum:.2f}.Based on this data, provide insights into the current stock trend and the general market sentiment.The insights should not be longer than 100 words and should not have an introduction."""response = ollama.chat(model="llama3",messages=[{"role": "user", "content": prompt}])response_text = response['message']['content'].strip()# Print the natural language insightprint("Natural Language Insight:", response_text)
calculate_insights:moving averages and trendsdef calculate_insights(window, dow_window):if len(window) >= 5:# Calculate 5-minute rolling average of the 'Close' pricesrolling_avg = window['Close'].rolling(window=5).mean().iloc[-1]# Calculate price change and volume changeprice_change = window['Close'].iloc[-1] - window['Close'].iloc[-2] if len(window) >= 2 else 0volume_change = window['Volume'].iloc[-1] - window['Volume'].iloc[-2] if len(window) >= 2 else 0# Calculate DOW price change and volume changedow_price_change = dow_window['Close'].iloc[-1] - dow_window['Close'].iloc[-2] if len(dow_window) >= 2 else 0dow_volume_change = dow_window['Volume'].iloc[-1] - dow_window['Volume'].iloc[-2] if len(dow_window) >= 2 else 0# Calculate Exponential Moving Average (EMA) and Bollinger Bands (with a 5-period window)ema = window['Close'].ewm(span=5, adjust=False).mean().iloc[-1]std = window['Close'].rolling(window=5).std().iloc[-1]bollinger_upper = rolling_avg + (2 * std)bollinger_lower = rolling_avg - (2 * std)# Calculate Relative Strength Index (RSI) if there are enough periods (14 is typical)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))# Calculate Dow Jones index rolling averagedow_rolling_avg = dow_window['Close'].rolling(window=5).mean().iloc[-1]market_open_duration = get_market_open_duration(window)# Print the calculated insightsprint(f"5-minute Rolling Average: {rolling_avg:.2f}")print(f"EMA: {ema:.2f}")print(f"RSI: {rsi:.2f}")print(f"Bollinger Upper Band: {bollinger_upper:.2f}, Lower Band: {bollinger_lower:.2f}")print(f"Price Change: {price_change:.2f}")print(f"Volume Change: {volume_change}")print(f"DOW Price Change: {dow_price_change:.2f}")print(f"DOW Volume Change: {dow_volume_change}")print(f"Dow Jones 5-minute Rolling Average: {dow_rolling_avg:.2f}")print(f"Daily High: {daily_high:.2f}, Daily Low: {daily_low:.2f}")print(f"Buying Momentum: {buying_momentum:.2f}, Selling Momentum: {selling_momentum:.2f}")print(f"Market has been open for {market_open_duration:.2f} minutes")if int(market_open_duration) % 5 == 0: # Trigger LLM every 5 minutesget_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)
process_stock_update:process a new stock update every minutedef process_stock_update():global rolling_window, data, dow_rolling_window, dow_dataglobal daily_high, daily_low, buying_momentum, selling_momentumif not data.empty and not dow_data.empty:# Simulate receiving a new data point for AAPL and Dow Jonesupdate = data.iloc[0].to_frame().Ttime_str = update.index[0].time()print(time_str) # Output: ['09:30:00']dow_update = dow_data.iloc[0].to_frame().Tdata = data.iloc[1:] # Safely remove the first row without causing index issuesdow_data = dow_data.iloc[1:]# Append the new data points to the rolling windowsrolling_window = pd.concat([rolling_window, update], ignore_index=False)dow_rolling_window = pd.concat([dow_rolling_window, dow_update], ignore_index=False)# Update daily high and lowdaily_high = max(daily_high, update['Close'].values[0])daily_low = min(daily_low, update['Close'].values[0])# Calculate momentum based on price changesif len(rolling_window) >= 2:price_change = update['Close'].values[0] - rolling_window['Close'].iloc[-2]if price_change > 0:buying_momentum += price_changeelse:selling_momentum += abs(price_change)# Limit the rolling window to 5 minutes for moving averageif len(rolling_window) > 5:rolling_window = rolling_window.iloc[1:]if len(dow_rolling_window) > 5:dow_rolling_window = dow_rolling_window.iloc[1:]# Calculate insights (moving averages, Bollinger Bands, RSI, etc.)calculate_insights(rolling_window, dow_rolling_window)
Schedule job to simulate receiving updates every minute:schedule.every(10).seconds.do(process_stock_update)# Run the scheduled jobsprint("Starting real-time simulation for AAPL stock updates...")while True:schedule.run_pending()time.sleep(1)
使用Streamlit设计一个界面:
# Streamlit UIst.title("AI Stock Advisor")logtxtbox = st.empty()logtxt = '09:30:00'logtxtbox.caption(logtxt)message = st.chat_message("assistant")message.write("Starting real-time simulation for AAPL stock updates. First update will be processed in 5 minutes...")
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-10-23
让打工人头疼的 Excel,被 AI 改造后……我居然玩上瘾了
2025-10-14
ChatBI 实体标准查询名优化实战:如何将准确率从 80% 提升到 90%
2025-09-29
大模型幻觉检测在 NL2SQL 任务的应用实践
2025-09-15
AI Agent重塑商业智能:2025技术融合路线图
2025-09-14
滴滴 ChatBl 技术实践:智能数据分析的前沿探索与应用
2025-09-12
AI重塑生产关系:IT部门不会消失,只会进化
2025-09-12
企业知识库构建最佳实践:ChatBI发展中的关键角色
2025-09-06
介绍菜鸟集团ChatBI在物流领域实践及招人
 
            2025-09-15
2025-08-19
2025-08-24
2025-08-28
2025-09-02
2025-09-03
2025-08-23
2025-09-06
2025-08-16
2025-08-14
2025-09-02
2025-08-16
2025-08-14
2025-08-06
2025-07-29
2025-05-27
2025-05-27
2025-05-12