启航 A 股个股分析(直接给报告版)
用户输入一个 A 股代码或名称(如「600519」「茅台」「比亚迪 002594」),本 skill 自动取数 + 分析, 直接输出一份完整的 Markdown 个股研究报告。不教用户搭工具、不喊单、不给买卖指令,只给事实与多情景判断。
核心原则:公开接口取数(零付费 key) · 数据驱动严禁虚构 · 涨红跌绿 · 每份报告标来源与时间 · 末尾风险提示
一、触发场景
- 「分析一下 XXX」「给我出一份 XXX 的研报」「XXX 这只股票怎么样」
- 「XXX 资金流向如何」「XXX 最近机构怎么看」「XXX 财报怎么样」
- 用户直接给 6 位代码 / 名称 / 名称+代码
收到请求后:先归一化代码(见下)→ 跑取数代码块 → 按分析框架解读 → 套报告模板输出。
二、硬约束(每次必读,违反即违规)
🚨 数据准确性
- 严禁虚构数据:所有数字必须来自下方取数代码块的真实返回。取数失败就明说「该数据未能获取」,绝不用估算/记忆填补。
- 来源与时间标注:报告每个数据区块末尾标注来源(如「腾讯行情」「东财资金流」)与获取日期。
- 价格必须以实时接口为准:不凭记忆写价格;接口失败时如实标注,不猜测。
🚨 合规与表述(关键)
- 不喊单:不得出现「现在买入」「建议卖出」「必涨/必跌」「目标价 XXX 元」这类确定性指令或预测。
- 改为呈现:事实数据 + 多情景描述(乐观/中性/谨慎)+ 对应观察信号 + 风险点。
- 风险提示:每份报告末尾固定含「投资有风险,以上分析基于公开数据,仅供参考,不构成投资建议」。
- 涨红跌绿:A 股惯例,涨幅/上涨用红色(#E74C3C),跌幅/下跌用绿色(#27AE60)。
- A 股规则若涉及数量建议(如用户追问「如果买」的情形下举例):买入/卖出必须为 100 股(1 手)整数倍;T+1 限制(今日买入当日不可卖);涨跌停范围主板 ±10% / 科创创业 ±20% / ST ±5%。
- 不诱导站外:引流只需在报告末尾软提及产品名「启航股票助手」,严禁出现微信号、二维码、外链、加群话术——这既违规也违背本 skill 定位。
🚨 安全红线(平台审核必查)
- 本 skill 只允许数据获取与文本分析,不得包含:后台进程拉起、动态代码求值、未声明系统命令调用。
取数代码全部为
urllib/requests网络请求 + 本地数值计算,无上述风险写法。
三、运行依赖与取数架构
# 无需第三方库:脚本基于标准库 urllib 实现,零依赖(requests 可选)
# 以下可选增强,缺了也能跑基础版:
pip install pandas stockstats # 财报表解析 / 技术指标(无则用内置精简计算)
取数优先级(公开、免费、零 key):
| 数据类型 | 接口 | 说明 |
|----------|------|------|
| 实时行情 / 估值 | 腾讯 qt.gtimg.cn | 不封 IP,含 PE/PB/市值/换手/涨跌停/量比 |
| 资金流序列(多日) | 新浪 MoneyFlow.ssl_qsfx_zjlrqs | 主源:日频资金净流入额(netamount),一次可取 60 日;用于趋势柱状图与近20/5日汇总、连续同向天数 |
| 当日主力明细 | 东财 push2delay fflow daykline | 主力/超大/大/中/小单净额+净占比;主力=大单+超大单(与行情软件「主力净流入」一致);延迟服务器只返回最新 1 个交易日 |
| 当日资金兜底 | 新浪 MoneyFlow.ssi_ssfx_flzjtj | 实时 r0/r1/r2/r3 分布,主力=超大单+大单;东财不可达时兜底 |
| 研报 / 机构评级 | 东财 reportapi | 评级 + 一致预期 EPS |
| 财报三表 | 新浪 quotes.sina.cn | 利润表(lrb)/资产负债表(fzb)/现金流量(llb);单位:元,原始返回 |
| 个股基本面 | 东财 push2delay stock/get | 行业(f127)/地域(f128)/概念(f129)/总股本/总市值/流通市值/上市日期 |
| 概念板块 | 东财 push2delay stock/get f129 | 主用行业/地域/概念(比百度更稳,百度常 403 已弃用;push2 主域名在部分网络被 RST 阻断,故优先 push2delay) |
| 个股新闻 | 东财 search-api-web | 相关新闻 |
| 全球资讯 | 东财 np-weblist | 大盘情绪背景 |
东财系接口有风控,所有
eastmoney.com请求必须走下方em_get()限流入口,避免被封 IP。
四、取数代码块(内嵌,直接可用)
把下面代码块按需组合运行。东财相关接口先执行「共用 helper」初始化
em_get。
4.0 共用 helper(东财限流 + 会话复用)
import time, random, requests
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
EM_SESSION = requests.Session()
EM_SESSION.headers.update({"User-Agent": UA})
EM_MIN_INTERVAL = 1.0
_em_last = [0.0]
def em_get(url, params=None, headers=None, timeout=15, **kw):
"""东财统一请求:自动限流(≥1s+抖动) + 复用会话。所有 eastmoney 请求走它。"""
wait = EM_MIN_INTERVAL - (time.time() - _em_last[0])
if wait > 0:
time.sleep(wait + random.uniform(0.1, 0.5))
try:
return EM_SESSION.get(url, params=params, headers=headers, timeout=timeout, **kw)
finally:
_em_last[0] = time.time()
def code_to_secid(code: str) -> str:
"""6 位代码 → 东财 secid(沪市 1.xxx / 深市 0.xxx)"""
return f"1.{code}" if code.startswith("6") else f"0.{code}"
def norm_code(raw: str) -> str:
"""名称/代码混合输入 → 6 位纯数字代码。简单映射表覆盖常见别名。"""
raw = raw.strip().upper()
alias = {"茅台":"600519","贵州茅台":"600519","五粮液":"000858","比亚迪":"002594",
"宁德时代":"300750","中国平安":"601318","招商银行":"600036","东方财富":"300059"}
if raw in alias: return alias[raw]
digits = "".join(ch for ch in raw if ch.isdigit())
return digits[-6:] if len(digits) >= 6 else digits
4.1 腾讯实时行情(零依赖,含估值/涨跌停)
import urllib.request
def tencent_quote(codes):
"""codes: ['600519','000858'] → {code: {...}}"""
pref = []
for c in codes:
if c.startswith(("6","9")): pref.append(f"sh{c}")
elif c.startswith("8"): pref.append(f"bj{c}")
else: pref.append(f"sz{c}")
url = "https://qt.gtimg.cn/q=" + ",".join(pref)
req = urllib.request.Request(url, headers={"User-Agent": UA})
data = urllib.request.urlopen(req, timeout=10).read().decode("gbk")
out = {}
for line in data.strip().split(";"):
if "=" not in line or '"' not in line: continue
key = line.split("=")[0].split("_")[-1]
v = line.split('"')[1].split("~")
if len(v) < 53: continue
code = key[2:]
out[code] = {
"name": v[1], "price": float(v[3] or 0), "last_close": float(v[4] or 0),
"open": float(v[5] or 0), "change_amt": float(v[31] or 0),
"change_pct": float(v[32] or 0), "high": float(v[33] or 0),
"low": float(v[34] or 0), "amount_wan": float(v[37] or 0),
"turnover_pct": float(v[38] or 0), "pe_ttm": float(v[39] or 0),
"amplitude_pct": float(v[43] or 0), "mcap_yi": float(v[44] or 0),
"float_mcap_yi": float(v[45] or 0), "pb": float(v[46] or 0),
"limit_up": float(v[47] or 0), "limit_down": float(v[48] or 0),
"vol_ratio": float(v[49] or 0), "pe_static": float(v[52] or 0),
}
return out
# 用法
q = tencent_quote(["600519"])
info = q["600519"]
print(f"{info['name']} {info['price']}元 涨{info['change_pct']}% PE{info['pe_ttm']} PB{info['pb']} 市值{info['mcap_yi']}亿")
字段索引校准:39=PE(TTM),43=振幅%(非PB),44=总市值(亿),46=PB,47=涨停价,48=跌停价,49=量比。
4.2 资金流三源链路(序列 + 当日明细)
⚠️ 实测坑(重要):
push2.eastmoney.com/push2his.eastmoney.com在部分网络环境会被 RST 阻断(RemoteDisconnected), 但push2delay.eastmoney.com(延迟行情服务器)可正常访问——资金流、当日主力明细、行业/概念字段都能取到。 而延迟服务器只返回最新 1 个交易日的资金流,历史多日序列须改用新浪接口。 因此采用「新浪序列(多日)+ 东财 delay(当日明细)」双源互备,两者口径不同必须标注。
def mkt_prefix(code):
return "sh" if code.startswith(("6", "9")) else ("bj" if code.startswith("8") else "sz")
# 源1(主):新浪资金流历史序列——多日,netamount = 当日资金净流入额(元)
def fund_flow_sina_history(code, num=60):
url = "https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/MoneyFlow.ssl_qsfx_zjlrqs"
p = {"page": "1", "num": str(num), "sort": "opendate", "asc": "0",
"daima": f"{mkt_prefix(code)}{code}"}
d = json.loads(em_get(url, params=p, headers={"User-Agent": UA, "Referer": "https://finance.sina.com.cn/"}, timeout=20))
rows = [{"date": str(r.get("opendate"))[:10], "main_net": float(r.get("netamount") or 0)}
for r in (d if isinstance(d, list) else []) if r.get("opendate")]
rows.sort(key=lambda x: x["date"]) # 新浪返回为降序,必须反转
return rows # 60 条约覆盖 3 个月
# 源2:东财延迟服务器——当日主力明细(主力 = 大单 + 超大单,与行情软件一致)
def fund_flow_em_today(code):
url = "https://push2delay.eastmoney.com/api/qt/stock/fflow/daykline/get"
p = {"secid": code_to_secid(code), "fields1": "f1,f2,f3,f7",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62", "lmt": "5"}
d = json.loads(em_get(url, params=p, headers={"User-Agent": UA, "Referer": "https://quote.eastmoney.com/"}, timeout=15))
pp = ((d.get("data") or {}).get("klines") or [])[-1].split(",")
g = lambda i: float(pp[i]) if pp[i] not in ("", "-") else 0.0
# 索引:0日期 1主力净额 2小单 3中单 4大单 5超大单 6主力占比 7小单占比 8中单占比 9大单占比 10超大单占比 11收盘
return {"date": pp[0], "main_net": g(1), "small": g(2), "mid": g(3), "big": g(4), "xbig": g(5),
"main_pct": g(6), "small_pct": g(7), "mid_pct": g(8), "big_pct": g(9), "xbig_pct": g(10)}
# 校验:主力净额 == 大单 + 超大单(g(1) == g(4)+g(5) 恒成立)
# 源3(兜底):新浪实时资金分布——r0超大单/r1大单/r2中单/r3小单
def fund_flow_today(code):
url = "https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/MoneyFlow.ssi_ssfx_flzjtj"
d = json.loads(em_get(url, params={"daima": f"{mkt_prefix(code)}{code}"},
headers={"User-Agent": UA, "Referer": "https://finance.sina.com.cn/"}, timeout=15))
f = lambda k: float(d.get(k) or 0)
return {"main_net": (f("r0_in") - f("r0_out")) + (f("r1_in") - f("r1_out")),
"xbig": f("r0_in") - f("r0_out"), "big": f("r1_in") - f("r1_out"),
"mid": f("r2_in") - f("r2_out"), "small": f("r3_in") - f("r3_out")}
# 链路:序列优先后,再取当日明细;全部失败才标注「受限」,绝不编造
ff = fund_flow_sina_history("600519", 60) # -> [{"date","main_net"}...] 升序
em = fund_flow_em_today("600519") # -> 当日主力明细(东财口径)
last20, last5 = sum(r["main_net"] for r in ff[-20:]) / 1e8, sum(r["main_net"] for r in ff[-5:]) / 1e8
ratio = last20 / mcap_yi * 100 # 近20日净流入占市值比(消除市值规模差异)
口径差异必须在报告里写明:新浪
netamount(主动买入−主动卖出)与东财「主力净流入」(大单+超大单)数值可差近一倍, 但方向一致,可互参。报告统一在来源行标注:「序列口径=新浪资金净流入额;当日明细口径=东方财富(主力=大单+超大单)」。
4.3 东财研报(机构评级 + 一致预期 EPS)
def eastmoney_reports(code, max_pages=3):
"""研报列表:含机构评级、一致预期 EPS。"""
REPORT_API = "https://reportapi.eastmoney.com/report/list"
out = []
for page in range(1, max_pages+1):
params = {"pageSize":"100","pageNo":str(page),"code":code,
"beginTime":"2000-01-01","endTime":"2030-01-01",
"fields":"","qType":"0","orgCode":"","rcode":"",
"p":str(page),"pageNum":str(page),"pageNumber":str(page)}
r = em_get(REPORT_API, params=params,
headers={"Referer":"https://data.eastmoney.com/"}, timeout=30)
d = r.json(); rows = d.get("data") or []
if not rows: break
out.extend(rows)
if page >= (d.get("TotalPage",1) or 1): break
return out
# 用法
reps = eastmoney_reports("600519")
if reps:
r0 = reps[0]
print(f"最新研报: {r0.get('publishDate','')[:10]} {r0.get('orgSName')} "
f"评级={r0.get('emRatingName')} 今年EPS预期={r0.get('predictThisYearEps')}")
print(f"近 {len(reps)} 篇;机构评级分布参考各条 emRatingName 字段")
4.4 新浪财报三表(利润表趋势)
import requests
def sina_financial_report(code, rtype="lrb", num=6):
"""rtype: lrb(利润表)/fzb(资产负债)/llb(现金流)。返回按报告期倒序的 dict 列表。"""
prefix = "sh" if code.startswith("6") else "sz"
url = "https://quotes.sina.cn/cn/api/openapi.php/CompanyFinanceService.getFinanceReport2022"
params = {"paperCode": f"{prefix}{code}", "source": rtype, "type":"0",
"page":"1", "num":str(num)}
r = requests.get(url, params=params, headers={"User-Agent": UA}, timeout=15)
rl = r.json().get("result",{}).get("data",{}).get("report_list",{}) or {}
rows = []
for period in sorted(rl.keys(), reverse=True)[:num]:
rec = {"报告期": f"{period[:4]}-{period[4:6]}-{period[6:8]}"}
for it in (rl[period].get("data",[]) or []):
if not it.get("item_title") or it.get("item_value") is None: continue
rec[it["item_title"]] = it["item_value"]
rows.append(rec)
return rows
# 用法
lrb = sina_financial_report("600519","lrb")
for it in lrb[:3]:
print(it.get("报告期"), "净利润:", it.get("净利润"), "营收:", it.get("营业收入"))
4.5 东财个股基本面(行业/总股本/上市日期)
def eastmoney_stock_info(code):
url = "https://push2delay.eastmoney.com/api/qt/stock/get"
params = {"fltt":"2","invt":"2","fields":"f57,f58,f84,f85,f127,f116,f117,f189,f43",
"secid": code_to_secid(code)}
d = em_get(url, params=params, headers={"User-Agent": UA}, timeout=10).json().get("data",{})
return {"code": d.get("f57",""), "name": d.get("f58",""), "industry": d.get("f127",""),
"total_shares": d.get("f84",0), "float_shares": d.get("f85",0),
"mcap": d.get("f116",0), "float_mcap": d.get("f117",0),
"list_date": str(d.get("f189","")), "price": d.get("f43",0)}
# 用法
si = eastmoney_stock_info("600519")
print(f"{si['name']} 行业={si['industry']} 总市值={si['mcap']/1e8:.0f}亿 上市={si['list_date']}")
4.6 概念板块(东财 stock/get f129,主用)
⚠️ 已弃用百度
finance.pae.baidu.com(实测常返回 403 Forbidden)。改用东财push2delay stock/get的f127(行业)/f128(地域)/f129(概念) 字段,一次返回、稳定可靠。务必用push2delay域名:push2.eastmoney.com在部分网络环境会被 RST 阻断。
def eastmoney_concept(code):
"""行业/地域/概念一次取齐(f127/f128/f129)。"""
url = "https://push2delay.eastmoney.com/api/qt/stock/get"
p = {"fltt":"2","invt":"2","fields":"f57,f58,f127,f128,f129,f116,f117,f189",
"secid": code_to_secid(code)}
d = json.loads(em_get(url, params=p, headers={"User-Agent": UA}, timeout=10)).get("data", {})
return {"industry": d.get("f127",""), "region": d.get("f128",""),
"concepts": [c.strip() for c in (d.get("f129","") or "").split(",") if c.strip()]}
# 用法
c = eastmoney_concept("002639")
print("行业:", c["industry"], "| 概念:", c["concepts"][:5])
4.7 东财个股新闻 + 全球资讯(情绪背景)
import json, re
def eastmoney_stock_news(code, page_size=10):
cb = "jQuery_news"
url = "https://search-api-web.eastmoney.com/search/jsonp"
inner = json.dumps({"uid":"","keyword":code,"type":["cmsArticleWebOld"],"client":"web",
"clientType":"web","clientVersion":"curr",
"param":{"cmsArticleWebOld":{"searchScope":"default","sort":"default",
"pageIndex":1,"pageSize":page_size,"preTag":"","postTag":""}}}, separators=(',',':'))
r = em_get(url, params={"cb":cb,"param":inner},
headers={"User-Agent":UA,"Referer":"https://so.eastmoney.com/"}, timeout=15)
text = r.text
d = json.loads(text[text.index("(")+1:text.rindex(")")])
arts = d.get("result",{}).get("cmsArticleWebOld",[]) or []
return [{"title":re.sub(r'<[^>]+>','',a.get("title","")),"time":a.get("date",""),
"source":a.get("mediaName","")} for a in arts[:page_size]]
# 用法
news = eastmoney_stock_news("600519")
for n in news[:5]:
print(f" {n['time']} | {n['source']} | {n['title']}")
4.8 技术面本地计算(MA / MACD,无 pandas 也可用)
def calc_ma(prices, n):
"""简单移动平均;prices 为收盘价列表(旧→新)。返回最近一个 MA 值或 None。"""
if len(prices) < n: return None
return round(sum(prices[-n:]) / n, 2)
def calc_macd(closes, fast=12, slow=26, signal=9):
"""返回 (dif, dea, hist) 最新值。EMA 递推实现,零依赖。"""
if len(closes) < slow: return (None, None, None)
ema_f, ema_s = closes[0], closes[0]
kf, ks = 2/(fast+1), 2/(slow+1)
dif_series, dea = [], None
for p in closes:
ema_f = p*kf + ema_f*(1-kf)
ema_s = p*ks + ema_s*(1-ks)
dif = ema_f - ema_s
dif_series.append(dif)
dea_k = 2/(signal+1)
dea_v = dif_series[0]
for d in dif_series:
dea_v = d*dea_k + dea_v*(1-dea_k)
hist = (dif_series[-1] - dea_v) * 2
return (round(dif_series[-1],3), round(dea_v,3), round(hist,3))
# 注:closes 来自腾讯日K(web.ifzq.gtimg.cn,主源)或东财 push2his(备用)。
# 若取不到历史 K 线,技术面标注「MA/MACD 需要历史 K 线,本次未获取」,不编造。
五、分析框架(怎么把数据写成"有增量"的报告)
本 skill 与「持仓体检报告」共用同一套五维分析规则,但只用公开免费接口 + 本地计算复现(不接 NeoData / 妙想,保持零 key)。 关键区别:普通行情软件只给你"价格/PE/资金流"的原始数字;本框架把它们读成判断,这是报告的增量所在。
5.0 五个深度模块(缺一不可,否则就是"软件首页复刻")
| # | 模块 | 数据来源 | 产出 | |---|------|----------|------| | A | 单季趋势 | 新浪 lrb 累计值 → 本地派生单季 | 单季归母/营收、单季同比、四季环比抬升次数 | | B | 财务质量 | 新浪 lrb + fzb 派生 | ROE / 净利率 / 毛利率 / 资产负债率 / 流动比率 | | C | 五维打分 | 上述 + K线 + 资金流 | 估值/成长/质量/资金/技术 五分 + 雷达图 | | D | 四象限 | 净利同比 × 估值位置分位 | 高增低估 / 高增高估 / 低增极低估 / 低增估值不低 | | E | 辩证论述 | 综合以上 | 150~300 字连贯分析 + 三种辩证句式 | | F | 个股分析评测 | 均线/K线/量能/资金/业绩 | 仿大盘市况定档(强多/震荡偏强/区间震荡/弱势退潮/否决)+ 强度分 0-100 + 条件化操作取向 |
5.1 单季趋势(最有价值的一块,别省)
- 由新浪
lrb累计净利润派生单季 = 本期累计 − 上期累计(一季报本就是单季)。 - 算最近单季同比(vs 去年同季)+ 四季环比抬升次数。
- 真实价值:年报累计常把最近一季的塌方平均掉。例:茅台 25Q4 单季 -30%,年报累计只 -4.5%——只看年报会被误导。
5.2 财务质量派生公式(新浪三表,单位元)
ROE(TTM) ≈ 最近4个单季净利之和 / 净资产(资产总计−负债合计)
净利率 = 净利润 / 营业收入
毛利率 = (营业收入 − 营业成本) / 营业收入
资产负债率 = 负债合计 / 资产总计
流动比率 = 流动资产合计 / 流动负债合计 # <1 必须单独点出(资产负债表级信号)
5.3 五维打分(只用于排序,结论需人工复核)
| 维度 | 算法要点(已适配公开接口) |
|------|---------------------------|
| 估值 | 100 − 价格120日分位(以价格分位代理 PE 分位,标注清楚) |
| 成长 | 50 + 单季净利同比×100×1.0 + 单季营收同比×100×0.5,clamp 0~100 |
| 质量 | ROE/35×100×0.4 + 净利率/50×100×0.25 + 毛利率/50×100×0.15 + (100−负债率)×0.2 |
| 资金 | 50 + clamp(近20日净流入/市值×100×18, -40, 40) + clamp(当日净流入/市值×100×6, -10, 10);序列与当日均取不到才标 — |
| 技术 | 站上 MA5/20/60 各+15,MACD>0 +20,RSI>50 +15(超卖+3),(100−|回撤|×2)×0.2 |
打分只用于横向排序,会漏掉"质地好但资金在砸"这类背离,结论必须结合辩证论述。
5.4 四象限规则(照持仓体检报告)
X = 近单季净利同比(%);Y = 估值位置分位(%)
npYoy>0 & Y<50 → 高增低估(最香,#21a675)
npYoy>0 & Y>=50 → 高增高估(贵得有道理?#e8893b)
npYoy<=0 & Y<20 → 低增极低估(便宜有原因,#3a6df0)
否则 → 增长弱估值不低(最需谨慎,#d8493f)
5.5 辩证论述写法(报告质量分水岭)
❌ 错误:分四个小标题各写一两句,信息单薄。 ✅ 正确:150~300 字连贯论述,一气呵成:
先定性(一句)+ 数据支撑。尤其点出单季数据揭示的真相。
再说质地:ROE / 毛利率 / 净利率 / 负债率 / 流动比率。
再谈估值辩证:绝对值 vs 价格分位,以及分母是否在萎缩。
最后资金与价格验证 → 一句明确结论 + 操作含义(非买卖建议)。
必须含三种辩证句式(官方精髓):
- 「PE X 倍看着不低,但分母(利润)在快速萎缩,高倍数正是分母塌陷所致,低价格分位只是便宜的假象」
- 「PB 低却净利暴跌,这是便宜是有原因的」
- 「净资产厚 ≠ 能赚钱,别把 PB 低当成安全边际」
流动比率 < 1 必须单独点出(比亚迪 0.79 级别的信号)。
5.6 多情景替代喊单
用「若…则…」句式描述条件,不下指令。例:「若单季净利同比转正且主力持续净流入,估值修复弹性大;若单季继续恶化并跌破关键均线,需防范回撤。」
5.7 个股分析评测(仿大盘市况 L0/L1,报告第一节卡片)
把交易系统「大盘市况(L0 定档 + L1 信号打分 → 进攻/防守/空仓)」的方法迁移到个股——用个股可算的指标替代大盘专属指标:
| 大盘市况信号 | 个股对应替代 | |------|------| | 指数位置(站稳 MA20) | 价格相对 MA5/MA20/MA60 位置 + 均线多空排列 | | 动能(涨跌家数/涨停) | MACD 柱方向 + 量比 | | 成交额/量能 | 量比(相对量能) | | 外盘五件套 | 主力资金净流入(可得则计,受限则标注不计) | | 一票否决(跌停>50/涨跌比<1:3) | 业绩暴雷(单季同比<-50% 且 PE 高)/ ST / 当日近跌停 |
个股强度分(0-100)信号打分:趋势位置(±25) + 均线排列(±15) + MACD(±15) + 量能(±10) + RSI(±10) + 主力资金(±15);一票否决直接「风险回避」。
市况四档(类比大盘 进攻/防守/空仓,但语义改为个股条件框架):
- ≥70 强多(主升) → 顺势关注(维持多头排列、量能不背离、主力持续流入则趋势有望延续;回踩关键均线不破再评估,不追高)
- 40-69 且站 MA20 震荡偏强 / 否则 区间震荡 → 等待确认 / 观望为主
- <40 弱势退潮 → 防守观望(等企稳信号,不接下落的刀)
- 触发否决 → 回避(任何「看着便宜」都不是理由,先排除)
关键:市况评测聚焦「价格技术状态」,与「公司质地(五维质量分)」是两个维度——好公司也可能处于弱势技术形态(如茅台基本面质量满分但当前弱势回调)。这是软件首页不会标红的增量。
一票否决条件:单季净利同比 < -50% 且 PE > 100(业绩暴雷/价值陷阱);或名称/概念含 ST;或当日跌幅近跌停。
六、报告模板(Markdown 输出)
# {名称}({代码}) 个股分析报告
> 生成时间:{YYYY-MM-DD} | 数据来源:腾讯行情 / 东财 / 新浪(公开接口,零付费 key)
## 一、行情速览
| 项目 | 数值 |
|------|------|
| 现价 | {price} 元({涨/跌}{change_pct}%,{红/绿}) |
| 今开 / 昨收 | {open} / {last_close} |
| 最高 / 最低 | {high} / {low} |
| 换手率 | {turnover_pct}% | 量比 {vol_ratio} |
| 涨停 / 跌停 | {limit_up} / {limit_down} |
| PE(TTM) / PB | {pe_ttm} / {pb} |
| 总市值 | {mcap_yi} 亿 | 行业:{industry} |
*来源:腾讯行情,{date}*
## 二、资金面
- 近 20 日主力累计净流入:**{A} 亿**({偏积极/中性/偏谨慎})
- 当日主力方向:{净流入/净流出}(盘中有效,非交易时段标注「盘后无分钟数据」)
- 超大单:{方向}
*来源:东财资金流,{date}*
## 三、基本面与机构观点
- 近 N 期净利润(新浪):{列出趋势,如 2025Q3 同比 +X%}
- 机构研报:近 {M} 篇,评级以 {买入/增持/中性} 为主;最新一致预期今年 EPS≈{eps}
*来源:新浪财报 / 东财研报,{date}*
## 四、概念与题材
- 行业:{industry_list}
- 概念:{concept_list}
*来源:东财概念板块(push2delay f129),{date}*
## 五、技术面
- 现价相对 MA20:{上方/下方},中期趋势 {偏强/震荡/偏弱}
- MACD:{金叉/死叉/红柱放大/绿柱},动能 {延续/减弱}
*(若未获取历史 K 线,标注「技术面需历史数据,本次未取」)*
## 六、多情景观察(非买卖建议)
- 乐观情形:若 {条件},则 {可能表现}
- 中性情形:{条件} → {表现}
- 谨慎情形:若 {风险信号触发},需防范 {后果}
## 七、近期资讯
- {news1}
- {news2}
*来源:东财个股新闻,{date}*
---
> 📌 本报告由「启航A股个股分析」免费生成。作者另有自用实时盯盘工作台「启航股票助手」(单文件 HTML,含交易系统/持仓管理/板块主线/资金联动),本 skill 是其对外公开的分析方法论。
>
> ⚠️ 投资有风险,以上分析基于公开数据自动生成,仅供参考,**不构成任何证券买卖建议**。请独立判断、自担风险。
六·B HTML 网页报告(推荐输出)
Markdown 排版在浏览器里不够直观。推荐直接产出单文件 HTML 网页报告:内联 SVG 走势图(收盘价+MA5/MA20)、资金流柱状图、涨红跌绿、响应式卡片,零外部依赖、双击即开。
完整生成器见 references/gen_report_html.py(已内置多源容错):
python references/gen_report_html.py 002639 雪人股份
# -> 雪人集团_002639_个股分析报告.html (同目录,自包含)
脚本要点:
- 深度模块(对标持仓体检报告):单季趋势派生(新浪 lrb 累计→单季,算同比+环比抬升次数)、财务质量(新浪 lrb+fzb 派生 ROE/毛利率/净利率/负债率/流动比率)、五维打分+雷达图、四象限着色、150~300 字辩证论述(三种辩证句式)。
- 行情用腾讯;概念/行业/地域用东财
push2delay stock/getf129(弃用百度);K线腾讯主源、东财 push2his 备用。 - 个股分析评测(报告第一节卡片):仿大盘市况 L0/L1,用均线排列/动能/量能/资金/业绩替代大盘涨跌比/指数/外盘,给个股「强多/震荡偏强/区间震荡/弱势退潮/一票否决」档位 + 强度分 0-100 + 条件化操作取向;含一票否决(业绩暴雷/ST/近跌停)。
- 资金流三源链路:新浪日频序列(主)→ 东财
push2delay当日主力明细 → 新浪实时分布(兜底);任一源可通即出真数,全失败才标「受限」不编造。口径差异(新浪 netamount vs 东财大单+超大单)必须在来源行写明。 - 所有数字来自真实返回;取不到的字段一律显示「未能获取/接口受限」,并标注来源与时间。
- 图表:走势/资金用内联 SVG(离线可用);雷达图/单季趋势用 ECharts(CDN + bootcdn 兜底,数据内联,无需 fetch)。
- 遵守硬约束:不喊单、涨红跌绿、T+1/100股/涨跌停提示、末尾软引流+风险提示。
七、自检清单(输出前过一遍)
- [ ] 所有数字来自取数代码真实返回,无编造
- [ ] 每个数据块标注了来源与日期
- [ ] 报告含「单季趋势 / 财务质量 / 五维打分 / 四象限 / 辩证论述 / 个股分析评测」六大深度模块(缺一则退回补)
- [ ] 报告第一节「个股分析评测」卡片:四档定档 + 强度分 + 条件化操作取向(非指令);一票否决已正确触发(如业绩暴雷/ST)
- [ ] 辩证论述为 150~300 字连贯段落,含至少一种辩证句式(分母萎缩 / 便宜有原因 / 净资产≠能赚钱)
- [ ] 流动比率 < 1 已单独点出(若触发)
- [ ] 涨用红、跌用绿
- [ ] 无「买入/卖出/必涨/目标价」类指令或确定性预测
- [ ] 含「多情景观察」而非单一结论
- [ ] 末尾含产品软提及 + 风险提示
- [ ] 未出现任何微信号/二维码/外链/加群话术
版本 1.0.0 | 基于「启航股票助手」实战方法论沉淀,公开接口取数,零付费 key。
Scan to join WeChat group