量化交易学习(一)单均线策略

去年花了很多时间在学习股票投资上,还折腾了量化交易。

市场如战场,每时每刻行情都会变。我尝试过盯盘,太累了,而且一直盯盘会让自己心情起落不定,心态不平稳,同时也会导致自己不能专注于工作。

量化的好处是不用自己盯盘了,写好策略后让电脑按照策略执行就可以了。其实炒股就是根据当前舆论、市场的情况预测自己看好的股票会涨还是会跌,预测会涨就买入,预测会跌就卖出。不过我现在的水平还很菜,一直没敢实盘。

我用的是掘金量化平台,可以去 https://www.myquant.cn/terminal 下载,安装好后把sdk什么的装好就能用了。

单均线策略很简单:首先计算出一条均线,当天价格上穿均线则买入,当天价格下穿均线则卖出。

下面是一个单均线策略,用talib库计算20日SMA均线指标。

导入python库

1
2
3
4
5
# coding=utf-8
from __future__ import print_function, absolute_import
import gm.pb.account_pb2
from gm.api import *
import talib

设置标的:

1
2
3
4
5
6
7
# 单均线策略
# 标的
def choose_stock(context):
context.symbol_list = ["SHSE.510300"]
context.frequency='1d'
context.bar_count=60
subscribe(symbols=context.symbol_list, frequency=context.frequency, count=context.bar_count)

计算指标:

1
2
3
4
5
6
7
8
9
# 指标
def indicators(context):
# context.data提取缓存的数据滑窗, 可用于计算指标
# 注意:context.data里的count要小于或者等于subscribe里的count
data = context.data(symbol=context.symbol_list[0], frequency=context.frequency, count=context.bar_count, fields='close,bob')
# 收盘价
context.close= data['close'].values
# 计算20日均线
context.sma = talib.SMA(context.close, 20)

打印买卖交易情况

1
2
3
4
5
6
def print_order(orders:gm.pb.account_pb2.Orders):
order=orders[0]
if order.side==OrderSide_Buy:
print(order.updated_at,'买入:'+order.symbol+' 价格为:',order.price,'买入量为:',order.volume)
else:
print(order.updated_at,'卖出:'+order.symbol+' 价格为:',order.price,'卖出量为:',order.volume)

风控:

1
2
3
# 风控
def control_risk(context):
pass

择时,判断买卖点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 择时
def timing(context):
# 执行风控
control_risk(context)
# 指定持仓
Account_position = context.account().position(symbol=context.symbol_list[0], side=PositionSide_Long)
if not Account_position:
if len(context.sma)>2 and context.close[-2]<context.sma[-2] and context.close[-1]>context.sma[-1]:
context.order=order_value(
symbol=context.symbol_list[0],
value=context.account().cash.available,
price=context.close[-1]*1.1,
side=OrderSide_Buy,
order_type=OrderType_Market,
position_effect=PositionEffect_Open)
print_order(context.order)
else:
if len(context.sma)>2 and context.close[-2]>context.sma[-2] and context.close[-1]<context.sma[-1]:
context.order=order_volume(
symbol=context.symbol_list[0],
volume=Account_position.volume,
side=OrderSide_Sell,
order_type=OrderType_Market,
position_effect=PositionEffect_Close,
price=context.close[-1]*0.9)
print_order(context.order)

初始化策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 策略中必须有init方法
def init(context):
account=context.account()
choose_stock(context)
k线柱事件回调
def on_bar(context,bars):
indicators(context)
timing(context)
主程序运行策略:
if __name__ == '__main__':
'''
strategy_id策略ID, 由系统生成
filename文件名, 请与本文件名保持一致
mode运行模式, 实时模式:MODE_LIVE回测模式:MODE_BACKTEST
token绑定计算机的ID, 可在系统设置-密钥管理中生成
backtest_start_time回测开始时间
backtest_end_time回测结束时间
backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
backtest_initial_cash回测初始资金
backtest_commission_ratio回测佣金比例
backtest_slippage_ratio回测滑点比例
'''
run(strategy_id='xxxx',
filename='main.py',
mode=MODE_BACKTEST,
token='xxxx',
backtest_start_time='2012-1-01 08:00:00',
backtest_end_time='2024-1-01 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=10000000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)

策略执行时会打印出买卖信息。
图片

用这个策略回测了2012年到2024年这十二年的结果如下:

策略收益为49.26%跑输沪深300

图片

改为5日均线后可以看到收益增加到71.65%,手续费也大大增加。

图片

这一篇就到这里啦。欢迎大家点赞、转发、私信。

江达小记