Skip to content

聚宽 API

https://www.joinquant.com/help/api/help?name=api

内置函数

策略基本结构

  1. initialize
  2. run_xxx
  3. handle_data
  4. before_trading_start 开盘前运行
  5. after_trading_end 开盘后运行

同一个时间点,总是先运行 run_xxx 指定的函数,然后是 before_trading_start , handle_data 和 after_trading_end

运行时间

  1. run_daily(xxx, time="every_bar") 每日分钟
  2. run_daily 每日运行。
  3. run_weekly 每周执行
  4. run_monthly 每月执行

需要注意的是,run_weekly 和 run_monthly 第一次运行的时间如果与指定的日期不一致,也会执行。例如 run_weekly(policy_adjustment, weekday=1, time="9:30") 虽然指定每周一执行,但是如果执行的第一天不是周一,也会执行,下一次执行开始会按照正常的时间执行。

handle_data

handle_data 是按天循环时,操作都是在 9:30 执行。 这么说的话, handle_data 中获取的 last_price 基本等于开盘价

py
handle_data(context, data)

获取收盘价与均价示例:

py
def handle_data(context, data):
    # 用来写每天(实际上是每个周期内)循环要做什么
    # 用法: 变量 = data[股票代码].close
    last_price = data[g.security].close   # 取得最近日收盘价,命名为last_price
    # 用法: 变量 = data[股票代码].mavg(天数, 'close')
    average_price = data[g.security].mavg(20, 'close')

行业股、概念股

从行业中选股

python
get_industry_stocks()

从概念中选股

python
get_concept_stocks()

get_all_securities 获取所有股票数据

通过以下方法来获取平台支持的所有股票数据:

python
get_all_securities(types = ['stock'])

其中,types 默认值是 stock,返回值是一个 pandas.DataFrame 类型,其中包含有:

  • display_name 中文名称
  • name 缩写简称
  • start_date 上市日期
  • end_date 退市日期
  • type 类型

下单函数

常用的下单函数有四个,使用方法和 order() 差不多:

  1. order(security,amount),刚刚细讲过,含义是买卖一定数量的(单位:股)股票。security 是股票代码,amount 是数量,amount 为负数时就是代表卖出了,需要知道的是,国内股票买入最小单位是 1 手即 100 股。例子如下:
python
  # 买入 100 股平安银行
  order("000001.XSHE",100)
  # 卖出 100 股平安银行
  order("000001.XSHE",-100)
  1. order_target(security,amount),含义是通过买卖,将股票仓位调整至一定数量(单位:股)。security 是股票代码,amount 是数量。例子如下:
python
  # 调整平安银行的持股数量至 1000 股
  # 即,如果目前平安银行的持股数量低于 1000 股就买入,高于就是卖出,不高不低就不动。
  order_target("000001.XSHE",1000)
  1. order_value(security,value),含义是买卖一定价值量(单位:元)股票。security 是股票代码,value 是价值量。value 为负数时就是代表卖出了。例子如下:
python
  # 买入 10000 元的平安银行
  # 如果当前股票市价是 10 元,则代表买入 1000 股
  # 如果除不开系统会自动调整成相近的合理数量。卖出时也会。
  order_value("000001.XSHE",10000)
  # 卖出 10000 元的平安银行
  # 如果当前股票市价是 100 元,则代表卖出 100 股
  order_value("000001.XSHE",-10000)
  1. order_target_value(security,value),通过买卖,将股票仓位调整至一定价值量(单位:元)。security 是股票代码,value 是价值量。例子如下:
python
  # 调整平安银行的持股价值量至 10000 元
  # 即,如果目前平安银行的持股价值量(按股票市价算)低于 10000 元就买入,高于就是卖出,不高不低就不动。
  order_target_value("000001.XSHE",10000)

读写私有文件

python
write_file("test.txt", "hello world")
print(read_file("test.txt"))
  • write_file 是覆盖编码,多次修改会覆盖。
  • 两个函数是同步的。

内置属性

  1. g 全局变量存储上下文
  2. context 执行上下文,存储回测开始、结束时间,钱余额、持仓成本等数据

Context

context 中的数据取用方法:

python
  # 打印可用资金
  print(context.portfolio.available_cash)
  # 打印运行频率
  print(context.run_params.frequency)
  # 打印当前单位时间的开始时间
  print(context.current_dt)

  # 执行后日志内容如下
  # 1000000.0
  # day
  # 2016-06-01 09:30:00

context.portfolio.positions 账户信息,是一个 dict

python
  # context.portfolio.positions 的含义是仓位信息,所以为了让它有数据,需要在取之前买入并持有股票。

  # 初始化量化函数
  def initialize(context):
      run_daily(period,time='every_bar') # 每分钟执行一次
      g.security = '000001.XSHE'

  def period(context):
      order(g.security, 100)
      # 打印所有键
      print(context.portfolio.positions.keys())
      # 打印所有值
      print(context.portfolio.positions.values())
      # 打印 g.security 的开仓均价
      print(context.portfolio.positions[g.security].avg_cost)

  # 执行后日志内容如下
  # ['000001.XSHE']
  # [UserPosition({'avg_cost': 8.539999999999997, 'security': '000001.XSHE', 'closeable_amount': 0, 'price': 8.53, 'total_amount': 100})]
  # 8.54

常用的 context 数据写法如下:

  • 当前时间 context.current_dt
  • 当前时间的 年-月-日 的字符串格式 context.current_dt.strftime("%Y-%m-%d")
  • 前一个交易日 context.previous_date
  • 当前可用资金 context.portfolio.available_cash
  • 获取总资产 context.portfolio.total_value
  • 持仓价值 context.portfolio.positions_value
  • 累计收益 context.portfolio.returns
  • 当前持有股票 context.portfolio.positions.keys()
  • 当前持有的某股票的开仓均价 context.portfolio.positions['xxxxxx.xxxx'].avg_cost
  • 当前持有的某股票的可卖持仓量 context.portfolio.positions['xxxxxx.xxxx'].closeable_amount

聚宽原子化字段

get_current_data

获取当前的时间数据。只有一天的数据???

返回值

  • last_price : 最新价
  • high_limit: 涨停价
  • low_limit: 跌停价
  • day_open: 当天开盘价
  • paused: 是否停止或者暂停了交易,当停牌、未上市或者退市后返回 True
  • is_st: 是否是 ST(包括 ST, *ST),是则返回 True,否则返回 False
  • name: 股票现在的名称,可以用这个来判断股票当天是否是 ST, *ST, 是否快要退市
  • industry_code: 股票现在所属行业代码,参见 行业概念数据

Context

  • previous_date 前一个交易日,[datetime.date]对象, 注意, 这是一个日期, 是 date, 而不是 datetime
  • current_dt: 当前单位时间的开始时间,[datetime.datetime]对象

query_object

https://www.joinquant.com/view/community/detail/433d0e9ed9fed11fc9f7772eab8d9376

Pandas

  • fillna 补全
  • rolling 计算均值

attribute_history

python
volume5d = [
    attribute_history(stock, 1200, "1m", "volume",
                      df=False)["volume"].sum()
    for stock in rank_stock_list["code"]
]

中国 A 股市场 在中国 A 股市场,每个交易日的交易时间分为两个阶段: 上午:9:30 - 11:30,时长为 2 个小时,即 120 分钟。 下午:13:00 - 15:00,时长为 2 个小时,即 120 分钟。 所以,中国 A 股市场一个交易日的总交易时长是 (120 + 120=240) 分钟。 那么 1200 分钟包含的交易日数量为:(1200\div240 = 5)(个)