量化交易入门

之前听说过一些通过python编写交易策略的量化交易平台,现在来了解一下交易平台的使用方式。这篇文章会演示怎么在交易平台上编写一个简单基金定投策略。

量化交易介绍

量化交易(Quantitative Trading)是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式。

量化交易的核心是数学模型,编程只是量化交易的实现方式。数学模型的评估方式是通过输入历史数据让我们“穿越”回之前的某一个时刻,然后按照模型进行交易,对比策略带来的收益(回测)。如果严格按照数据进行决策,量化交易可以克服人性的弱点,也可以克服认知偏差,另外在一个很大的资本市场,比如有成千上万只股票的时候,量化交易有更强的信息处理能力,能捕捉更多的投资机会。不过因为模型主要是根据历史数据来构建的,所以它吸收新的信息的能力比较迟钝。一旦发生某些重大事件(比如东哥事件~),有效性很可能就会受到影响。现在国内也有一些量化交易的主题基金,和其他主题的基金相比表现比较一般。

量化投资的代表人物是詹姆斯·西蒙斯(James Simons),他是一位数学家,和陈省身一起提出了“陈-西蒙斯定理”,后来成立了文艺复兴科技公司开始从事量化交易,截至2019年10月,他的净资产估计为216亿美元,美国排名21位。

(西蒙斯公司旗下的大奖章基金,在2008年标普500指数下跌37%时,扣除费用后的收益为82%)

量化交易平台

量化交易平台提供了开发交易策略的平台,一般都会提供比较完整的股票/基金/期货数据,还有策略的在线运行环境。在百度上搜索“量化交易平台”,我随便选了一个叫“JoinQuant聚宽”的平台,地址是 https://www.joinquant.com ,后面的演示以这个平台为准。

编写交易策略

在joinquant上注册之后,就可以新建交易策略了,下面是一个基金定投策略的代码:

代码很简单,initialize执行交易前的准备工作,函数buy执行具体的交易操作

在initialize函数中:

set_benchmark 会设置一个和你的策略对比的基准,000016.XSHG是上证50股票代码

set_option 可以设定一些自定义配置,开启了动态复权, 可以在回测时使用真实的价格交易

set_subportfolios 设置账户资金和账户类型(open_fund代表场外基金)

set_redeem_latency 设置赎回到账日为T+2(stock_fund代表股票型基金)

run_weekly 设置交易函数的运行频率,每周一参考 reference_security 的开盘时间(每天9:30按昨日净值买入)

注意 在选择基准的时候最好选择股票代码,我在使用上证50的基金502049.XSHG时,发现基准收益率有不准确的问题

在buy函数中:

参数context 包含了当前账户信息和持仓信息
s 代表要定投的基金,定投策略是每周一买入1000元,当基金价格超过持仓成本50%后全部卖出

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
33
34
def initialize(context):
# 设定基准
set_benchmark('000016.XSHG')
# 开启动态复权模式(真实价格)
set_option("use_real_price", True)

### 场外基金相关设定 ###
# 设置账户类型: 场外基金账户
set_subportfolios([SubPortfolioConfig(context.portfolio.cash, 'open_fund')])
# 设置赎回到账日
set_redeem_latency(2, 'stock_fund')

## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
# 开盘时运行
run_weekly(buy, weekday=1, reference_security='000016.XSHG')

def buy(context):
# 设置场外基金标的为易方达上证50指数A('110003.OF')
s = '110003.OF'
# 止盈线
max_profit = 0.50
# 持仓成本和当前价格
avg = context.portfolio.positions[s].avg_cost
price = context.portfolio.positions[s].price

# 打印当前收益
log.info('returns=',context.portfolio.total_value)
if avg != 0 and price !=0:
if (price-avg)/avg > max_profit:
log.info('sell:',context.portfolio.positions[s].closeable_amount)
redeem(s,context.portfolio.positions[s].closeable_amount)
return
# 申购基金
o = purchase(s, 1000)

策略写完之后,可以直接在平台上调试,选择运行的起止时间,还有初始资金,点击编译运行即可(为了提高运行速度,调试时不用选择太长的时间间隔):

策略回测

要想获得更详细的收益信息,可以点击运行回测按钮,回测的时间跨度可以更长一点,我这里选择的是2016-01-01到2020-01-20,初始资金为20万。回测结果如下图,
红色是基准收益,就是第一个交易日用全部资金买入上证50之后的收益率,蓝色是定投的收益,定投4年的收益率为46%,重点关注收益率和最大回撤率,最大回撤率代表最倒霉的情况下策略的亏损。

如果调整max_profit改为30%止盈,最大回撤率会降低,但是收益也会下降:

模拟交易

回测只能说明策略的历史表现如何,我们还可以通过模拟交易让策略按照当前股市的真实情况运行一段时间,观察实际表现。关注了joinquant的公众号之后,还可以接收微信通知,不过模拟交易有时间限制,需要通过积分续费。

总结

借助交易平台只需要有一点编程基础和理财经验就可以编写自己的交易策略,主要的学习成本都在金融常识和各种交易指标上。另外在测试策略时最好和其他网站对比一下数据,确保基础数据都是准确的。

Xianfeng Song wechat
关注公众号,第一时间更新