
完整指南:如何免费构建一个ai驱动的股票分析器,助你掌握市场动态!!
是否曾因股票市场数据的庞大而感到不知所措?
希望有一个私人助手来筛选噪音,并为您提供清晰、可操作的见解?好吧,您可以自己构建一个,得益于Python的强大、现成的API和一点AI,这其实非常简单(而且是免费的!)。
重要免责声明:
本项目仅用于教育和信息用途。它旨在演示如何集成各种API和AI模型。股票市场是_固有复杂且风险较高_的。请勿将本应用生成的“买入”或“卖出”信号用于实际交易决策。 在做出任何投资决策之前,深入了解金融市场、风险管理和独立研究是必不可少的。
本项目可以作为那些有兴趣探索AI与金融交集的人的基础,但它_并不是_专业财务建议的替代品。
在本教程中,我们将创建一个简单而有效的股票分析器,它可以:
- 获取历史股票数据: 使用免费的 Alpha Vantage API。
- 可视化数据: 使用 Matplotlib 创建交互式图表。
- 提供 AI 驱动的分析: 利用谷歌的 Gemini Flash 模型获取洞察。
- 在用户友好的网络应用中展示一切: 使用 Streamlit 构建。
这个项目非常适合想要学习 API 集成、数据可视化和 AI 实际应用的初学者。无需具备金融或 AI 的先前经验!
步骤 1:收集您的工具(和 API 密钥)
在我们深入代码之前,确保您拥有必要的工具:
Python: 确保您安装了 Python 3.7 或更高版本。
库: 我们将使用以下 Python 库。您可以使用 pip
安装它们:
pip install pandas matplotlib requests pytz google-generativeai streamlit
Streamlit: 使用命令 pip install streamlit
进行安装。
API 密钥: 这是“免费”魔法发生的地方!
- Alpha Vantage: 前往 https://www.alphavantage.co/ 注册一个免费的 API 密钥。这个密钥允许我们访问他们的股票数据。请妥善保管此密钥,保持私密!
- 谷歌 AI Studio API 密钥: 访问 Google AI Studio。点击“获取 API 密钥”。这将允许您使用 Gemini Flash 模型。请同样保密此密钥!
重要提示: 免费 API 密钥通常有使用限制(例如,每分钟或每天的请求数量)。请注意这些限制,以避免中断。Alpha Vantage 的免费套餐通常足以满足个人项目的需求。
让我们开始编码吧!
步骤 2:获取股票数据 (stock_utility_handler.py)
让我们开始创建一个名为 stock_utility_handler.py
的文件。这个文件将处理获取和处理股票数据的任务。
import pandas as pd
import json
from datetime import datetime
import pytz
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.widgets as widgets
import requests
class StockAPI:
def __init__(self, api_key):
self.api_key = api_key
def get_stock_info(self, stock, market):
if market == 'NASDAQ':
url = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={stock}&outputsize=compact&apikey={self.api_key}'
else:
url = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={stock}.{market}&outputsize=compact&apikey={self.api_key}'
r = requests.get(url)
data = r.json()
return data
class StockAnalyzer:
def __init__(self):
pass
def json_to_dataframe(self, json_data, stock_symbol, market):
print(json_data)
time_series_data = json_data['Time Series (Daily)']
df_data = []
for date_str, values in time_series_data.items():
data_row = {'date': date_str}
for key, value in values.items():
new_key = key.split('. ')[1]
data_row[new_key] = float(value)
df_data.append(data_row)
df = pd.DataFrame(df_data)
df['date'] = pd.to_datetime(df['date'])
eastern = pytz.timezone('US/Eastern')
ist = pytz.timezone('Asia/Kolkata')
df['date'] = df['date'].dt.tz_localize(eastern).dt.tz_convert(ist)
df['date'] = df['date'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['stock'] = stock_symbol
df['market'] = market
df = df.set_index('date')
return df
def plot_stock_data(self, df, stock_symbol, market, image_path):
plt.figure(figsize=(16, 10))
plt.subplot(3, 1, 1)
plt.plot(pd.to_datetime(df.index), df['close'], label=f'{stock_symbol} 收盘价 ({market})', color='blue')
plt.title(f'{stock_symbol} 股票表现 ({market})')
plt.xlabel('日期 (IST)')
plt.ylabel('价格')
plt.legend()
plt.grid(True)
plt.subplot(3, 1, 2)
plt.bar(pd.to_datetime(df.index), df['volume'], label=f'{stock_symbol} 成交量 ({market})', color='green', width=2)
plt.xlabel('日期 (IST)')
plt.ylabel('成交量')
plt.legend()
plt.grid(True)
plt.subplot(3, 1, 3)
df['MA_7'] = df['close'].rolling(window=7).mean()
df['MA_20'] = df['close'].rolling(window=20).mean()
plt.plot(pd.to_datetime(df.index), df['close'], label=f'{stock_symbol} 收盘价 ({market})', color='blue', alpha=0.7)
plt.plot(pd.to_datetime(df.index), df['MA_7'], label='7日移动平均', color='orange')
plt.plot(pd.to_datetime(df.index), df['MA_20'], label='20日移动平均', color='red')
plt.xlabel('日期 (IST)')
plt.ylabel('价格')
plt.legend()
plt.grid(True)
for ax in plt.gcf().axes:
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=[0]))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gcf().autofmt_xdate()
cursor = widgets.Cursor(plt.gca(), color='red', linewidth=1)
plt.tight_layout()
plt.savefig(image_path)
plt.show()
代码说明
**get_stock_info()**
:此函数根据股票代码和市场构造 API 请求 URL。它处理 BSE 和 NASDAQ 市场。它使用 requests
库进行 API 调用,并返回 JSON 响应。
**json_to_dataframe()**
:此函数将来自 Alpha Vantage 的原始 JSON 数据转换为 Pandas DataFrame。这对于数据分析和可视化至关重要。它处理:
- 提取“时间序列(每日)”数据。
- 清理键(去除“1. ”前缀)。
- 将日期字符串转换为 datetime 对象。
- 将日期从美国/东部时间转换为印度标准时间(IST),并格式化日期。
- 将“日期”列设置为索引。
**plot_stock_data()**
:此函数生成一个包含三个子图的综合图:
- 收盘价: 显示股票的每日收盘价。
- 成交量: 以柱状图显示交易量。
- 移动平均: 计算并绘制 7 日和 20 日移动平均,这是常见的技术指标。
并将图形保存到指定的 image_path
。
步骤 3:添加 AI 见解 (ai_insights_handler.py)
现在,让我们创建 ai_insights_handler.py
来集成 Gemini Flash 模型进行 AI 驱动的分析。
import google.generativeai as genai
import PIL.Image
class AIInsights:
def __init__(self, api_key):
self.api_key = api_key
genai.configure(api_key=self.api_key)
self.model = genai.GenerativeModel(model_name="gemini-2.0-flash")
def get_ai_insights(self, image_path, stock, market):
image = PIL.Image.open(image_path)
prompt = f"这是股票:'{stock}' 在市场:'{market}' 最近 100 天的股票表现图,基于成交量、收盘价和 7、20 日移动平均,提供一些关于该股票的分析和建议。该股票是否应该购买。"
response = self.model.generate_content([prompt, image])
return response
代码说明
**get_ai_insights()**
:
- 使用
PIL.Image.open()
打开保存的图像。 - 为 Gemini 模型构建提示。提示清晰地描述了图像和所需的分析(基于成交量、收盘价和移动平均的买/卖建议)。
- 调用
model.generate_content()
,传入提示和图像。这是多模态交互的核心。 - 返回模型的响应。
步骤 4:构建 Streamlit 网络应用 (marketapp.py)
收集在初始步骤中为 Google AI Studio 和 Alpha Vantage API 生成的 API 密钥。
最后,让我们创建 marketapp.py
来构建一个用户友好的界面,使用 Streamlit。
from stock_utility_handler import StockAPI, StockAnalyzer
from ai_insights_handler import AIInsights
import streamlit as st
if 'page' not in st.session_state:
st.session_state.page = "page1"
st.session_state.ticker = "RELIANCE"
st.session_state.market = "BSE"
st.session_state.image_path = ""
st.session_state.ai_insights = ""
st.session_state.internal_results_available = False
def page1():
st.title('股票 AI 代理')
col1, col2 = st.columns(2)
with col1:
st.session_state.ticker = st.text_input("输入股票代码", value=st.session_state.ticker, key="ticker_input")
with col2:
st.session_state.market = st.selectbox("选择市场", ["BSE", "NASDAQ"], index=["BSE", "NASDAQ"].index(st.session_state.market), key="market_input")
st.sidebar.header("关于")
st.sidebar.write("这是一个股票分析平台。")
st.markdown("---")
if st.button('提交'):
st.session_state.page = "page2"
st.session_state.internal_results_available = False
st.rerun()
def page2():
st.title(f"{st.session_state.ticker} ({st.session_state.market}) 的分析")
stock = st.session_state.ticker
market = st.session_state.market
if not st.session_state.internal_results_available:
with st.spinner('分析中... 请稍候...'):
image_path = f"<your_image_path>/{market}_{stock}.png"
st.session_state.image_path = image_path
stock_api_obj = StockAPI("<your-alpha-vantage-api-key>")
market_data = stock_api_obj.get_stock_info(stock, market)
stock_analyzer_obj = StockAnalyzer()
df = stock_analyzer_obj.json_to
## 最后
使用 streamlit run 运行 marketapp.py
```bash
streamlit run marketapp.py
以下是用户界面的几个截图
输入股票代码并选择市场。(这里我选择了 HDFCBANK 作为示例)
您应该会看到一个显示 API 调用和数据分析进展的屏幕。
以下是图表和 AI 见解的结果。