{"skill":{"slug":"joinquant","displayName":"joinquant","summary":"聚宽量化交易平台 - 提供A股、期货、基金数据查询，事件驱动策略回测，支持在线研究与模拟实盘。","description":"---\nname: joinquant\ndescription: 聚宽量化交易平台 - 提供A股、期货、基金数据查询，事件驱动策略回测，支持在线研究与模拟实盘。\nversion: 1.1.0\nhomepage: https://www.joinquant.com\nmetadata: {\"clawdbot\":{\"emoji\":\"🔬\",\"requires\":{\"bins\":[\"python3\"]}}}\n---\n\n# 聚宽量化（JoinQuant）\n\n[聚宽](https://www.joinquant.com) 是中国领先的在线量化交易平台，提供免费数据查询、策略回测和模拟交易。支持A股、期货、基金、指数等品种，采用事件驱动的Python策略框架。\n\n> ⚠️ **需要在 https://www.joinquant.com 注册账号**。策略运行在聚宽云端，也可以通过JQData在本地获取数据。\n\n## 安装 (Local Data SDK)\n\n```bash\npip install jqdatasdk\n```\n\n## 本地数据认证\n\n```python\nimport jqdatasdk as jq\n\n# 使用聚宽账号登录（每日免费数据额度）\njq.auth('your_username', 'your_password')\n\n# 查看剩余数据额度\nprint(jq.get_query_count())\n```\n\n## 策略程序结构（在线回测）\n\n聚宽策略采用事件驱动架构，在平台网页界面编写和运行：\n\n```python\ndef initialize(context):\n    \"\"\"初始化函数 — 策略启动时调用一次\"\"\"\n    # 设置基准指数（沪深300）\n    set_benchmark('000300.XSHG')\n    # 设置手续费 and slippage\n    set_order_cost(OrderCost(open_tax=0, close_tax=0.001,\n                              open_commission=0.0003, close_commission=0.0003,\n                              min_commission=5), type='stock')\n    set_slippage(FixedSlippage(0.02))\n    # 设置股票池\n    g.security = '000001.XSHE'\n\ndef handle_data(context, data):\n    \"\"\"盘中事件 — 每个交易频率触发一次\"\"\"\n    security = g.security\n    # 获取最近20天收盘价\n    close_data = attribute_history(security, 20, '1d', ['close'])\n    ma5 = close_data['close'][-5:].mean()\n    ma20 = close_data['close'].mean()\n\n    # 金叉 — buy\n    if ma5 > ma20:\n        order_target_value(security, context.portfolio.total_value * 0.9)\n    # 死叉 — sell\n    elif ma5 < ma20:\n        order_target(security, 0)\n```\n\n---\n\n## 股票代码格式\n\n| 市场 | 后缀 | 示例 |\n|---|---|---|\n| 上海A股 | `.XSHG` | `600000.XSHG`（浦发银行） |\n| 深圳A股 | `.XSHE` | `000001.XSHE`（平安银行） |\n| 指数 | `.XSHG/.XSHE` | `000300.XSHG`（沪深300） |\n| 期货 | `.XDCE/.XZCE/.XSGE/.CCFX` | `IF2401.CCFX`（股指期货） |\n| 基金 | `.XSHG/.XSHE` | `510300.XSHG`（沪深300ETF） |\n\n---\n\n## 数据查询函数（JQData）\n\n### 行情数据\n\n```python\nimport jqdatasdk as jq\n\n# 获取日K线数据\ndf = jq.get_price(\n    '000001.XSHE',              # 股票代码\n    start_date='2024-01-01',    # 开始日期\n    end_date='2024-06-30',      # 结束日期\n    frequency='daily',          # 频率: daily(日), minute(分钟), 1m, 5m, 15m, 30m, 60m, 120m\n    fields=['open', 'close', 'high', 'low', 'volume', 'money'],\n    skip_paused=True,           # 跳过停牌日\n    fq='pre',                   # 复权: None(不复权), 'pre'(前复权), 'post'(后复权)\n    panel=False                 # False返回DataFrame\n)\n\n# 获取多只股票数据\ndf = jq.get_price(['000001.XSHE', '600000.XSHG'],\n                   start_date='2024-01-01', end_date='2024-06-30',\n                   frequency='daily', fields=['close'], panel=False)\n\n# 获取分钟级数据\ndf = jq.get_price('000001.XSHE', start_date='2024-06-01 09:30:00',\n                   end_date='2024-06-01 15:00:00', frequency='1m')\n```\n\n### 获取最近N条数据\n\n```python\n# 获取最近20个交易日的收盘价\ndf = jq.get_bars('000001.XSHE', count=20, unit='1d', fields=['close', 'volume'])\n```\n\n\n### 财务数据\n\n```python\n# 查询财务指标\ndf = jq.get_fundamentals(\n    jq.query(\n        jq.valuation.code,\n        jq.valuation.market_cap,          # 总市值（亿元）\n        jq.valuation.pe_ratio,            # 市盈率\n        jq.valuation.pb_ratio,            # 市净率\n        jq.valuation.turnover_ratio,      # 换手率\n        jq.indicator.roe,                 # 净资产收益率（ROE）\n        jq.indicator.eps,                 # 每股收益\n        jq.indicator.revenue,             # 营业收入\n        jq.indicator.net_profit,          # 净利润\n    ).filter(\n        jq.valuation.pe_ratio > 0,        # 排除亏损股\n        jq.valuation.pe_ratio < 30,       # PE小于30\n        jq.valuation.market_cap > 100     # 市值大于100亿元\n    ).order_by(\n        jq.valuation.market_cap.desc()    # 按市值降序排列\n    ).limit(50),                          # 取前50\n    date='2024-06-30'\n)\nprint(df)\n```\n\n### 指数成分股\n\n```python\n# 获取沪深300成分股\nstocks = jq.get_index_stocks('000300.XSHG')\nprint(f'沪深300共 {len(stocks)} 只成分股')\n\n# 获取行业成分股\nstocks = jq.get_industry_stocks('I64')  # 银行业\n```\n\n### 行业分类\n\n```python\n# 获取股票所属行业\nindustry = jq.get_industry('000001.XSHE')\nprint(industry)\n\n# 获取申万一级行业列表\nindustries = jq.get_industries(name='sw_l1')\nprint(industries)\n```\n\n### 交易日历\n\n```python\n# 获取交易日列表\ndays = jq.get_trade_days(start_date='2024-01-01', end_date='2024-06-30')\n\n# 获取全部交易日\nall_days = jq.get_all_trade_days()\n```\n\n### 股票基本信息\n\n```python\n# 获取全部A股上市公司\nstocks = jq.get_all_securities(types=['stock'], date='2024-06-30')\nprint(f'A股总数: {len(stocks)}')\n\n# 获取单只股票信息\ninfo = jq.get_security_info('000001.XSHE')\nprint(f'名称: {info.display_name}, 上市日期: {info.start_date}')\n\n# 获取ST股票\nst_stocks = jq.get_extras('is_st', ['000001.XSHE'], start_date='2024-01-01', end_date='2024-06-30')\n```\n\n### 龙虎榜数据\n\n```python\n# 获取龙虎榜数据\ndf = jq.get_billboard_list(stock_list=None, start_date='2024-06-01', end_date='2024-06-30')\nprint(df.head())\n```\n\n### 融资融券数据\n\n```python\n# 获取融资融券汇总数据\ndf = jq.get_mtss('000001.XSHE', start_date='2024-01-01', end_date='2024-06-30')\nprint(df.head())\n```\n\n---\n\n## 交易函数（在线策略）\n\n### 按数量下单\n\n```python\n# 买入100股\norder('000001.XSHE', 100)\n\n# 卖出200股\norder('000001.XSHE', -200)\n\n# 限价买入\norder('000001.XSHE', 100, LimitOrderStyle(11.50))\n\n# 市价买入\norder('000001.XSHE', 100, MarketOrderStyle())\n```\n\n### 调仓到目标\n\n```python\n# 调仓到目标数量\norder_target('000001.XSHE', 1000)     # Adjust to hold 1000 shares\norder_target('000001.XSHE', 0)        # Liquidate position\n\n# 调仓到目标金额\norder_target_value('000001.XSHE', 100000)  # Adjust to 100,000 CNY market value\n\n# 调仓到目标比例（占总资产）\norder_target_percent('000001.XSHE', 0.3)   # Adjust to 30% of total assets\n```\n\n### 撤单\n\n```python\n# 获取未成交订单\nopen_orders = get_open_orders()\n# 撤销指定订单\ncancel_order(order_id)\n```\n\n\n---\n\n## 账户与持仓查询\n\n```python\ndef handle_data(context, data):\n    # 账户信息rmation\n    cash = context.portfolio.available_cash       # 可用资金\n    total = context.portfolio.total_value          # 总资产\n    positions_value = context.portfolio.positions_value  # 持仓市值\n\n    # 查询持仓\n    for stock, pos in context.portfolio.positions.items():\n        print(f'{stock}: Quantity={pos.total_amount}, '\n              f'Sellable={pos.closeable_amount}, '\n              f'Cost={pos.avg_cost:.2f}, '\n              f'Current price={pos.price:.2f}, '\n              f'Market value={pos.value:.2f}')\n```\n\n---\n\n## 定时任务\n\n```python\ndef initialize(context):\n    # 每日盘前执行\n    run_daily(before_market_open, time='before_open')\n    # 每日指定时间执行\n    run_daily(market_open, time='09:35')\n    run_daily(afternoon_check, time='14:50')\n    # 每周执行\n    run_weekly(weekly_rebalance, weekday=1, time='09:35')  # 每周一\n    # 每月执行\n    run_monthly(monthly_rebalance, monthday=1, time='09:35')  # 每月1号\n\ndef before_market_open(context):\n    log.info('Pre-market preparation')\n\ndef market_open(context):\n    log.info('Market open trading')\n```\n\n---\n\n## 风险管理\n\n```python\ndef initialize(context):\n    g.security = '000001.XSHE'\n    set_benchmark('000300.XSHG')\n\ndef handle_data(context, data):\n    security = g.security\n    # 获取当前价格\n    current_price = data[security].close\n\n    # 检查持仓盈亏\n    if security in context.portfolio.positions:\n        pos = context.portfolio.positions[security]\n        cost = pos.avg_cost\n        pnl_ratio = (current_price - cost) / cost\n\n        # 盈利10%止盈\n        if pnl_ratio >= 0.10:\n            order_target(security, 0)\n            log.info(f'Take profit: {security} gain {pnl_ratio:.2%}')\n        # 亏损5%止损\n        elif pnl_ratio <= -0.05:\n            order_target(security, 0)\n            log.info(f'Stop loss: {security} loss {pnl_ratio:.2%}')\n```\n\n---\n\n## 完整示例 — Multi-Factor Stock Selection Strategy\n\n```python\ndef initialize(context):\n    set_benchmark('000300.XSHG')\n    set_order_cost(OrderCost(open_tax=0, close_tax=0.001,\n                              open_commission=0.0003, close_commission=0.0003,\n                              min_commission=5), type='stock')\n    g.hold_num = 10  # 持股数量\n    # 每月第一个交易日调仓\n    run_monthly(rebalance, monthday=1, time='09:35')\n\ndef rebalance(context):\n    # 多因子选股\n    df = get_fundamentals(\n        query(\n            valuation.code,\n            valuation.pe_ratio,\n            valuation.pb_ratio,\n            valuation.market_cap,\n            indicator.roe,\n        ).filter(\n            valuation.pe_ratio > 5,\n            valuation.pe_ratio < 25,\n            valuation.pb_ratio > 0.5,\n            valuation.pb_ratio < 5,\n            indicator.roe > 10,\n            valuation.market_cap > 100,\n        ).order_by(\n            valuation.pe_ratio.asc()\n        ).limit(g.hold_num)\n    )\n\n    target_stocks = list(df['code'])\n    log.info(f'Selected {len(target_stocks)} stocks')\n\n    # 卖出不在目标列表中的股票\n    for stock in context.portfolio.positions:\n        if stock not in target_stocks:\n            order_target(stock, 0)\n\n    # 等权重买入目标股票\n    if target_stocks:\n        per_value = context.portfolio.total_value * 0.95 / len(target_stocks)\n        for stock in target_stocks:\n            order_target_value(stock, per_value)\n\ndef handle_data(context, data):\n    pass\n```\n\n\n---\n\n## 进阶示例\n\n### 行业轮动策略\n\n```python\ndef initialize(context):\n    set_benchmark('000300.XSHG')\n    g.hold_num = 5\n    g.industry_etfs = {\n        '512010.XSHG': '医药ETF',\n        '512880.XSHG': '证券ETF',\n        '512800.XSHG': '银行ETF',\n        '515030.XSHG': '新能源车ETF',\n        '159995.XSHE': '芯片ETF',\n        '512690.XSHG': '白酒ETF',\n        '510300.XSHG': '沪深300ETF',\n        '159915.XSHE': '创业板ETF',\n    }\n    run_monthly(rebalance, monthday=1, time='09:35')\n\ndef rebalance(context):\n    \"\"\"按20日动量排序，选取最强的前N只ETF\"\"\"\n    momentum = {}\n    for etf, name in g.industry_etfs.items():\n        df = attribute_history(etf, 20, '1d', ['close'])\n        if len(df) >= 20:\n            ret = (df['close'].iloc[-1] / df['close'].iloc[0]) - 1\n            momentum[etf] = ret\n\n    # 按动量排序\n    sorted_etfs = sorted(momentum.items(), key=lambda x: x[1], reverse=True)\n    targets = [etf for etf, _ in sorted_etfs[:g.hold_num]]\n    log.info(f'This month selected: {[g.industry_etfs[e] for e in targets]}')\n\n    # 卖出不在目标列表中的持仓\n    for stock in context.portfolio.positions:\n        if stock not in targets:\n            order_target(stock, 0)\n\n    # 等权重买入\n    per_value = context.portfolio.total_value * 0.95 / len(targets)\n    for etf in targets:\n        order_target_value(etf, per_value)\n\ndef handle_data(context, data):\n    pass\n```\n\n### 数据研究 — 全市场财务筛选\n\n```python\nimport jqdatasdk as jq\nimport pandas as pd\n\njq.auth('your_username', 'your_password')\n\n# 全市场财务筛选：低PE + 高ROE + 高成长\ndf = jq.get_fundamentals(\n    jq.query(\n        jq.valuation.code,\n        jq.valuation.pe_ratio,\n        jq.valuation.pb_ratio,\n        jq.valuation.market_cap,\n        jq.indicator.roe,\n        jq.indicator.inc_revenue_year_on_year,    # 营收同比增长率\n        jq.indicator.inc_net_profit_year_on_year,  # 净利润同比增长率\n    ).filter(\n        jq.valuation.pe_ratio > 5,\n        jq.valuation.pe_ratio < 20,\n        jq.indicator.roe > 15,\n        jq.indicator.inc_revenue_year_on_year > 10,\n        jq.indicator.inc_net_profit_year_on_year > 10,\n        jq.valuation.market_cap > 50,\n    ).order_by(\n        jq.indicator.roe.desc()\n    ).limit(30),\n    date='2024-06-30'\n)\n\nprint(f'筛选出 {len(df)} 只股票:')\nprint(df.to_string(index=False))\n\n# 导出为CSV\ndf.to_csv('selected_stocks.csv', index=False)\n```\n\n---\n\n## 使用技巧\n\n- 聚宽策略运行在云端 — 无需本地安装交易环境。\n- JQData本地SDK有免费每日数据额度，适合数据研究。\n- 在策略中使用 `attribute_history` 获取历史数据；在研究环境中使用 `get_price`。\n- 回测时使用 `set_order_cost` 设置真实手续费 — 默认手续费为0。\n- `g` 对象用于在函数之间持久化变量（类似Ptrade）。\n- 文档：https://www.joinquant.com/help/api/help\n\n---\n\n---\n\n## 🤖 AI Agent 高阶使用指南\n\n对于 AI Agent，在使用该量化/数据工具时应遵循以下高阶策略和最佳实践，以确保任务的高效完成：\n\n### 1. 数据校验与错误处理\n在获取数据或执行操作后，AI 应当主动检查返回的结果格式是否符合预期，以及是否存在缺失值（NaN）或空数据。\n* **示例策略**：在通过 API 获取数据框（DataFrame）后，使用 `if df.empty:` 进行校验；捕获 `Exception` 以防网络或接口错误导致进程崩溃。\n\n### 2. 多步组合分析\nAI 经常需要进行宏观经济分析或跨市场对比。应善于将当前接口与其他数据源或工具组合使用。\n* **示例策略**：先获取板块或指数的宏观数据，再筛选成分股，最后对具体标的进行深入的财务或技术面分析，形成完整的决策链条。\n\n### 3. 构建动态监控与日志\n对于交易和策略类任务，AI 可以定期拉取数据并建立监控机制。\n* **示例策略**：使用循环或定时任务检查特定标的的异动（如涨跌停、放量），并在发现满足条件的信号时输出结构化日志或触发预警。\n\n---\n\n## 社区与支持\n\n由 **大佬量化** 维护 — 量化交易教学与策略研发团队。\n\n微信客服: **bossquant1** · [Bilibili](https://space.bilibili.com/48693330) · 搜索 **大佬量化** — 微信公众号 / Bilibili / 抖音\n","topics":["量化交易","交易","研究"],"tags":{"latest":"1.0.2","backtest":"1.0.0","finance":"1.0.0","python":"1.0.0","quant":"1.0.0","research":"1.0.0"},"stats":{"comments":0,"downloads":879,"installsAllTime":33,"installsCurrent":2,"stars":1,"versions":3},"createdAt":1773364692025,"updatedAt":1778491869269},"latestVersion":{"version":"1.0.2","createdAt":1774260210387,"changelog":"- Added new demo files: demo_project/README.md and demo_project/demo.py.\n- These files provide example usage or demonstration code for the skill.","license":"MIT-0"},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"coderwpf","userId":"s170h18zjksf6t82v1asyztbz583hffb","displayName":"coderwpf","image":"https://avatars.githubusercontent.com/u/134041140?v=4"},"moderation":null}