首先我们在一创-聚宽注册帐号,为什么不在聚宽注册呢?因为这是一创证券同聚宽合作的量化交易平台,聚宽有回测数量的限制,而vip和svip是收费的,但一创聚宽是没有限制的。
我们一步步的针对程序进行分析解读,首先在策略列表里新建策略:
这里的initialize(context)为初始化函数,程序运行时先从这里开始调用,这个函数带入的context官方的解释是个对象:策略信息总览,包含账户、时间等信息,,你理解为是个变量集就行了,内容如下:
下一层如下:
在上边的简单例子里看到函数带入的context变量起到一个交互的作用,同时g作为全局变量的对象,在初始时进行设置一些环境,以下是都有那些对像:
我们再回到前面的例子进行说明:
def initialize(context): #初始化
# 定义一个全局变量, 保存要操作的股票,如000001平安银行
g.security = '000001.XSHE'
# 运行函数-每天执行函数run_daily(),其中every_bar为开盘执行
run_daily(market_open, time='every_bar')
def market_open(context):
#如果000001平安银行不在持仓列表里
if g.security not in
context.portfolio.positions:
#那么市价买入1000股
order(g.security, 1000)
else:
#卖出800股
order(g.security, -800)
简单吧!当然这个程序没啥卵用,按这个交易得哭死。
来个复杂点的:
# 导入函数库
import jqdata
# 初始化函数,设定要操作的股票、基准等等
def initialize(context):
# 定义一个全局变量, 保存要操作的股票 # 000001(股票:平安银行)
g.security = '000001.XSHE'
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 运行函数
run_daily(market_open, time='every_bar')
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def market_open(context):
security = g.security
# 获取股票的收盘价
close_data = attribute_history(security, 5, '1d', ['close'])
# 取得过去五天的平均价格
MA5 = close_data['close'].mean()
# 取得上一时间点价格
current_price = close_data['close'][-1]
# 取得当前的现金
cash = context.portfolio.cash
# 如果上一时间点价格高出五天平均价1%, 则全仓买入
if current_price > 1.01*MA5:
# 用所有 cash 买入股票
order_value(security, cash)
# 记录这次买入
log.info("Buying %s" % (security))
# 如果上一时间点价格低于五天平均价, 则空仓卖出
elif current_price < MA5 and
context.portfolio.positions[security].closeable_amount > 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
# 画出上一时间点价格
record(stock_price=current_price)
这个可以运行,结果如下:
看着是不是有点那么回事儿了。