聚宽 API
内置函数
策略基本结构
- initialize
- run_xxx
- handle_data
- before_trading_start 开盘前运行
- after_trading_end 开盘后运行
同一个时间点,总是先运行 run_xxx 指定的函数,然后是 before_trading_start , handle_data 和 after_trading_end
运行时间
- run_daily(xxx, time="every_bar") 每日分钟
- run_daily 每日运行。
- run_weekly 每周执行
- 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 基本等于开盘价
handle_data(context, data)获取收盘价与均价示例:
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')行业股、概念股
从行业中选股
get_industry_stocks()从概念中选股
get_concept_stocks()get_all_securities 获取所有股票数据
通过以下方法来获取平台支持的所有股票数据:
get_all_securities(types = ['stock'])其中,types 默认值是 stock,返回值是一个 pandas.DataFrame 类型,其中包含有:
- display_name 中文名称
- name 缩写简称
- start_date 上市日期
- end_date 退市日期
- type 类型
下单函数
常用的下单函数有四个,使用方法和 order() 差不多:
- order(security,amount),刚刚细讲过,含义是买卖一定数量的(单位:股)股票。security 是股票代码,amount 是数量,amount 为负数时就是代表卖出了,需要知道的是,国内股票买入最小单位是 1 手即 100 股。例子如下:
# 买入 100 股平安银行
order("000001.XSHE",100)
# 卖出 100 股平安银行
order("000001.XSHE",-100)- order_target(security,amount),含义是通过买卖,将股票仓位调整至一定数量(单位:股)。security 是股票代码,amount 是数量。例子如下:
# 调整平安银行的持股数量至 1000 股
# 即,如果目前平安银行的持股数量低于 1000 股就买入,高于就是卖出,不高不低就不动。
order_target("000001.XSHE",1000)- order_value(security,value),含义是买卖一定价值量(单位:元)股票。security 是股票代码,value 是价值量。value 为负数时就是代表卖出了。例子如下:
# 买入 10000 元的平安银行
# 如果当前股票市价是 10 元,则代表买入 1000 股
# 如果除不开系统会自动调整成相近的合理数量。卖出时也会。
order_value("000001.XSHE",10000)
# 卖出 10000 元的平安银行
# 如果当前股票市价是 100 元,则代表卖出 100 股
order_value("000001.XSHE",-10000)- order_target_value(security,value),通过买卖,将股票仓位调整至一定价值量(单位:元)。security 是股票代码,value 是价值量。例子如下:
# 调整平安银行的持股价值量至 10000 元
# 即,如果目前平安银行的持股价值量(按股票市价算)低于 10000 元就买入,高于就是卖出,不高不低就不动。
order_target_value("000001.XSHE",10000)读写私有文件
write_file("test.txt", "hello world")
print(read_file("test.txt"))- write_file 是覆盖编码,多次修改会覆盖。
- 两个函数是同步的。
内置属性
- g 全局变量存储上下文
- context 执行上下文,存储回测开始、结束时间,钱余额、持仓成本等数据
Context
context 中的数据取用方法:
# 打印可用资金
print(context.portfolio.available_cash)
# 打印运行频率
print(context.run_params.frequency)
# 打印当前单位时间的开始时间
print(context.current_dt)
# 执行后日志内容如下
# 1000000.0
# day
# 2016-06-01 09:30:00context.portfolio.positions 账户信息,是一个 dict:
# 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
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)(个)