技术分析遇上deepseek:我的Ai选股助手开发之旅

松鼠Quant
2025-03-11

图片
量化策略开发,高质量社群,交易思路分享等相关内容

参数可视化工具:点击进入

让Ai帮你编写策略:点击进入
订单流图表:点击进入
加入2025俱乐部:点击了解

Ai投研助手课程:点击了解

『正文』

ˇ

"市场永远不会告诉你它要去哪里,它只会留下痕迹让你去解读"

从一个交易者的困惑说起

周五收盘后,我又一次盯着满屏的K线图发呆。作为一个兼职交易者,每周末我都要花数小时筛选下周可能的交易机会。几百只股票,十几种技术指标,这是一场视觉和注意力的马拉松。

"要是有人能帮我先筛选一遍就好了..."

等等,为什么不让AI来做这件事呢?它不会疲劳,不会情绪化,而且可以同时处理大量数据。于是,我的AI选股助手项目就这样诞生了。

构建我的AI选股助手

第一块拼图:数据获取与处理

首先,我需要获取股票数据并计算各种技术指标。我使用了akshare库来获取A股数据,然后用pandas和talib处理:

































































import akshare as akimport pandas as pdimport talib as taimport numpy as npfrom tqdm import tqdm
classStockDataProcessor:def__init__(self):        self.stock_list = self._get_stock_universe()
def_get_stock_universe(self):"""获取沪深300成分股列表"""try:            hs300 = ak.index_stock_cons_weight_csindex(symbol="000300")return hs300['成分券代码'].tolist()except Exception as e:            print(f"获取沪深300成分股失败: {e}")return []
defprocess_stock(self, stock_code):"""处理单只股票数据"""# 获取日线数据        df = self._get_daily_data(stock_code)if df isNoneor len(df) < 30:returnNone
# 计算技术指标        df = self._calculate_indicators(df)
return df
def_calculate_indicators(self, df):"""计算常用技术指标"""# 移动平均线        df['MA5'] = ta.SMA(df['收盘'].values, timeperiod=5)        df['MA10'] = ta.SMA(df['收盘'].values, timeperiod=10)        df['MA20'] = ta.SMA(df['收盘'].values, timeperiod=20)        df['MA60'] = ta.SMA(df['收盘'].values, timeperiod=60)
# MACD        df['MACD'], df['Signal'], df['Hist'] = ta.MACD(            df['收盘'].values,             fastperiod=12,             slowperiod=26,             signalperiod=9        )
# RSI        df['RSI'] = ta.RSI(df['收盘'].values, timeperiod=14)
# 布林带        df['Upper'], df['Middle'], df['Lower'] = ta.BBANDS(            df['收盘'].values,            timeperiod=20,            nbdevup=2,            nbdevdn=2        )
# 成交量指标        df['Volume_MA5'] = ta.SMA(df['成交量'].values, timeperiod=5)        df['Volume_MA20'] = ta.SMA(df['成交量'].values, timeperiod=20)
return df


这段代码看起来简单,但实际运行时遇到了不少挑战:
  1. 数据缺失问题:有时API会返回不完整数据

  2. 请求限制:频繁请求会被限流

  3. 计算效率:处理300只股票×数十个指标需要优化

解决方案?我加入了重试机制、进度条和并行处理:











defprocess_all_stocks(self):"""处理所有股票数据并显示进度"""    results = {}
for stock in tqdm(self.stock_list, desc="处理股票数据"):        df = self.process_stock(stock)if df isnotNone:            results[stock] = dfreturn results

第二块拼图:AI分析引擎

有了数据,下一步是让AI来分析。我使用了deepseek的API(也可以替换为其他模型):






























import osfrom openai import OpenAI
classAIStockAnalyzer:def__init__(self, data_processor):        self.data_processor = data_processor        self.client = OpenAI(api_key=os.environ.get("deepseek_API_KEY"))
defanalyze_stocks(self, strategy="trend_following"):"""使用指定策略分析股票"""# 获取处理后的股票数据        stock_data = self.data_processor.process_all_stocks()
# 提取最近的技术指标状态        recent_indicators = self._extract_recent_indicators(stock_data)
# 根据策略构建提示词        prompt = self._build_strategy_prompt(strategy, recent_indicators)
# 调用AI模型进行分析        response = self.client.chat.completions.create(            model="deepseek-reasoner",            messages=[                {"role": "system", "content": "你是一位专业的股票技术分析师,擅长解读各种技术指标并提供投资建议。"},                {"role": "user", "content": prompt}            ],            temperature=0.6#这是温度,温度越高输出越有创意,建议调低。        )
return response.choices[0].message.content

我为不同的交易策略设计了不同的提示词模板。比如,这是趋势跟踪策略的提示词




























def_build_trend_following_prompt(self, indicators_data):    prompt = f"""    请基于以下股票的技术指标数据,从趋势跟踪策略角度进行分析,并推荐5-8只最具潜力的股票。
    趋势跟踪策略关注点:    1. 均线系统是否形成多头排列(MA5 > MA10 > MA20)    2. MACD是否形成金叉且位于零轴上方    3. 股价是否站稳MA10均线并且有上升趋势    4. RSI是否突破50中枢线且向上发散    5. 成交量是否配合价格走势(上涨时量能温和放大)
    技术指标数据:    {indicators_data}
    请提供:    1. 市场整体技术面分析(基于沪深300成分股的技术指标统计)    2. 5只推荐股票,每只包含:       - 股票代码和名称       - 核心技术指标状态描述       - 推荐理由       - 可能的风险点       - 建议关注的价格区间    3. 操作建议(适合短线还是中线,适合激进还是稳健投资者)
    请像一位经验丰富的分析师一样,用通俗易懂的语言解读技术指标背后的含义,而不是简单罗列数据。    """return prompt

实战效果:AI的"火眼金睛"

让我们看看系统的实际输出。这是上周五(2025年3月9日)收盘后运行的结果:
图片
图片
  • 分析结果已保存至: 股票分析_趋势跟踪_20250309_123240.txt

  • =====deepseek-reasoner 股票分析结果 =====

  • 1. 市场整体分析:

  • 当前沪深300成分股呈现分化格局,金融与周期板块呈现技术修复迹象。从技术指标观察,约30%股票形成均线多头排列,但成交量能级差异显著。银行、基建板块出现MACD底背离特征,新能源板块部分个股呈现超跌反弹动能。整体市场仍处于震荡筑底 阶段,趋势性机会集中在率先完成均线修复的成长股。

  • 2. 趋势跟踪策略分析:

  • 本策略通过五维技术共振筛选趋势启动个股:均线系统确认趋势方向,MACD捕捉动量转换,布林带定位突破强度,RSI过滤超买风险,成交量验证资金共识。重点捕捉均线刚完成多头排列、MACD首次翻红、价格突破中轨压制、RSI脱离弱势区间的量价齐 升品种。

  • 3. 推荐股票列表:

  • - **6000** ****:

  •   - 均线系统呈标准多头排列(MA5>MA10>MA20=19.37>18.66>17.95),股价站稳所有均线

  •   - MACD(0.8/0.59)金叉后持续扩张,柱状图维持正值

  •   - 股价(19.86)突破布林上轨(19.84),中轨(17.95)明确上行

  •   - 成交量MA5(13367万)较MA10(11033万)放大21%,量能配合突破

  •   - 需注意RSI(86.76)严重超买,短期或有回调压力

  • - **600********:

  •   - 均线多头排列(42.65>42.15>41.87),股价突破近三月高点

  •   - MACD(0.7/0.61)在零轴上二次金叉,中期趋势强化

  •   - 布林带开口扩张,股价连续三日站上上轨(43.28)

  •   - RSI(68.32)维持强势区,成交量MA5(5194万)需补量确认突破

  • - **6000******:

  •   - 均线陡峭多头(7.35>7.12>6.95),股价沿MA5强势上行

  •   - MACD(0.16/0.09)水下金叉后穿越零轴,趋势反转确立

  •   - 股价(7.5)突破布林上轨(7.49),中轨(6.95)拐头向上

  •   - 成交量MA5(10647万)接近均量,RSI(81.9)需警惕过热风险

  • - ****0039 ****桥**:

  •   - 均线系统(7.38>7.31>7.16)形成黄金三角,股价站稳MA5

  •   - MACD(0.07/0.04)柱状图连续5日增长,多头动能积累

  •   - 股价(7.42)突破中轨(7.16)后回踩确认,布林带收窄待突破

  •   - RSI(65.35)站稳50中枢,量能MA5(2697万)需持续放大

  • - *****048 **发展**:

  •   - 均线多头(8.76>8.66>8.53)支撑股价突破箱体

  •   - MACD(0.04/-0.03)零轴上二次金叉,柱状图转正

  •   - 股价(8.8)突破中轨(8.53)后量价背离,需补量确认

  •   - RSI(59.88)突破半年压力线,中期趋势转强

  • 4. 风险提示:

  • - 短期超买个股存在技术修正风险(如**重工RSI>80)

  • - 量价背离个股可能面临假突破风险(如保利发展)

  • - 金融股受政策面影响较大,需关注LPR等宏观变量

  • - 大宗商品价格波动可能影响周期股利润预期

  • - 趋势策略需严格止损,建议设置MA10作为移动止盈位

每日定时发送到邮箱














































defsend_email(self, subject: str, body: str, attachment_path: Optional[str] = None) -> bool:"""    发送邮件    Args:        subject (str): 邮件主题        body (str): 邮件正文        attachment_path (Optional[str]): 附件路径    Returns:        bool: 是否发送成功    """ifnot all([self.smtp_server, self.sender_email, self.sender_password, self.receiver_email]):        logger.error("邮件配置不完整,无法发送邮件")returnFalsetry:# 创建邮件        message = MIMEMultipart()        message["From"] = self.sender_email        message["To"] = self.receiver_email        message["Subject"] = subject# 添加正文        message.attach(MIMEText(body, "plain"))# 添加附件if attachment_path and os.path.exists(attachment_path):with open(attachment_path, "rb") as file:                part = MIMEApplication(file.read(), Name=os.path.basename(attachment_path))                part['Content-Disposition'] = f'attachment; filename="{os.path.basename(attachment_path)}"'                message.attach(part)# 发送邮件with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:            server.starttls()   # 加密连接            server.login(self.sender_email, self.sender_password)            server.sendmail(self.sender_email, self.receiver_email, message.as_string())        logger.info(f"邮件已成功发送至 {self.receiver_email}")returnTrueexcept Exception as e:        logger.error(f"发送邮件时出错: {e},如果是(-1, b'\x00\x00\x00')可以正常收到邮件")returnFalse

图片

代码是死的,人是活的

开发过程中,我逐渐意识到一个重要问题:技术指标本身没有魔力,关键在于解读。
同样的MACD金叉,在不同的市场环境、不同的股票上,意义可能完全不同。这就是为什么我没有简单地用硬编码规则(如"MACD金叉就买入"),而是让AI来综合分析多种指标。

我在代码中加入了一个"市场情绪评估"模块:






































defassess_market_sentiment(self, stock_data):"""评估整体市场情绪"""# 计算技术指标的统计数据    stats = {'bullish_ma': 0,   # 多头排列的股票数'macd_golden_cross': 0,   # MACD金叉的股票数'rsi_above_50': 0,   # RSI>50的股票数'price_above_ma20': 0,   # 价格>MA20的股票数'total_stocks': len(stock_data)    }
for code, df in stock_data.items():        latest = df.iloc[-1]        prev = df.iloc[-2]
# 检查均线多头排列if latest['MA5'] > latest['MA10'] > latest['MA20']:            stats['bullish_ma'] += 1
# 检查MACD金叉if prev['MACD'] < prev['Signal'] and latest['MACD'] > latest['Signal']:            stats['macd_golden_cross'] += 1
# 检查RSIif latest['RSI'] > 50:            stats['rsi_above_50'] += 1
# 检查价格与MA20关系if latest['收盘'] > latest['MA20']:            stats['price_above_ma20'] += 1
# 计算百分比for key in stats:if key != 'total_stocks':            stats[key + '_pct'] = stats[key] / stats['total_stocks'] * 100
return stats

实战应用:从筛选到决策

它确实帮我节省了大量时间。但我也发现,它最大的价值不是直接告诉我"买什么",而是:
  1. 缩小关注范围:从几百只股票中筛选出10-15只值得深入研究的标的

  2. 提供多角度分析:同时从多种策略视角解读技术形态

  3. 避免情绪干扰:AI不会因为恐惧或贪婪而扭曲判断

思考与经验

开发这个系统的过程中,我学到了很多:

  1. AI不是万能的:它可能会过度解读某些技术形态,或者忽略市场情绪等无形因素

  2. 提示词工程至关重要:同样的数据,不同的提示词会导致截然不同的分析结果

  3. 基本面不可忽视:纯技术分析有其局限性,未来计划加入基本面数据

  4. 回测很重要:正在开发回测模块,验证不同技术指标组合的历史表现

工具再好,也只是工具。最终的投资决策仍然需要人来做,AI只是帮我们看得更清楚、更全面。

结语:人机协作的投资之道
技术分析一直以来都处于科学与艺术的交界处。同样的K线图,不同的分析师可能给出完全不同的解读。AI的加入并不是要取代人的判断,而是帮助我们从海量数据中提取有价值的信号,让我们能够更客观、更全面地看待市场。
正如查理·芒格所说:"投资不是一门物理学或工程学,而是一门心理学。"技术指标只是工具,真正的投资智慧在于理解市场背后的人性。
希望这个项目能给同样热爱技术分析的朋友们带来一些启发!


完整代码+视频讲解

图片

图片
免责声明
  • 本文仅供学习交流,不构成投资建议

  • 投资有风险,入市需谨慎

  • 文中股票案例仅作说明用途,不代表推荐


分享