xiaowei-system/scripts/stock_learning.py

218 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
股票投研体系学习执行器
======================
根据当前阶段推进学习内容,输出本周学习任务和进度。
用法:
python3 stock_learning.py report → 输出本周学习报告
python3 stock_learning.py advance → 进入下一阶段
python3 stock_learning.py status → 查看当前状态
"""
import json, os, sys
from datetime import datetime, timezone
HOME = os.path.expanduser("~")
HERMES = HOME + "/.hermes"
TOPICS_FILE = HERMES + "/proactive_learning/topics.json"
PROGRESS_FILE = HERMES + "/proactive_learning/stock_progress.json"
os.makedirs(HERMES + "/proactive_learning", exist_ok=True)
def load():
if os.path.exists(TOPICS_FILE):
data = json.load(open(TOPICS_FILE))
for t in data.get("topics", []):
if t["name"] == "股票投研体系":
return t
return None
def load_progress():
if os.path.exists(PROGRESS_FILE):
return json.load(open(PROGRESS_FILE))
return {"current_phase": 1, "current_item": 0, "learning_notes": [], "test_results": []}
def save_progress(p):
with open(PROGRESS_FILE, "w") as f:
json.dump(p, f, ensure_ascii=False, indent=2)
# ===================== 学习内容库 =====================
PHASES = {
1: {
"title": "股票基础概念",
"items": [
("A股交易规则", [
"A股实行T+1制度当天买次日才能卖",
"涨跌幅限制主板±10%,创业板/科创板±20%",
"集合竞价9:15-9:25申报9:25-9:30不接受新申报",
"连续竞价9:30-11:30、13:00-15:00",
"ST股特别处理涨跌±5%",
"注册制新股上市前5日无涨跌幅限制",
]),
("K线基础", [
"阳线(红/实心):收盘价>开盘价,代表上涨",
"阴线(绿/空心):收盘价<开盘价,代表下跌",
"十字星:收盘≈开盘,多空力量均衡",
"上影线:最高价到收盘/开盘的距离,上涨受阻",
"下影线:最低价到收盘/开盘的距离,底部支撑",
]),
("核心指标", [
"市盈率(PE):股价/每股收益,越低越便宜但也可能是陷阱",
"换手率:当日成交股数/总股本,高换手=活跃但高波动",
"成交量:当日成交股数,量增价涨=健康上涨",
"量比:当日每分钟平均成交量/历史平均,>1.5为放量",
]),
("均线系统", [
"MA55日均线短期趋势",
"MA1010日均线",
"MA20月线中期趋势",
"MA60季线重要支撑/压力位",
"均线多头排列:短>长>短,价格强势",
"均线空头排列:短<长<短,价格弱势",
]),
],
},
2: {
"title": "技术分析框架",
"items": [
("MACD", [
"MACD = 12日EMA - 26日EMA",
"Signal线 = MACD的9日EMA",
"金叉MACD上穿Signal线看涨信号",
"死叉MACD下穿Signal线看跌信号",
"柱状图MACD-Signal线红柱=多头,绿柱=空头",
"顶背离价格新高但MACD没新高警惕回调",
"底背离价格新低但MACD没新低警惕反弹",
]),
("KDJ", [
"由RSV(未成熟随机值)计算得出",
"K值快速指标对价格敏感",
"D值慢速指标更稳定",
"J值3*K-2*D波动最大",
"KDJ金叉K上穿D+ 在20以下 = 超卖区买入信号",
"KDJ死叉K下穿D+ 在80以上 = 超买区卖出信号",
]),
("成交量与价格", [
"放量上涨:健康,看涨信号",
"缩量上涨:可能见顶,动力不足",
"放量下跌:恐慌抛售,可能见底",
"缩量下跌:观望情绪,可能盘整",
"地量见地价:极度缩量后可能反转",
]),
],
},
3: {
"title": "基本面分析",
"items": [
("三张报表", [
"利润表:展示收入、成本、利润",
"资产负债表:展示资产、负债、净资产",
"现金流量表:展示现金流入流出",
"经营现金流>净利润:利润质量好",
"商誉过高:警惕减值风险",
]),
("估值方法", [
"PE市盈率适合稳定增长的行业",
"PB市净率适合金融、周期行业",
"PEG = PE/增长率,<1为低估",
"DCF现金流折现适合高确定性企业",
]),
],
},
4: {
"title": "小唯量化工具链",
"items": [
("数据获取", [
"akshare免费A股数据全面",
"tushare需要积分接口更稳定",
]),
("技术指标计算", [
"pandas/numpy处理行情数据",
"TA-Lib计算MACD/KDJ/BOLL",
"matplotlib可视化",
]),
],
},
5: {
"title": "模拟交易与策略验证",
"items": [],
},
}
def generate_report(progress, topic):
phase = progress["current_phase"]
item_idx = progress["current_item"]
phase_data = PHASES.get(phase, {})
report = f"**📈 股票投研体系学习报告**\n"
report += f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
report += f"当前阶段: Phase {phase} - {phase_data.get('title', '完成')}\n\n"
if phase == 5:
report += "**✅ 理论学习完成,开始模拟交易阶段**\n\n"
report += "下一步:选择模拟平台(小唯推荐聚宽/掘金),搭建回测环境\n"
return report
items = phase_data.get("items", [])
total_items = len(items)
if item_idx < total_items:
concept, points = items[item_idx]
report += f"**本周主题:{concept}**\n"
for i, p in enumerate(points, 1):
report += f"{i}. {p}\n"
report += f"\n📝 进度: {item_idx+1}/{total_items} 个概念\n"
report += f"阶段进度: {item_idx*100//total_items}%\n"
else:
report += f"**阶段 {phase} 完成!**\n"
report += f"\n✅ 已掌握:\n"
for concept, points in items:
report += f" - {concept}\n"
report += f"\n下一阶段Phase {phase+1} - {PHASES.get(phase+1, {}).get('title', '完成')}\n"
report += f"\n回复「下一阶段」推进学习\n"
# 历史学习记录
if progress.get("learning_notes"):
report += f"\n**📖 学习笔记** ({len(progress['learning_notes'])}条)\n"
for note in progress["learning_notes"][-3:]:
report += f" - {note[:60]}\n"
return report
if __name__ == "__main__":
topic = load()
progress = load_progress()
cmd = sys.argv[1] if len(sys.argv) > 1 else "report"
if cmd == "report":
print(generate_report(progress, topic))
elif cmd == "advance":
# 推进到下一项或下一阶段
phase = progress["current_phase"]
phase_data = PHASES.get(phase, {})
items = phase_data.get("items", [])
item_idx = progress["current_item"]
if item_idx + 1 < len(items):
progress["current_item"] += 1
elif phase + 1 in PHASES:
progress["current_phase"] = phase + 1
progress["current_item"] = 0
else:
print("全部阶段已完成!")
sys.exit(0)
save_progress(progress)
print(generate_report(progress, topic))
elif cmd == "status":
print(json.dumps(progress, ensure_ascii=False, indent=2))
else:
print("用法: stock_learning.py [report|advance|status]")