微信扫码
添加专属顾问
这是关于股票技术指标评价的绝佳指南,没有之一。 核心内容: 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+中大型企业
2026-06-03
2026-05-13
2026-05-26
2026-04-14
2026-04-20
2026-04-16
2026-05-21
2026-06-10
2026-04-27
2026-06-02
2026-07-08
2026-07-07
2026-07-07
2026-07-02
2026-06-29
2026-06-18
2026-06-11
2026-06-05
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。