作为一个刚接触量化交易的新手,我最初被各种专业术语和复杂框架搞得晕头转向。直到发现了JoinQuant这个平台,才真正找到了入门的方向。JoinQuant最大的优势在于它把Python编程、金融数据和回测引擎完美整合在一起,让你可以专注于策略逻辑本身,而不需要操心数据获取、交易接口这些底层问题。
我特别喜欢它的零门槛设计:你甚至不需要安装任何软件,打开浏览器就能开始写策略。平台提供了完整的Python运行环境和丰富的金融数据,从股票、基金到期货应有尽有。最棒的是,所有基础数据都是免费的,这对初学者来说简直是福音。
记得我第一次在JoinQuant上跑通一个简单策略时的兴奋感——只用不到50行代码,就实现了一个完整的双均线策略,还能看到详细的回测报告。这种即时反馈特别适合新手建立信心。相比其他需要自己搭建环境的平台,JoinQuant让你跳过了最痛苦的配置阶段,直接进入策略开发的核心环节。
首先访问JoinQuant官网完成注册,整个过程只需要邮箱验证,非常快捷。登录后你会看到几个核心功能区:
建议新手先花10分钟熟悉界面布局。平台左侧的导航栏非常清晰,所有功能都能在三步内找到。特别提醒关注"帮助文档"和"API文档",这两个是后续开发中会频繁用到的资源。
虽然JoinQuant提供了云端环境,但本地开发会更灵活。我推荐安装Anaconda来管理Python环境:
bash复制conda create -n jqenv python=3.8
conda activate jqenv
pip install jqdatasdk
安装完成后,需要在JoinQuant账号设置中获取API Key,然后通过以下代码测试连接:
python复制from jqdatasdk import *
auth('你的账号', '你的密码') # 或者使用API Key
print(get_query_count()) # 查看剩余数据查询次数
双均线策略是量化入门的经典案例,它的核心思想很简单:
这个策略虽然简单,但包含了量化交易的所有关键要素:数据获取、信号生成、交易执行。在JoinQuant上实现它只需要四个步骤:
python复制from jqdatasdk import *
import pandas as pd
# 初始化函数,设定基准等
def initialize(context):
set_benchmark('000300.XSHG') # 沪深300作为基准
set_option('use_real_price', True) # 使用真实价格
g.security = '600519.XSHG' # 贵州茅台
g.short_window = 5 # 短期均线周期
g.long_window = 20 # 长期均线周期
# 每个单位时间(如果按天回测则每日)调用一次
def handle_data(context, data):
# 获取历史数据
prices = attribute_history(g.security, g.long_window+1, '1d', ['close'])
close_prices = prices['close'].values
# 计算均线
short_ma = close_prices[-g.short_window:].mean()
long_ma = close_prices.mean()
# 获取当前持仓
cur_position = context.portfolio.positions[g.security].amount
# 交易逻辑
cash = context.portfolio.available_cash
if short_ma > long_ma and cur_position == 0:
order_value(g.security, cash) # 全仓买入
elif short_ma < long_ma and cur_position > 0:
order_target(g.security, 0) # 清仓卖出
这段代码虽然简短,但已经是一个完整的交易策略。我建议新手逐行理解每个函数的作用,特别是attribute_history这个数据获取接口,它是JoinQuant特有的高效数据查询方法。
在JoinQuant上运行回测非常简单,点击"运行回测"按钮后,平台会自动生成详细的报告。重点关注这几个指标:
第一次回测时,我的双均线策略在贵州茅台上年化只有8%,最大回撤却达到25%。这说明策略还有很大优化空间。JoinQuant的优秀之处在于,它允许你直接点击报告中的任意时间点,查看当时的持仓和市场情况,这对调试策略非常有帮助。
根据我的经验,新手可以从以下几个角度优化策略:
这里给出一个加入止损的改进版本:
python复制def handle_data(context, data):
# ...前面代码不变...
# 获取当前持仓成本
if g.security in context.portfolio.positions:
cost = context.portfolio.positions[g.security].avg_cost
current_price = data[g.security].close
# 止损逻辑:亏损超过8%时平仓
if current_price < cost * 0.92:
order_target(g.security, 0)
return
# 原有交易逻辑...
单一股票策略容易受到个股特殊性的影响。更稳健的做法是在一组股票上运行策略,这就是股票轮动。基本原理是:
在JoinQuant中,我们可以利用get_index_stocks获取指数成分股,然后用get_fundamentals查询基本面数据。下面是一个小市值轮动策略的框架:
python复制def initialize(context):
# 设置轮动频率和股票数量
g.period = 5 # 每5天轮动一次
g.stocknum = 3 # 持有3只股票
g.days = 0 # 运行天数计数器
def handle_data(context, data):
g.days += 1
if g.days % g.period != 0:
return
# 获取小市值股票列表
q = query(
valuation.code, valuation.market_cap
).order_by(
valuation.market_cap.asc()
).limit(g.stocknum)
df = get_fundamentals(q)
buylist = list(df['code'])
# 调整持仓
adjust_position(context, buylist)
实盘交易需要考虑更多现实约束,JoinQuant提供了丰富的工具来处理这些问题:
get_trading_status检查股票状态get_price_limit获取涨跌停价一个完整的轮动策略还需要加入这些风控元素,这里展示如何处理停牌股票:
python复制def filter_suspended(stock_list):
df = get_trading_status(stock_list)
return [s for s in stock_list if df[s]['is_trading']]
当策略通过历史回测验证后,就可以进入模拟交易阶段。JoinQuant的模拟交易功能直接连接实时行情,用真实市场环境测试策略。设置步骤很简单:
我建议先用小资金测试,重点关注策略在实盘环境下的执行情况。常见问题包括:
经过几个策略的实盘测试,我总结了这些经验教训:
JoinQuant提供了完善的日志功能,建议在策略中加入详细的日志记录,方便事后分析:
python复制log.info(f"当前时间:{context.current_dt}")
log.info(f"可用资金:{context.portfolio.available_cash}")
for stock in context.portfolio.positions:
pos = context.portfolio.positions[stock]
log.info(f"持仓:{stock},数量:{pos.amount},成本:{pos.avg_cost}")
掌握基础策略后,你可以继续探索JoinQuant提供的丰富资源:
我个人的学习路径是这样的:
对于想深入学习的开发者,JoinQuant的API文档非常全面,涵盖了:
最后提醒一点,量化交易不是一夜暴富的捷径。我的第一个策略迭代了17个版本才实现稳定盈利。JoinQuant降低了技术门槛,但市场理解和策略创新才是长期成功的关键。保持耐心,持续学习,你会逐渐发现这个领域的乐趣所在。