编写第一个量化策略(手把手详细版教程)

用户头像量化官方小助理
2023-05-04 发布

编写第一个量化策略(手把手详细版教程)


  对于大部分人来说,量化交易是非常陌生与神秘的。本节内容将带你开启第一个量化策略!
  本节内容摘要:
    1.理解量化策略的基本框架。
    2.学会编写一个简单的量化交易策略。
    3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号。

  1.理解量化策略的基本框架

   通常情况下,完整的量化交易策略至少需要确定两件事:
    A.交易标的,即买什么;
    B.确定交易时机,即怎么买卖。
   让我们来设计一个简单完整的量化交易策略:
    策略交易标的:贵州茅台;
    策略交易时机:5日均线与20日均线金叉时,买入;5日均线与20日均线死叉时,卖出。

  2.学会编写一个简单的量化交易策略

  第一步:打开SuperMind量化交易平台,先在上方导航栏点击“我的策略”—“策略编译”,再点击蓝色按钮“+新建策略”,接着点击已创建的策略进入策略编译器页面,如下:

  温馨提示:“回测列表”下方三个按钮,可以设置编译器字体大小,背景颜色,编译设置,开启全屏编译,查看API文档,如下:
  

  第二步:理解量化交易策略框架对应的代码框架。

def init(context):
    #初始化函数:确定交易标的
def handle_bar(context, bar_dict):    
    #定时运行函数:确定交易时机

  框架理解:
   1.def init(context)与def handle_bar(context, bar_dict)是两个函数,函数格式固定为:def 函数名(参数),其中def后面带空格键,函数末尾必须带冒号。
   2.def init(context)函数是初始化函数,只运行一次,确定初始化条件;def handle_bar(context, bar_dict)函数是定时运行函数,平台默认该函数定时运行。日级策略,每日9:30;分钟级策略,交易期间内的每分钟。
   3.“#”后面为注释内容,用于注释代码,便于编写和阅读。

  第三步:确定交易标的:context.security = '600519.SH'。

  温馨提示:
   1.context是账户对象,该对象存放所有账户相关信息,持仓、可用现金、资产盈亏。
   2.context.security是在账户对象下,设置security变量,存放在账户内,这里我们需要确定交易标的,即:context.security = '600519.SH'。

def init(context):
    context.security = '600519.SH'#已确定交易标的
def handle_bar(context, bar_dict):   
    #定时运行函数:确定交易时机

  第四步:确定交易时机,即为:5日均线与20日均线金叉时,买入;5日均线与20日均线死叉时,卖出。

   从交易时机出发,我们需要计算交易标的5日和20日均线,那么5、20日均线需要用历史行情数据的收盘价来计算。

   整个流程即:获取历史行情20日的收盘价数据———计算5、20日均线———判断5、20日均线,进行买卖交易。

    A.获取历史行情20日的收盘价数据:
     1.找到函数历史数据函数:history
     2.填写函数参数,获取到数据:
      i.交易标的,即:获取那个股票的数据。
      ii.数据字段:['close']收盘价,即:获取哪个数据。
      iii.输入历史长度,即:获取多长时间的数据。
      iv.获取数据的时间步长,即:获取日线级步长数据。
      v.填写是否跳过停牌数据,复权选项,返回数据格式。
      最终结果即为:history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)
     3.将获取到的数据储存,便于计算,即:closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)

#获取证券过去20日的收盘价数据            
closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)

    B.计算5、20日均线:
     1.获取数据值,即:closeprice['close'],['close']可以获取储存中的收盘价数据,格式为closeprice['close']。温馨提示:closeprice是我们刚才获取的数据,但是数据有股票、时间、数值,我们直接用['close']获取收盘价数据值用于计算即可。
     2.选取数据长度,即:closeprice['close'].iloc[-5:]。iloc[]用于取值,我们之前获取20个数据,但5日均线只需要过去5日的收盘价,因此iloc[-5:]即为获取倒数第五个到最后一个数据。温馨提示:
      i.iloc[:]是获取所有数据。
      ii.iloc[:x]是从第一个获取到第x个,不包括第x个。
      iii.iloc[x:y]是从第x个到第y个,包括x,但不包括y。
      iv.iloc[-x:]获取倒数第x个到最后一个数据。
     3.计算均值,即closeprice['close'].iloc[-5:].mean(),赋值给MA5。同理MA20=closeprice['close'].mean(),即对所有值取平均,相当于MA20=closeprice['close'].iloc[:].mean()。

#计算二十日均线价格            
MA20 = closeprice['close'].mean()
#计算五日均线价格        
MA5 = closeprice['close'].iloc[-5:].mean()

    C.判断5、20日均线,进行买卖交易:
     1.if判断条件,即为 if MA5 > MA20:。温馨提示if判断函数的格式为if +添加判断+:,其中if后面必须带一个空格键,其次末尾必须带冒号。
     2.当MA5小于MA20时,我们再对持仓市值判断,如果有持仓,那么持仓市值必然大于0,需要进行卖出交易,我们直接通过context账户对象中portfolio资产组合内stock_account股票账户下来获取持仓市值,即为:context.portfolio.stock_account.market_value。
     3.下单买入交易:
      i.当触发MA5大于MA20时,我们需要买入股票,这时候我们可以使用order_target_percent下单函数,该函数以目标市值占比下单。
      ii.输入下单函数的参数,order_target_percent函数需要输入两个参数:
       1.下单的股票,即为context.security,我们之前将交易标的传入进去,可以直接用。
       2.下单的占比,即为1,取值范围[0,1],此时取1,表示全仓买入股票。
      iii.触发条件后程序提醒,当代码执行完下单函数后,我们用log.info()来打印日志,这样我们也可以看到程序下单了。
      温馨提示:log.info()内你可以直接输入中文,例如:log.info('条件满足!买入贵州茅台啦!')

# 如果5日均线大于20日均线,则全仓买入股票
if MA5 > MA20:            
    # 按目标市值占比下单
    order_target_percent(context.security, 1)
    # 记录这次买入
    log.info("买入 %s" % (context.security))

     4.下单卖出交易:
      i.当触发MA5小于MA20时,我们需要卖出股票,这时候我们可以使用order_target下单函数,该函数以目标股数下单。
      ii.输入下单函数的参数,order_target函数需要输入两个参数:
       1.下单的股票,即为context.security,我们之前将交易标的传入进去,可以直接用。
       2.下单的目标股数,即0,因为我们需要将持仓股票卖出,卖到0股为止。
      iii.触发条件后程序提醒,当代码执行完下单函数后,我们同log.info()来打印日志,这样我们也可以看到程序下单了。

# 如果5日均线小于20日均线,并且目前有头寸,则清仓股票
elif MA20 > MA5 and context.portfolio.stock_account.market_value > 0:
    # 卖出所有股票,使这只股票的最终持有量为0
    order_target(context.security, 0)
    # 记录这次卖出
    log.info("卖出 %s" % (context.security))

最终完整代码:

def init(context):
    # 设置要操作的股票:贵州茅台
    context.security = '600519.SH'
# 设置买卖条件,每个交易频率(日/分钟/tick)调用一次
def handle_bar(context, bar_dict):
    # 获取股票过去20天的收盘价数据
    closeprice = history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)
    # 计算20日均线
    MA20 = closeprice['close'].mean()
    # 计算5日均线
    MA5 = closeprice['close'].iloc[-5:].mean()
    # 如果5日均线大于20日均线,则全仓买入股票
    if MA5 > MA20 :
        # 按目标市值占比下单
        order_target_percent(context.security, 1)
        # 记录这次买入
        log.info("买入 %s" % (context.security))
    # 如果5日均线小于20日均线,并且目前有头寸,则清仓股票
    elif MA20 > MA5 and context.portfolio.stock_account.market_value > 0:
        # 卖出所有股票,使这只股票的最终持有量为0
        order_target(context.security, 0)
        # 记录这次卖出
        log.info("卖出 %s" % (context.security))

第五步 回测量化交易策略

   通过以上4步,我们已经完成了量化交易策略编写,那么接下来我们需要进行量化交易策略回测。

    A.首先,我们尝试去跑通整个历史行情,排查代码错误。
     i.右上角设置回测历史长度,设置资金,设置交易频率。
     
     ii.点击左上角“编译运行”按钮,右边出现量化交易策略在历史行情中的表现情况
     
    B.当量化交易策略能跑通整个历史行情后,我们可以确定该代码正确无误,随后点击右上角蓝色按钮“进行回测”。页面跳转至回测页面,在回测详情界面,您可以查看策略收益曲线,风险指标,每日持仓,交易明细,输出日志等信息,如下:

    C.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号
     1.在回测显示结果页面,右上角点击蓝色按钮开启模拟交易,可以自行选择:从当前日开始模拟,在已有的回测基础上继续模拟.如下图:
     
     2.至此,我们成功开启了模拟交易,可以查看您的模拟交易账户详细情况:交易明细、持仓、盈亏情况、账户风险指标等等。如下图:

     3.您可以为您模拟交易账户新建模拟交易、暂停策略运行、发布策略至社区、重启策略、查看策略运行日志、查看策略代码。注意:重启按钮只会在策略运行错误后显示,如果策略运行正常,显示暂停按钮。新建模拟交易如下图:

收益&风险
源码

评论

用户头像
2023-06-14 02:01:20

马克

评论
用户头像
2023-06-14 11:56:41

马克

评论
用户头像
2023-06-19 21:15:29

马克

评论
用户头像
2023-06-22 11:25:23

马克

评论
用户头像
2023-08-03 09:18:00

马克

评论
用户头像
2023-09-14 10:39:15

马克

评论
用户头像
2023-09-16 22:20:29

马克

评论
用户头像
2023-09-16 22:22:56

马克

评论
用户头像
2023-10-05 11:01:25

马克

评论
用户头像
2023-10-05 14:24:42

马克

评论
用户头像
2023-10-05 18:46:30

马克

评论
用户头像
2023-10-18 11:24:13

马克

评论
用户头像
2023-10-18 11:28:11

马克

评论
用户头像
mx_***772c39回复:年少多金很烦
2023-10-18 11:28:43

马克

评论
用户头像
2023-10-18 11:31:19

马克

评论
用户头像
2023-10-23 15:50:14

马克

评论
用户头像
2023-11-14 08:41:07

马克

评论
用户头像
此刻青春回复:mx_****234xnp
2023-11-22 23:22:28

马克

评论
用户头像
不归路人回复:mx_****234xnp
2023-12-06 11:01:20

马克

评论
用户头像
2024-03-07 14:40:50

马克

评论

需要帮助?

试试AI小助手吧