量化交易 123 —- 使用 掘金量化平台 来进行一次基础的回测

量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的投资决策。

前面的话

量化交易,又名程序交易。为了防止人的非理性的交易行为,使用代码来进行操作,得到一个有理论方案支撑的收益结果。
如果经过自己的理论和实践的结合,得到一个可以持续获利的策略方式是可能的。

在大概两周之前开始了vn.py这个一个开源的量化平台,一直想玩玩,但是奈何没有win平台的设备,所以到本周末才正式的去体验了一把。虽然用的不是 vnpy ,出使用的是掘金量化的SDK,但是换汤不换药,跑出了回测的目的。所以在这里记录一下。

基础补充

看起来高达上的量化交易,实际上跑起来并不难。难点在于策略本书,而不是在于代码。
实际上可以抽象为一个事件触发,处理,再处理的过程。我这里是使用的 python 来实现的第一个能用的量化算法,叫做<无脑纳斯达克>

官方的python的快速入门手册 https://www.myquant.cn/docs/python/73?

事件驱动

前面说到,量化交易就是程序交易就是程序来帮我们来交易代码。所以交易的这个动作就需要一个触发。在 这个平台中,触发事件的类型有下面三种:

  • 定时启动场景
  • 数据事件驱动
  • 时间序列数据事件驱动

第一种很好理解,就是一个周期性的触发事件,比如一周一次等等,这个后面会用到。
第二种,就是通过订阅一个数据源来触发,有一个刷新频率,理解为每一分钟,或者每一秒都来得到某只股票的当前信息
第三种,这里是在第二种的基础上,触发的传入参数内容不再是当前的信息,而是一个时间序列,比如近10个点,等等。

处理函数

定时处理的话,只需要传入函数名就会定时的去执行。具体的代码:

schedule(schedule_func=algo, date_rule='1d', time_rule='14:50:00')

对于后面的两种数据驱动,是有一个系统默认的回调函数,区别在于传入的是当前的bar 还是 某个指标的 content 序列。

def on_bar(context, bars):
    bar = bars[0]
    print(bar)
def on_bar(context, bars):
    print(context.data(symbol='SHSE.600000', frequency='1d', count=50, fields='close,bob'))

Hello world

好了有了前面的知识,这里就可以来写一个简单的策略了,就是我们的《无脑纳斯达克》的策略。我们的目标是每周买入nasdaq的基金。来看看效果怎么样子。
代码如下,就这个简单的代码,就已经实现了每周买入 nasdaq 的功能。

def init(context):
    schedule(schedule_func=algo, date_rule='1w', time_rule='14:50:00')

def algo(context):
    # nasdaq 的基金
    symbol = 'SHSE.513100'
    result = order_value(symbol=symbol, value=1000, side=OrderSide_Buy , order_type=OrderType_Market , position_effect=PositionEffect_Open, price=0)

def on_backtest_finished(context, indicator):
    print(indicator)

if __name__ == '__main__':
    run(strategy_id='xxx,
        filename='main.py',
        mode=MODE_BACKTEST,
        token='xxx',
        backtest_start_time='2017-08-21 13:00:00', backtest_end_time='2020-08-21 15:00:00')

最后跑出来结果怎么样子呢?三年一共开仓 153次, 本金是 156428 元,实际收益是 778774,收益率在 49.78%,看起来还是不错的,年化在16.59%

留下点什么吧