尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python量化投资入门:基于聚宽jqdatasdk的双因子选股策略实战

Python量化投资入门:基于聚宽jqdatasdk的双因子选股策略实战 1. 从零开始为什么选择聚宽与jqdatasdk作为量化入门起点如果你对用Python做点自动化的事情感兴趣无论是爬虫、数据分析还是最近几年越来越火的量化投资大概率都听说过“聚宽”这个名字。它不是一个单纯的代码库而是一个集成了数据、研究环境、回测和模拟交易的量化平台。对于刚入门的新手或者想快速验证一个想法的老手来说聚宽社区提供的免费数据源和相对友好的API——jqdatasdk确实是一个极具诱惑力的起点。我最初接触量化时也走过不少弯路。要么是数据源太贵动辄几万一年个人开发者根本玩不起要么是数据质量参差不齐清洗数据的时间比写策略的时间还长再或者就是回测框架过于复杂配置环境就得折腾好几天。聚宽社区在一定程度上解决了这些痛点。它提供了一个“开箱即用”的环境你注册一个账号就能获得涵盖A股、基金、期货、期权等市场的历史行情和基本面数据虽然免费版有调用频率和数量的限制但对于学习和小规模策略验证来说完全够用。jqdatasdk就是这个数据宝库的钥匙。它是一个Python的软件开发工具包通过简单的pip install jqdatasdk就能安装然后用你的聚宽账号登录接下来就可以像调用本地函数一样获取到格式规整的Pandas DataFrame数据。这种体验对于习惯了用pandas和numpy做数据分析的人来说非常友好。你不需要关心数据从哪里下载、如何解析、如何对齐时间SDK都帮你做好了。所以这篇内容的核心就是想基于这个“简单易得”的工具手把手地带你走通一个完整的、简单的选股策略流程。这不是一个能让你立刻财务自由的“圣杯”策略它的目标很纯粹第一让你熟悉jqdatasdk的基本用法和数据获取逻辑第二让你理解一个量化策略从想法到回测结果的基本骨架第三在这个过程中分享我踩过的坑和积累的一些实用技巧。我们最终会构建一个基于“低市盈率”和“高净资产收益率”的简单双因子选股策略并看看它在历史数据上的表现。记住我们的重点是“过程”和“方法”而不是策略本身的神奇效果。2. 环境搭建与数据获取避开新手第一个大坑万事开头难量化也不例外。一个稳定、可复现的开发环境是后续所有工作的基础。很多人一上来就卡在环境配置上热情被消磨大半。这里我会结合最新的工具链给你一个清晰、避坑的配置方案。2.1 Python环境与IDE选择为什么我推荐VSCode首先确保你有一个独立的Python环境。我强烈建议使用conda或venv创建虚拟环境。这能避免不同项目间的包版本冲突。假设你已经安装了Python3.7及以上版本在命令行里创建一个新环境并激活它# 使用 conda conda create -n quant_env python3.9 conda activate quant_env # 或者使用 venv (Windows) python -m venv quant_env quant_env\Scripts\activate # 或者使用 venv (Mac/Linux) python3 -m venv quant_env source quant_env/bin/activate接下来是安装核心包。除了jqdatasdk我们还需要数据分析三件套和回测框架pip install jqdatasdk pandas numpy matplotlib # 回测框架我们使用聚宽自家的 easyquant它和jqdatasdk集成度最好 pip install easyquant关于IDE网上有很多“人狗大作战”式的争论。我的建议是对于量化开发VSCode是目前综合体验最好的选择之一。它轻量、免费、插件生态极其丰富。你需要安装几个关键插件Python由Microsoft官方提供提供代码补全、调试、linting等核心功能。Jupyter方便你以Notebook的形式进行探索性数据分析。很多时候策略的雏形就是在Notebook里一点点试出来的。Pylance更好的类型提示和代码补全。在VSCode中配置Python环境很简单打开命令面板CtrlShiftP输入“Python: Select Interpreter”然后选择你刚刚创建的虚拟环境如quant_env下的python.exe即可。这样你在这个工作区里运行、调试代码都会使用这个独立环境下的包。2.2 jqdatasdk的初始化与认证小心调用限制安装好之后第一件事就是登录认证。你需要先去聚宽官网注册账号然后在“我的账号”页面找到“认证信息”里面会有你的用户名通常是手机号或邮箱和密码。在你的Python脚本或Notebook中这样初始化import jqdatasdk as jq # 用你的真实账号信息替换 username your_username password your_password jq.auth(username, password) # 验证是否登录成功可以查询剩余调用条数 print(f剩余调用条数: {jq.get_query_count()})这里就是第一个经验点时刻关注你的调用条数。聚宽免费账号每天有固定的调用额度最初是100万条/天但政策可能变动请以官网为准。每次调用get_price(),get_fundamentals()等函数都会消耗条数。在开发阶段特别是循环获取大量股票历史数据时很容易一不小心就把额度用光。我的习惯是在代码关键节点打印get_query_count()。对于需要获取全市场历史数据的操作尽量在非交易时间如晚上进行并且做好本地缓存避免重复请求。使用jq.get_all_securities等一次性获取列表的函数而不是在循环中逐个获取股票信息。2.3 获取基础数据理解“证券代码”的格式数据是量化的血液。jqdatasdk获取数据非常直观。我们先获取当前A股所有股票列表# 获取所有A股股票列表类型为stock stocks jq.get_all_securities(types[stock], dateNone) # dateNone表示获取当前上市的 print(stocks.head()) print(f股票总数: {len(stocks)})你会看到一个DataFrame其中display_name是股票名称name是聚宽内部代码start_date和end_date是上市和退市日期。这里有一个至关重要的细节聚宽的证券代码格式是“代码.交易所”例如‘000001.XSHE’代表深交所的平安银行‘600519.XSHG’代表上交所的贵州茅台。在后续所有需要传入股票代码参数的函数中都必须使用这种格式。如果你有自己的股票代码列表如[‘000001’ ‘600519’]需要先将其转换为聚宽格式。获取单只或多只股票的历史行情数据# 获取贵州茅台2023年的日线数据 df jq.get_price(600519.XSHG, start_date2023-01-01, end_date2023-12-31, frequencydaily, fields[open, close, high, low, volume, money]) print(df.head())get_price函数非常强大frequency参数可以指定daily日线、60m60分钟线、30m等。fields参数指定需要哪些字段。返回的数据已经是按时间排序的DataFrame索引是datetime类型直接可用于分析。注意关于复权价格。默认情况下get_price获取的是后复权价格这对于计算长期收益率是合理的。但如果你需要计算技术指标如均线有时会使用前复权价格以避免未来函数。get_price函数可以通过fq参数指定复权方式如fqpre获取前复权价格。务必根据你的策略逻辑谨慎选择。3. 构建一个简单的双因子选股策略逻辑与实现有了数据我们就可以开始构建策略了。一个完整的策略至少包含三部分选股逻辑、买卖规则、仓位管理。为了简化我们这个策略将聚焦于选股逻辑并假设在每月第一个交易日调仓等权重买入选出的股票持有到下个调仓日。3.1 策略核心思想价值因子的朴素应用我们的策略思想来源于传统的价值投资理念选取两个常见的基本面因子低市盈率市盈率PE衡量公司市值与其盈利能力的比例。通常认为较低的PE可能代表股票被低估当然也有可能是公司基本面恶化。高净资产收益率净资产收益率ROE衡量公司利用股东权益创造利润的效率。高的ROE通常意味着公司有较强的盈利能力和竞争优势。策略逻辑很简单在每个调仓日计算全市场所有股票的PE和ROE然后筛选出PE低于某个阈值例如行业均值或市场均值且ROE高于某个阈值的股票最后从中选择排名靠前的若干只构成投资组合。为什么是这两个因子首先它们的数据容易获取且含义直观适合教学。其次虽然单一因子效果不稳定但简单的多因子结合能过滤掉一些“价值陷阱”比如PE低是因为业绩持续下滑。当然这个策略非常粗糙没有考虑行业中性、市值加权、因子衰减等复杂问题但这正是我们学习的起点——先搭起骨架再慢慢填充血肉。3.2 获取基本面数据get_fundamentals的用法jqdatasdk提供了get_fundamentals函数来获取财务数据。财务数据是季报、年报数据发布有滞后性。在回测中我们必须使用“历史时点”的数据即不能使用当时还未发布的数据避免未来函数。聚宽的数据已经做了时点对齐处理。我们需要获取两个表的数据valuation估值表包含PE等和indicator指标表包含ROE等。import pandas as pd # 假设我们的调仓日是2023-06-01 date 2023-06-01 # 1. 获取全市场股票代码聚宽格式 all_stocks jq.get_all_securities(types[stock], datedate).index.tolist() # 注意这里需要过滤掉可能刚上市或者已经退市的简单起见我们直接用这个列表但实际应用中需要更精细处理 # 2. 获取估值数据 (PE, PB等) # q对象是查询对象可以指定查询的表、字段、过滤条件和日期 q jq.query(jq.valuation.code, jq.valuation.pe_ratio).filter(jq.valuation.code.in_(all_stocks)) df_valuation jq.get_fundamentals(q, datedate) df_valuation.set_index(code, inplaceTrue) # 3. 获取指标数据 (ROE等) q jq.query(jq.indicator.code, jq.indicator.roe).filter(jq.indicator.code.in_(all_stocks)) df_indicator jq.get_fundamentals(q, datedate) df_indicator.set_index(code, inplaceTrue) # 4. 合并两个数据框 df_factors pd.concat([df_valuation, df_indicator], axis1, joininner) # 使用inner join只保留同时有PE和ROE数据的股票 print(df_factors.head()) print(f合并后股票数量: {len(df_factors)})这里有几个关键点jq.query的使用它类似于SQL的查询构建器。jq.valuation.code指定表和字段。.filter()用于过滤这里我们过滤代码在all_stocks列表中的股票。.in_()是聚宽提供的过滤方法。日期参数date参数至关重要它决定了我们获取的是哪个财务报告期的数据。对于2023-06-01获取的是截至当时已发布的最新财务数据可能是2023年一季报。数据合并我们使用pd.concat和join‘inner’来合并数据。inner join确保我们只分析那些同时具有PE和ROE数据的股票避免缺失值问题。数据清洗财务数据中常有异常值比如PE为负或极大。我们需要处理它们。# 数据清洗处理缺失值和异常值 # 剔除PE为负或无穷大的股票通常代表亏损或数据异常 df_factors_cleaned df_factors[(df_factors[pe_ratio] 0) (df_factors[pe_ratio] 200)] # 假设PE大于200为异常 # 剔除ROE为缺失或极端的值 df_factors_cleaned df_factors_cleaned[df_factors_cleaned[roe].notna()] # 也可以根据需要剔除ST、停牌股票需要额外获取状态数据这里暂不展开3.3 因子合成与选股排序与筛选清洗完数据后我们开始实施选股逻辑。我们的目标是PE越低越好ROE越高越好。但两个因子的量纲和方向不同不能直接相加。常见的处理方法是分别排序然后取综合排名。# 1. 对PE进行升序排名PE越小排名越靠前值越小越好 df_factors_cleaned[pe_rank] df_factors_cleaned[pe_ratio].rank(methodfirst) # 2. 对ROE进行降序排名ROE越大排名越靠前值越大越好 df_factors_cleaned[roe_rank] df_factors_cleaned[roe].rank(methodfirst, ascendingFalse) # 3. 计算综合排名这里使用简单等权相加 df_factors_cleaned[composite_rank] df_factors_cleaned[pe_rank] df_factors_cleaned[roe_rank] # 4. 按综合排名升序排序选出前N名 N 10 selected_stocks df_factors_cleaned.sort_values(composite_rank).head(N).index.tolist() print(f在 {date} 选出的股票代码{selected_stocks})这样我们就得到了在2023年6月1日基于当时最新财务数据选出的10只股票。这个选股函数就是我们策略的核心。接下来我们需要把它放到一个回测框架里让它在一段历史时期内每月自动执行一次并计算最终的收益。4. 使用EasyQuant进行策略回测从想法到净值曲线策略逻辑写好了但它到底有没有用这就需要回测来验证。回测就是在历史数据上模拟策略的运行。这里我们使用聚宽旗下的easyquant库它和jqdatasdk同源集成简单。4.1 回测框架的基本概念与初始化easyquant将策略抽象为一个类我们需要继承EasyTrader类并实现几个关键方法。首先安装并导入from easyquant import EasyTrader, BacktestEngine, Market import datetime然后定义我们的策略类。我们需要指定回测的起始日期、结束日期、初始资金等参数。class DualFactorStrategy(EasyTrader): def __init__(self, name, initial_cash1000000): super().__init__(name, initial_cash) # 策略参数 self.select_stock_count 10 # 每次选股数量 self.rebalance_period month # 调仓周期月 self.last_rebalance_date None # 记录上次调仓日期 def init(self): 策略初始化在整个回测开始时执行一次 print(f策略 {self.name} 初始化初始资金 {self.initial_cash}) # 可以在这里预加载一些数据但注意不要使用未来数据 # 例如预加载所有需要用到的基础股票池 self.all_stocks_pool [] # 这里先留空在实际选股时动态获取 def handle_data(self, data, current_dt): 每个交易日都会调用data是当前日期的市场数据快照 # 检查是否到达调仓日这里简单处理为每月第一个交易日 if self.last_rebalance_date is None or (current_dt.month ! self.last_rebalance_date.month): self.rebalance_portfolio(current_dt) self.last_rebalance_date current_dtinit方法在回测开始时运行一次适合做一些一次性准备工作。handle_data方法是核心它在回测的每一个交易日都会被调用参数current_dt就是当前的交易日日期data包含了当前交易日所有标的的行情数据开盘、收盘、最高、最低、成交量等。我们的策略逻辑判断是否调仓、如何调仓就写在这里。4.2 实现调仓逻辑卖出旧组合与买入新组合调仓逻辑rebalance_portfolio是整个策略执行的关键。它需要做以下几件事获取当前日期可用的股票列表剔除停牌、ST、上市不满一定时间的股票等。运行我们的选股函数得到当期要买入的股票列表。卖出当前持有的、不在新名单中的股票。等权重买入新选出的股票。由于在回测环境中我们无法直接调用jq.get_fundamentals因为需要网络和认证所以我们需要在策略初始化时或者通过其他方式预先准备好历史基本面数据。这是一个非常重要的实战经验点在回测中所有数据都必须是“已知”的不能实时联网查询。通常的做法是在回测开始前一次性批量下载好所需时间段内所有调仓日的基本面数据存储为本地文件如CSV或HDF5然后在策略中读取。为了简化示例我们假设已经有一个函数get_factors_on_date(date)它能返回指定日期经过清洗和排名后的股票DataFrame。在实际项目中这个函数内部可能是读取本地预处理好的数据。def rebalance_portfolio(self, current_dt): 调仓函数 print(f\n 调仓日{current_dt.date()} ) # 1. 获取当前持仓 current_positions self.get_positions() # 返回一个字典{证券代码: 持仓数量} # 2. 运行选股模型获取本期目标股票列表 target_stocks self.select_stocks(current_dt) # 这是一个需要我们自己实现的函数 if not target_stocks: print(本期未选出任何股票保持空仓或持仓不变。) return print(f本期选中股票: {target_stocks}) # 3. 卖出当前持有但不在目标列表中的股票 for stock_code, amount in current_positions.items(): if stock_code not in target_stocks: # 市价卖出全部持仓 order_success self.order_target(stock_code, 0) if order_success: print(f 卖出 {stock_code}, 数量 {amount}) # 4. 等权重买入目标股票 # 计算每只股票应分配的资金预留一点现金以防无法全部成交 available_cash self.get_cash() * 0.99 # 使用99%的可用现金 cash_per_stock available_cash / len(target_stocks) for stock_code in target_stocks: # 获取当前价格这里用当天的开盘价作为买入价近似 current_price data[stock_code].open # 注意这里的data需要从handle_data传入或通过其他方式获取 if pd.isna(current_price) or current_price 0: print(f 股票 {stock_code} 价格无效跳过。) continue # 计算应买入数量 (以100股为单位A股最小交易单位是1手100股) amount_to_buy int(cash_per_stock / current_price / 100) * 100 if amount_to_buy 0: order_success self.order(stock_code, amount_to_buy) if order_success: print(f 买入 {stock_code}, 价格~{current_price:.2f}, 数量 {amount_to_buy})这里涉及几个easyquant的内置方法self.get_positions(): 获取当前持仓。self.order_target(stock_code, target_amount): 下单使该股票的持仓数量达到目标数量。设为0就是清仓。self.order(stock_code, amount): 按指定数量下单正数为买入负数为卖出。self.get_cash(): 获取当前可用现金。关键细节交易价格与成交量。在回测中我们通常用data[stock_code].open开盘价来近似模拟买入。更严谨的做法是使用data[stock_code].close收盘价并考虑能否全部成交。easyquant的order方法内部会处理成交逻辑但默认可能以收盘价成交。你需要仔细阅读回测引擎的文档理解其成交假设是开盘价、收盘价还是区间均价是否考虑滑点和手续费。手续费是回测中必须考虑的因素它可能吞噬掉微薄的利润。easyquant允许你设置手续费率。4.3 运行回测与结果分析实现了策略类之后我们就可以配置回测引擎并运行了。# 设置回测参数 start_date 2020-01-01 end_date 2023-12-31 initial_cash 1000000.0 # 创建策略实例 strategy DualFactorStrategy(name双因子选股策略, initial_cashinitial_cash) # 创建回测引擎 engine BacktestEngine( strategystrategy, start_datestart_date, end_dateend_date, initial_cashinitial_cash, benchmark000300.XSHG, # 基准这里用沪深300指数 commission0.0003, # 佣金万三 slippage0.001, # 滑点千分之一 ) # 运行回测 engine.run() # 获取回测结果 results engine.get_results() print(\n 回测绩效摘要 ) print(f初始资金: {initial_cash}) print(f最终资产: {results[total_value][-1]:.2f}) print(f总收益率: {(results[total_value][-1]/initial_cash -1)*100:.2f}%) print(f年化收益率: {results[annual_return]*100:.2f}%) print(f最大回撤: {results[max_drawdown]*100:.2f}%) print(f夏普比率: {results[sharpe]:.2f})运行后engine会输出交易日志并生成一系列绩效指标和图表。你需要重点关注总收益率/年化收益率策略赚了多少钱。基准收益率同期沪深300指数的表现用于对比策略是否跑赢了市场。最大回撤策略资产从高点回落的最大幅度衡量风险。一个回撤过大的策略实战中很难坚持。夏普比率衡量每承受一单位风险能获得多少超额回报。越高越好。交易次数和胜率看看策略是频繁交易还是低频交易以及盈利交易的占比。easyquant应该能生成净值曲线对比图策略 vs 基准以及持仓分布、月度收益等图表。仔细分析这些图表净值曲线是否大部分时间在基准之上回撤发生在什么时候对应当时市场是什么情况例如股灾、行业利空策略的收益是来自少数几次大赚还是稳定的小幅盈利5. 策略的缺陷、优化与实战思考回测结果出来了很可能你会发现这个简单的双因子策略表现平平甚至跑不赢指数。这完全正常也恰恰是量化最有价值的部分通过回测证伪一个想法和证实它同样重要。现在我们来拆解这个策略的诸多问题并探讨优化方向。这才是从“玩具策略”走向“可考虑实盘”的关键一步。5.1 当前策略的致命缺陷未来函数这是新手最容易犯也最致命的错误。在我们的示例中get_fundamentals(date)似乎解决了时点问题但财务数据的发布有严重滞后。上市公司一季报通常在4月份发布年报在次年4月前发布。如果你在2023年6月1日调仓使用的是“截至2023年6月1日已发布的最新财务数据”这可能是2023年一季报数据截止3月31日。这看起来没问题。但在实盘中2023年6月1日当天你根本拿不到当天收盘后甚至当天的最新财务数据你只能用到上一个报告期已经发布的数据。因此在回测中我们必须将调仓日使用的财务数据日期再向前推一个报告期。例如对于6月1日调仓应该使用4月30日一季报发布后的数据甚至更保守地用上年年报的数据。这需要在数据获取函数中做精细的日期偏移处理。幸存者偏差我们的股票池jq.get_all_securities(datedate)获取的是在date那天还存在的股票。这意味着那些在date之前已经退市的股票不会被包含进来。回测时我们只用了“活下来”的股票的数据这会导致策略表现被高估因为现实中你可能买到了后来退市的股票。更严谨的做法是使用“历史股票池”即获取在date那天及之前上市且尚未退市的股票列表。这需要更复杂的数据处理。忽略交易成本示例中虽然设置了佣金和滑点但可能还不够。印花税、过户费、冲击成本大额订单导致的价格不利变动在频繁交易或小市值股票交易中影响显著。回测中设置的费率应尽可能接近实盘。粗糙的因子处理我们简单地对PE和ROE进行了排名和相加。这里有很多问题极值处理PE为负或极高的股票我们只是简单剔除或截断方法可能不够科学。行业中性不同行业的PE和ROE平均水平差异巨大。金融股的PE通常很低科技股的PE可能很高。简单全市场排名会导致选出的股票大量集中在某个特定行业无法分散风险。优化方法是先分行业排名再进行行业间整合。因子标准化直接排名Rank是一种标准化方法但也可以使用Z-Score减去均值除以标准差等方法。因子加权我们给PE和ROE排名赋予了相等的权重。如何确定最优权重可以通过历史数据回测来优化但要小心过拟合。简单的仓位管理等权重分配是最简单的方式但没有考虑波动率、市值等因素。更高级的仓位管理方法如风险平价、均值-方差优化等可以尝试引入。5.2 可行的优化方向与进阶步骤数据层面构建本地数据仓库不要每次回测都联网调用jqdatasdk。编写脚本定期或一次性将所需的历史行情数据、财务数据、股票列表数据下载到本地数据库如SQLite或文件中如Parquet格式。回测时从本地读取速度极快且不受网络和调用限制影响。精确处理报告期滞后编写一个工具函数输入一个交易日期自动返回该日期应该使用的财务报告期。例如规则可以是“使用已发布的最新季报且其报告期截止日至少在一个月以前”。处理除权除息确保使用的价格序列是复权后的并且分红送股信息准确这会影响收益率计算。策略逻辑层面引入更多因子除了PE和ROE可以加入市净率PB、股息率dividend_yield、营收增长率、利润增长率、动量因子、波动率因子等。但因子不是越多越好要避免多重共线性。因子合成优化尝试不同的因子标准化方法Rank, Z-Score, 百分位和合成方法等权、IC加权、ICIR加权。可以使用scikit-learn等库进行更复杂的处理。行业与市值中性化在选股前对因子进行行业和市值调整确保选股结果在不同行业和市值板块间相对均衡。设置更严格的筛选条件例如要求上市时间超过一定年限如3年非ST/*ST股票日均成交额大于一定阈值保证流动性。回测框架层面换用更强大的回测引擎easyquant适合入门和快速验证。对于更复杂的策略如日内高频、多空对冲可以考虑Backtrader、Zipline国内有Ricequant的移植版或PyAlgoTrade。这些框架在事件驱动、订单撮合、风险管理上更精细。进行参数敏感性分析我们的策略有参数如选股数量N、调仓周期。不要只用一个参数组合回测。可以进行网格搜索看看策略表现是否对某个参数特别敏感。如果稍微改变参数绩效就大幅下滑说明策略可能不稳定。进行样本外测试将历史数据分为两段前一段如2010-2018用于策略开发和参数优化训练集后一段如2019-2023用于测试测试集。如果策略在测试集上表现远差于训练集那就是严重的过拟合。5.3 从回测到模拟盘的务实建议如果你经过多轮优化和测试策略在样本外数据上依然表现稳健那么可以考虑推向模拟盘。聚宽平台本身就提供模拟交易功能。在模拟盘中你会遇到回测中无法完全模拟的问题订单成交问题回测中假设订单全部以开盘价或收盘价成交。实盘模拟盘中可能因为涨跌停、流动性不足而无法成交或只能部分成交。数据实时性回测是“上帝视角”所有数据已知。实盘中数据是逐笔或逐秒到来的你的策略需要能处理实时数据流。策略运行稳定性你的代码需要7x24小时稳定运行处理好网络中断、程序异常、数据缺失等各种边缘情况。我的建议是先用模拟盘跑至少3-6个月观察策略在完全实盘环境下的表现与回测结果进行对比。同时记录下所有与预期不符的交易分析原因。这个过程能帮你发现策略逻辑、风险控制、系统实现上的诸多漏洞。最后我想强调一点心态基于公开数据的简单因子选股在当今高度有效的A股市场要获得持续的超额收益非常困难。这个项目最大的价值不在于创造出一个赚钱的策略而在于为你搭建了一个完整的量化研究流程从数据获取、处理到因子研究、策略构建再到回测分析、优化改进。你掌握了这套方法就可以去探索更多有趣的领域比如事件驱动财报发布、高管增减持、另类数据网络舆情、供应链信息、或者更复杂的机器学习模型。这条路很长但每一步都算数。希望这个基于聚宽和jqdatasdk的简单起点能成为你量化之旅的一块坚实垫脚石。
返回列表