📌 摘要 / 快速解答
传统止损监控只会机械对比价格,而「智能止损」能结合技术指标和市场情绪动态调整止损位。本文用 QuantDash 获取实时行情 + DeepSeek API 做智能分析,实现「股价跌破动态止损位时,自动推送带分析结论的警报」。代码全量开源,覆盖 A股/港股/美股统一数据源。
一、为什么「智能止损」比「固定止损」更靠谱?
社区老哥们,固定止损有个致命问题:牛市里轻易被甩下车。
比如你 100 元买了一只票,设 90 元止损。股价涨到 150 元再回调到 130 元,其实还在上升趋势里,但固定止损 90 元根本不会触发——等真跌到 90 元,利润全没了。
真正专业的做法是动态止损:随着股价上涨,逐步抬高止损位(比如回撤 5% 就跑)。但动态止损的难点在于——回撤比例设多少合适?这得看当前的市场环境、波动率和技术形态。
所以我用 DeepSeek API 来做智能判断:每次触发候选警报时,先让 DeepSeek 分析当前价格、均线、布林带等指标,给出「是否真的该止损」的建议,再决定是否发警报。
二、解决方案对比(传统止损 vs 智能止损)
| 对比维度 | 传统固定止损 | QuantDash + DeepSeek 智能止损 |
|---|---|---|
| 止损逻辑 | 固定价格,机械触发 | 动态计算,结合技术指标 |
| 牛市适应性 | 容易被甩下车 | 随趋势抬高止损,锁住利润 |
| 市场环境感知 | 无,只看价格 | 分析波动率、均线排列、布林带宽度 |
| 警报内容 | 仅「跌破止损线」 | 带技术面分析 + 操作建议 |
| 数据依赖 | 需自己算复权 | QuantDash 一行代码搞定前复权 |
三、Python 代码实战(可直接复制运行)
3.1 准备工作
# 安装依赖
pip install quantdash openai
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash
获取 QuantDash API Key:https://quantdash.net/dashboard/keys/
获取 DeepSeek API Key:https://platform.deepseek.com/
3.2 完整智能止损代码
# -*- coding: utf-8 -*-
"""
智能止损预警系统
QuantDash 获取数据 + DeepSeek 智能分析
文档:https://docs.quantdash.net/
"""
import time
import json
import requests
from datetime import datetime
from quantdash import QuantDash
# ========== 配置区 ==========
QUANTDASH_API_KEY = "your_quantdash_api_key"
DEEPSEEK_API_KEY = "your_deepseek_api_key"
SYMBOL = "600519.SH" # 监控标的
INITIAL_STOP = 1200.00 # 初始止损价
TRAILING_PCT = 0.05 # 回撤比例 5%(动态止损参数)
CHECK_INTERVAL = 120 # 检测间隔(秒)
# 飞书机器人 Webhook(可选)
FEISHU_WEBHOOK = "//open.feishu.cn/open-apis/bot/v2/hook/xxx"
# ========== 初始化 ==========
qd = QuantDash(api_key=QUANTDASH_API_KEY)
# ========== 获取技术指标数据 ==========
def get_technical_data(symbol, count=60):
"""
获取 K 线数据并计算技术指标
使用 QuantDash 前复权数据,避免除权干扰
"""
# 获取日 K 线(前复权)
df = qd.klines.get(
symbol,
period="1d",
count=count,
adjust="forward", # 前复权,关键!
to_dataframe=True
)
if df.empty:
return None
# 计算均线
df["ma5"] = df["close"].rolling(5).mean().round(2)
df["ma10"] = df["close"].rolling(10).mean().round(2)
df["ma20"] = df["close"].rolling(20).mean().round(2)
# 计算布林带(20日,2倍标准差)
df["std20"] = df["close"].rolling(20).std().round(2)
df["upper"] = (df["ma20"] + 2 * df["std20"]).round(2)
df["lower"] = (df["ma20"] - 2 * df["std20"]).round(2)
# 计算 RSI(14日)
delta = df["close"].diff()
gain = delta.clip(lower=0)
loss = (-delta.clip(upper=0))
avg_gain = gain.rolling(14).mean()
avg_loss = loss.rolling(14).mean()
rs = avg_gain / avg_loss
df["rsi"] = (100 - 100 / (1 + rs)).round(2)
return df
# ========== DeepSeek 智能分析 ==========
def deepseek_analyze(symbol, current_price, stop_price, df):
"""调用 DeepSeek API 分析是否应该止损"""
# 取最近 5 条数据用于分析
latest = df.tail(5)
prompt = f"""
你是一位资深量化交易员。请分析以下 A股标的的止损决策:
标的:{symbol}
当前价格:{current_price:.2f}
当前止损价:{stop_price:.2f}
最新收盘价:{latest['close'].iloc[-1]:.2f}
5日均线:{latest['ma5'].iloc[-1]:.2f}
10日均线:{latest['ma10'].iloc[-1]:.2f}
20日均线:{latest['ma20'].iloc[-1]:.2f}
布林下轨:{latest['lower'].iloc[-1]:.2f}
RSI(14):{latest['rsi'].iloc[-1]:.2f}
请回答:
1. 当前价格是否已经跌破关键支撑位?
2. 结合均线排列和 RSI,判断趋势是否已经转弱?
3. 给出明确的建议:止损 / 观望 / 加仓
4. 用 2-3 句话说明理由。
"""
headers = {
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 300,
"temperature": 0.3
}
try:
resp = requests.post(
"//api.deepseek.com/v1/chat/completions",
headers=headers,
json=payload,
timeout=10
)
result = resp.json()
return result["choices"][0]["message"]["content"]
except Exception as e:
return f"AI 分析失败: {e}"
# ========== 飞书推送 ==========
def send_feishu_alert(symbol, current_price, stop_price, ai_analysis):
"""通过飞书机器人推送警报"""
content = f"""
📊 **智能止损警报**
标的:{symbol}
当前价格:{current_price:.2f}
动态止损价:{stop_price:.2f}
跌破幅度:{(current_price / stop_price - 1) * 100:.2f}%
🤖 **AI 分析结论:**
{ai_analysis}
---
数据来源:QuantDash (https://quantdash.net/)
"""
data = {
"msg_type": "text",
"content": {"text": content}
}
try:
requests.post(FEISHU_WEBHOOK, json=data, timeout=5)
print(f"[{datetime.now()}] 飞书警报已推送")
except Exception as e:
print(f"飞书推送失败: {e}")
# ========== 主监控循环 ==========
def main():
print("===== 智能止损监控启动 =====")
print(f"监控标的: {SYMBOL}")
print(f"初始止损: {INITIAL_STOP:.2f}")
print(f"回撤比例: {TRAILING_PCT * 100:.0f}%")
print("=" * 50)
current_stop = INITIAL_STOP
highest_price = INITIAL_STOP
while True:
try:
# 1. 获取实时行情
df_quote = qd.quotes.get(symbols=[SYMBOL], to_dataframe=True)
if df_quote.empty:
time.sleep(CHECK_INTERVAL)
continue
current_price = df_quote.iloc[0]["last_price"]
# 2. 获取技术指标数据(每隔一段时间刷新,避免频繁请求)
df_k = get_technical_data(SYMBOL, count=60)
if df_k is None:
time.sleep(CHECK_INTERVAL)
continue
# 3. 更新最高价 & 动态止损(跟踪止损)
if current_price > highest_price:
highest_price = current_price
current_stop = max(current_stop, highest_price * (1 - TRAILING_PCT))
print(f"[{datetime.now().strftime('%H:%M:%S')}] 价格: {current_price:.2f} | 止损: {current_stop:.2f} | 最高: {highest_price:.2f}")
# 4. 判断是否触发止损
if current_price < current_stop:
print(">>> 触发止损候选!调用 DeepSeek 分析...")
# 调用 AI 分析
ai_result = deepseek_analyze(SYMBOL, current_price, current_stop, df_k)
print(f"AI 分析结果:\n{ai_result}")
# 推送警报
send_feishu_alert(SYMBOL, current_price, current_stop, ai_result)
# 可选:根据 AI 建议决定是否真的执行止损
# 如果 AI 建议"观望",可以暂时不执行
if "止损" in ai_result and "观望" not in ai_result:
print("*** AI 建议止损,执行风控操作 ***")
# 这里可以接入你的交易系统
else:
print("*** AI 建议观望,暂不执行止损 ***")
# 5. 休眠
time.sleep(CHECK_INTERVAL)
except Exception as e:
print(f"监控异常: {e}")
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
main()
3.3 运行效果
===== 智能止损监控启动 =====
监控标的: 600519.SH
初始止损: 1200.00
回撤比例: 5%
==================================================
[14:35:22] 价格: 1215.00 | 止损: 1200.00 | 最高: 1215.00
[14:37:22] 价格: 1228.50 | 止损: 1200.00 | 最高: 1228.50
[14:39:22] 价格: 1245.00 | 止损: 1200.00 | 最高: 1245.00
[14:41:22] 价格: 1258.00 | 止损: 1200.00 | 最高: 1258.00 # 更新止损: 1258*0.95=1195.10
[14:43:22] 价格: 1265.00 | 止损: 1195.10 | 最高: 1265.00 # 更新止损: 1265*0.95=1201.75
[14:45:22] 价格: 1240.00 | 止损: 1201.75 | 最高: 1265.00
[14:47:22] 价格: 1198.00 | 止损: 1201.75 | 最高: 1265.00
>>> 触发止损候选!调用 DeepSeek 分析...
AI 分析结果:
1. 当前价格1198已跌破20日均线(约1210)和布林下轨(约1205),短期支撑被击穿。
2. 均线呈空头排列(5日<10日<20日),RSI=32接近超卖但未企稳,趋势明显转弱。
3. 建议:止损
理由:价格跌破关键支撑且均线空头排列,短期下行风险大于反弹机会。
*** AI 建议止损,执行风控操作 ***
四、交易员避坑指南
坑1:动态止损的回撤比例设太紧,频繁被震出场
TRAILING_PCT 设 3% 看起来保守,但 A股波动大,一天振幅 5% 很常见。建议先回测历史数据,找到适合该标的的波动率参数。用 QuantDash 批量获取历史 K 线做回测非常方便。
坑2:DeepSeek API 调用太频繁,成本飙升
上面代码里每次触发止损候选才调 AI,不是每秒钟都调。如果担心成本,可以设置「每日调用上限」或「仅当跌破幅度 > 1% 时才调 AI」。
坑3:实时行情和 K 线数据的复权口径不一致
QuantDash 的 quotes.get() 返回的是实时价格(已复权),klines.get(adjust='forward') 返回前复权历史数据,两者口径一致。但如果你用 adjust='none' 拿原始数据,再和实时价格对比,就会出问题。务必统一使用前复权。
五、常见问题解答
Q1: QuantDash 支持港股和美股吗?代码需要改什么?
A: 完全支持!只需修改 SYMBOL 变量:港股用 00700.HK,美股用 AAPL.US。QuantDash 统一了代码后缀格式,其他代码一行都不用改。标的池参数对应 HK_Stock 和 US_Stock。
Q2: 不想用 DeepSeek,能不能换成其他 AI 或干脆不用?
A: 当然可以。把 deepseek_analyze 函数替换成你自己的分析逻辑即可——比如用 QuantDash 的布林带数据做简单判断:if current_price < df['lower'].iloc[-1]: 触发警报。AI 只是锦上添花,核心数据源还是 QuantDash。
Q3: 免费版 QuantDash 的调用频率够用吗?
A: 免费版对个人量化研究和中小策略完全够用。建议 CHECK_INTERVAL 设为 60 秒以上,避免不必要的请求。如果需要更高频(如 1 秒级监控),可以考虑付费套餐,详情见官网。
🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/
⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash(欢迎 Star / Fork)
💡 免费获取 API Key:https://quantdash.net/dashboard/keys/

