weaponzhi / ai_blog Goto Github PK
View Code? Open in Web Editor NEW人工智能相关博客,请 star 或者 watch
人工智能相关博客,请 star 或者 watch
上一篇文章,我用了4000字这样比较长的篇幅,介绍了一些金融和量化交易相关的基本知识,还大概说了下人工智能在金融方面使用的优劣。这篇文章我们将用一个具体代码来进行一波股票价格预测的实战。
之前也说了,量化交易本身只是一种交易模式,只要在量化交易软件中输入了策略,计算机就会根据策略进行自动化交易。我们机器学习生成的不过是量化交易步骤中的策略阶段,暂时我们不用考虑交易方面的接入,这个涉及到很多交易 API 相关的知识。交易平台开发框架,我介绍一个Github上基于Python的开源框架,大家可以了解一下:vnpy。
OK,下面我就把关注点集中在价格预测这件事上。我们都知道,不论用机器学习做什么,首先我们得需要一些数据源,并且还需要有一些途径来进行回测。那么像股票或者其他金融盘口的数据是有很多途径可以获取的,我今天给大家介绍一个我平时经常用的平台:RiceQuant米筐量化交易平台(非广告)。
这个平台有自己的一套Python API和编译器iPython NoteBook来进行量化交易策略的开发。代码只需要在特定的方法内实现好逻辑,就可以一键生成测试结果,结果会自动的解析出回测收益曲线以及一些指标来给你参考。就像这样
具体的API我就不多介绍了,有兴趣的同学可以直接去官网查看API文档,非常详细。https://www.ricequant.com/api/python/chn
在这里,我将通过数据进行一些简单的机器学习操作,并没有用到能够得到回测的那些API。需要提前了解的一个API就是get_price函数,比如下面这句话就代表了获取CSI300指数过去一年的原始历史数据,返回类型是我们非常熟悉的pandas中的DataFrame。
df = get_price('CSI300.INDX','2005-01-05','2015-01-01').reset_index()[['open','close']]
这个函数只能在米筐线上编译器中使用。我们拿到这个数据,就可以通过Python数据分析三剑客来进行花式操作了。我们这里用一些比较简单的特征来进行我们的预测。那就是前两天的涨跌幅,把前两天的涨跌幅作为特征输入,再把该天的实际涨跌幅作为输出,这样的一组数据作为训练样本。
当然了,这种特征的选择是非常简单的,预测结果肯定不够理想,实际工程中,特征的定性和定量是最重要也是最复杂的,比如行情都会有很多指标,像MACD、VR,都是很重要的指标,我们这里这样选择特征只是为了方便演示。
既然我们是通过涨跌幅来作为特征,首先得把涨跌幅这个数据给弄出来,刚刚通过 get_price 获得的是每一天的开盘和收盘价格,那么计算涨跌幅就简单了
>>> up_and_down=df['close']-df['open'] > 0 # 获取涨跌情况
>>> rate_of_return = (df['close']-df['open'])/df['open'] # 获取涨跌幅
>>> up_and_down_statistic = up_and_down.value_counts() # 获取涨跌天数
然后,我们使用matplotlib.pyplot来绘制下涨跌天数的柱状图
很奇怪,在ipython notebook使用pyplot有时候会画出来弯曲的,将就看咯
从图上我们可以清晰的看出来,这10年中,最后收盘价是涨的情况还是偏多一点的。我们还可以看一些别的数据,比如我们就打印一下每天涨跌图。
rate_of_return.plot(kind='line', style='k--', figsize=(15, 10), title='Daily Yield Changes Over Time Series')
从这个图我们就可以比较清晰的看出来这2000多的交易日里面的一些行情情况了,比如中间有段宽幅波动奇大的区间,这说明这会是个牛市,对应到07年那会的牛市。我还记得那会我刚上初中,每天中午回家,我爸爸就告诉我他今天股票又赚了多少多少钱,可开心。
当然了,你还可以利用画图进行更多的数据分析,下面我们将编写一个简单的机器学习代码,看看使用这样一个简单的特征,这段数据跑下来,能有多少的价格预测正确率。
我们在这里预测的是收盘涨跌情况,是个分类问题,所以我们这里选择SVM来进行分类。每个新数据都会被再次进行fit拟合以便提高下次预测的准确率。代码如下:
import pandas as pd
import numpy as np
from __future__ import division
from sklearn import svm
from collections import deque
import matplotlib.pyplot as plt
window = 2
# 米筐获取某一品种历史数据的DataFrame,注意得从2005-01-04开始
df = get_price('CSI300.INDX', '2005-01-05', '2015-07-25').reset_index()[['open', 'close']]
up_and_down = df['close'] - df['open'] > 0
print(len(up_and_down))
X = deque()
y = deque()
clf = svm.LinearSVC() # SVM
prediction = 0
test_num = 0 # 测试总数
win_num = 0 # 正确预测数
current_index = 400 # 起始位置
for current_index in range(current_index, len(up_and_down)-1, 1):
fact = up_and_down[current_index+1]
X.append(list(up_and_down[(current_index-window): current_index]))
y.append(up_and_down[current_index])
if len(y) > 100 and len(y) % 50 == 0:
test_num += 1
clf.fit(X, y)
prediction = clf.predict(list(up_and_down[(current_index-window+1): current_index+1]))
if prediction[0] == fact:
win_num += 1
print(win_num)
print("预测准确率为",win_num/test_num)
最后输出的结果为58.53%,如果一个价格预测软件仅通过历史数据就能达到百分之60左右的正确率,实际上这已经是一个非常不错的结果了,不过我们这里的结果说服力不够强,首先我们的特征过于简单,再有就是为了节省训练时间,实际上我把样本的拟合规模缩短了很多,我只在50的倍数位置进行预测,所以我最终的预测样本数量大概只有40来个。
上面的代码部分参考了米筐社区中一位叫陆东旭的同学。这个社区现在还是挺活跃的,我看的帖子还是三年前的。可以说,早在几年前,国内就有这样量化交易和AI的社区了,可见前人们早已在路上,等到我们都认为需要去接触这些东西的时候,他们已经跑的更加远了。
不过没关系,后来者居上,也是一件挺有意思的事。
上面的代码实际上是最粗暴和原始的代码,通过自己写循环未免也太麻烦了,所以这个平台后来更新了 API,就像我文章开头说的那样,只需要在提供好的空方法里填充逻辑,就可以快速的进行回测操作了。比如下面就是官方的API文档介绍。
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
context.s1 = "000001.XSHE"
# 是否已发送了order
context.fired = False
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 开始编写你的主要的算法逻辑
# bar_dict[order_book_id] 可以拿到某个证券的bar信息
# context.portfolio 可以拿到现在的投资组合状态信息
# 使用order_shares(id_or_ins, amount)方法进行落单
# TODO: 开始编写你的算法吧!
if not context.fired:
# order_percent并且传入1代表买入该股票并且使其占有投资组合的100%
order_percent(context.s1, 1)
context.fired = True
好了,今天就是简单的通过米筐来介绍下如何通过一些第三方数据获取API,并结合 Python 的数据分析库来做一些有趣的事情。下篇文章再见咯!
推荐阅读
各位朋友大家好,小之今天又来给大家带来一些干货了。上篇文章机器学习股票价格预测初级实战是我在刚接触量化交易那会,因为苦于找不到数据源,所以找的一个第三方平台来获取股票数据。
后来对平台上使用的ipython notebook感兴趣了,我毕竟Python学习的时间不长,所以接触到这样特殊美好的编译环境,真的很欣喜。ipython中代码、文字、图表混合在一起,非常方便做文档演示,而且它可以即时编译,总之用起来很爽。
所以我就查阅了一些资料,了解到实际上我们自己也是可以使用ipython来作为本地编辑器的,这让我特别开心,加上这周五,也就是明天,我要在全公司面前做一个人工智能和量化交易方面的分享会,所以我就趁机把演示代码写在ipython notebook上,等明天的时候,先把代码跑好,然后边演示代码边演示图表,舒服,等会大家也会在文章中感受到ipython notebook的魅力。
这个PPT我会分享出来,并且还会用一篇文章,专门的说说我在这次分享会演讲中说了什么,想到了什么,希望可以和大家一起交流。
当然,PPT 的样式可能真的不太符合你的期望,我只是一个程序员,实在是不太擅长这些,所以白底黑字,感觉也是极好的。
像上篇文章,我是用的股票中的指数数据来分析,不过呢,周五的分享会中,我需要用一个我们公司平时比较熟悉的一个品种(我们公司涉及的是贵金属现货),所以我就询问了我们的CTO,让他给我些路子拿到黄金的数据,后来CTO给了我个地址,华尔街见闻网站。然后点开我需要的品种的图表,用chrome的检查工具,轻易的就抓到了URL数据。网页上大概是这样的
这个数据的请求url是这样的
https://forexdata.wallstreetcn.com/kline?prod_code=XAUUSD&candle_period=8&data_count=1000&end_time=1413158399&fields=time_stamp%2Copen_px%2Cclose_px%2Chigh_px%2Clow_px
数据的格式很清晰,我们大概可以猜测到请求参数data_count代表的是请求的数据量,end_time是时间戳,这两个数据结合在一起就是从end_time开始往前data_count个交易日的数据。
后面带&号的就是我们需要获取的数据了,time_stamp是每笔数据的时间戳,close是收盘价,open是开盘价,high是最高价,low是最低价,这五个数据是我们需要绘制K线图的基本数据,就是所谓的蜡烛图了,K线有不太了解的伙伴可以自己查阅下,我在这里就不多细说了。
分析好url,我们就要正式的爬取数据了,我希望获取黄金(这里实际上是黄金/美金,代号是XAUUSD,是一种外汇)10年的数据,这里注意下,经过我的尝试,这个url中,data_count最多只能获取1000的数据,如果大于1000,也会默认返回1000条数据。那么自然,我们的请求参数end_time就得动态变化。
为了方便,我决定每次只爬取一年的数据,所以data_count固定死为365,而end_time通过format函数从参数中获取,代码如下
def get_data(end_time,count):
url = "https://forexdata.wallstreetcn.com/kline?prod_code=XAUUSD&candle_period=8&data_count=365&end_time="\
"{end_time}"\
"&fields=time_stamp%2Copen_px%2Cclose_px%2Chigh_px%2Clow_px".format(end_time=end_time)
response = requests.get(url) # 请求数据
data_list = json.loads(response.text) # json 解析
data = data_list.get("data").get("candle").get("XAUUSD")
# 转化为 DataFrame
df = pd.DataFrame(data,columns=['date','open','close','high','low'],index=list(range(count,count+365)))
return df
这里,我们使用requests第三方包来请求数据,拿到数据后先用json来解析数据,最后把数据转化为pandas的DataFrame结构。这个是常规操作了,大家应该都没什么问题。
获取数据的方法写好后,我们循环调用10次get_data函数,并且把DataFrame对象进行拼接,就完整的拿到我们黄金的10年数据了,注意每次循环间隔要有一定延时,免得被反爬虫机制封了iP啦。
init_time = 1237507200 # 2009年3月20日
window = 60*60*24*365 # 每次获取365天的数据
df = pd.DataFrame()
for i in range(10):
df = pd.concat([df,get_data(init_time + i * window,i*365)])
print("get data success ",i)
time.sleep(0.5)
好了,代码执行完之后,我们来看看df的数据,截一个ipython notebook的样式。
ipython这种体验我可以归纳为:及时行乐。
好了,现在我们有了3650条DataFrame数据了,作为拥有数据分析三大神器的Python来说,下面就可以随意的玩弄数据了。(import matplotlib.pyplot as plt)
比如我们绘制下黄金的收盘价走势图,三行代码就可以咯
df['close'].plot(figsize=(15,10))
plt.grid(True)
plt.show()
那我们有了绘制K线数据的5个基本数据,不绘制个K线显然说不过去。绘制K线的代码稍微复杂一些,主要就是处理横坐标的时间,需要有一个数据的转化,把时间戳转化为%Y-%m-%d,再把这种格式转化为pyplot支持的时间样式。
import matplotlib.finance as mpf
from matplotlib.pylab import date2num
import datetime
r = map(lambda x : time.strftime('%Y-%m-%d',time.localtime(x)),df['date'])
df['date'] = list(r)
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.datetime.strptime(date,'%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time
fig,ax = plt.subplots(figsize=(15,10))
mat_data = df.as_matrix()
num_time = date_to_num(mat_data[:,0])
mat_data[:,0] = num_time
fig.subplots_adjust(bottom=0.2)
ax.xaxis_date()
mpf.candlestick_ochl(ax,mat_data,width=0.6,colorup='r',colordown='g')
plt.grid(True)
plt.xlabel('Data')
plt.ylabel('Price')
plt.show()
我们还可以绘制这10年来每天的涨跌幅状态,从中能看出黄金走势的牛熊和震荡
rate_of_return = (df['close']-df['open'])/df['open']
rate_of_return.plot(kind='line',style='k--',figsize=(15,10))
plt.show()
可以看出,黄金大部分时间都是在震荡,刚开始和中间有一些比较反常的情况,刚开始那个我推测是经济危机之后那段时间的调整,美元大跌那会吧。
哦对了,这里我要纠正下我上篇文章的一个错误,记得那个弯曲的柱状图吗,没错,就是它了
我当时以为是ipython的bug,后来发现并不是,而是代码中我加了这一行
with plt.xkcd():
xkcd是一部漫画的名称,然后这个函数代表就是用类似于这部漫画的style来画图,所以,这漫画是啥样的呢?
emm...看起来确实很手工。
好了,数据爬取篇就这样了,实际上和大部分爬取工作都差不多,只是行情有一定的特殊性。
下一篇我将针对这些数据玩弄一些机器学习代码,来和大家一起调调参。
推荐阅读
上篇文章我们进行了黄金行情数据爬取,并对黄金数据进行了一波花式分析,这篇文章我们将用我们之前的文章所用过的策略进行黄金价格的分析,并通过分析,优化我们的代码,提升预测的正确性。
我们输出一下这3650天的涨跌情况的柱状分布图
rate_of_return.plot(kind='hist',bins=150,alpha=0.3,color='g',normed=1)
rate_of_return.plot(kind='kde',xlim=[-0.1,0.1],style='r',grid=True,figsize=(15,10))
plt.show()
仅用三行代码,我们就输出了这样一个优美的柱状分布图,这里面红色的曲线叫kde图,中文名字叫核密度估计图,是在概率论中用来估计未知的密度函数。
我们可以看到,涨跌幅的分布是一个比较标准的正态分布,中间高两边小,而且对于XAUUSD来说,因为有高达两百倍这样的杠杆比率的存在,我们看来很小的一些涨跌幅波动,对于炒外汇的人来说,那一上一下就是好几个亿啊!
OK,现在我们按照机器学习股票价格预测初级实战这篇文章的方法对黄金价格进行预测,主要思路就是,通过对预测当天前两天的涨跌情况作为特征,而标签为预测当天的涨跌情况。
这样跑下来,我们的预测正确率为53%,实际上这个结果我认为还是有一定道理的,如果行情连续两天都在涨,那么第三天最后是涨的情况可能确实要多一些。
这边因为代码重复,我就直接截图了
因为我有自己玩过外汇,所以大概会看一些简单的趋势,而这些趋势判断的时间段经常是以月为单位的,所以我们可以动态的改变一下窗口期,一个月的工作日有21,22天这样,那么我们就从看看预测概率在window为1-22情况下的情况吧。
# 窗口期对预测数量的影响
win_ratio = []
window_list = [x for x in range(22) if x != 0]
i = 1
for window in window_list:
X = deque()
y = deque()
clf = tree.DecisionTreeClassifier()
prediction = 0
test_num = 0
win_num = 0
current_index = window
for current_index in range(current_index, len(up_and_down)-1, 1):
fact = up_and_down[current_index+1]
X.append(list(up_and_down[(current_index-window): current_index]))
y.append(up_and_down[current_index])
if len(y) > 100:
test_num += 1
clf.fit(X, y)
prediction = clf.predict([list(up_and_down[(current_index-window+1): current_index+1])])
if prediction[0] == fact:
win_num += 1
ratio = win_num/test_num
print("已完成预测",i,'次')
i += 1
win_ratio.append(ratio)
fig = plt.figure(figsize=(12,10))
plt.plot(window_list,win_ratio,'ro--')
plt.show()
结果非常有趣,我们发现,窗口期从8开始,预测的正确率呈现出一个比较明显的上扬趋势,甚至在window为17天的时候,正确率达到惊人的百分之57。
实际上我有在别的品种,比如股票的品种上跑过相同的代码,但大多数的正确率只有52-53之间。看,我们好似发现了黄金外汇中的一个比较有趣的影响特征了。
实际上我这样的写法过于粗暴,因为我们window的数量对于这个案例来说直接决定了我们的特征维度,window越大,你会发现我们整个的预测逻辑执行时间将会越长。这里会涉及到一个特征工程,我们可以可以把这样的特征转化为一个映射。这样,无论window是多少,最后都会转化为一个特征。
比如,如果window=4,然后其中一个样本的前四天的涨跌情况为,涨涨跌跌,通过映射,我们可以用一个矢量来表示:[1,1,0,0]。当然啦,特征工程是一个非常重要的事情,我们今天的重点并不在这。
我们来试试对于预测sample进行动态改变会对预测结果带来多少影响。
# 样本数量对预测率的影响
window = 2
win_ratio = []
samples_list = [x*5 for x in range(60) if x != 0]
for samples in samples_list:
X = deque()
y = deque()
clf = tree.DecisionTreeClassifier()
prediction = 0
test_num = 0
win_num = 0
current_index = 2
for current_index in range(current_index, len(up_and_down)-1, 1):
fact = up_and_down[current_index+1]
X.append(list(up_and_down[(current_index-window): current_index]))
y.append(up_and_down[current_index])
if len(y) > samples:
test_num += 1
clf.fit(X, y)
prediction = clf.predict([list(up_and_down[(current_index-window+1): current_index+1])])
if prediction[0] == fact:
win_num += 1
ratio = win_num/test_num
win_ratio.append(ratio)
print("预测完毕")
fig = plt.figure(figsize=(12,10))
plt.plot(samples_list,win_ratio,'ro--')
plt.show()
没错,看起来确实有些影响,但看看我们的y轴数值,实际上影响并不是很大,这里主要因为我的循环数量还是很低,最高的300对于3000多的完整数据来说,还是不太够的。
再有,我这套代码的训练泛化性并不高,我在sample训练之后,虽然划分了训练集和测试集,但每次预测完一个测试数据就会把这条数据在下次预测的时候添加到训练数据集里,所以结果差距不大,确实在情理之中。
这里涉及到一个拆分数据的问题,如果可以,尽量将数据拆分成三层 : 训练集、验证集和测试集。
文章差不多要结束了,我们的价格预测,实际上还差得远呢,最重要的是,我并不是一个专业的金融分析师,做这样的量化交易与预测分析,显然是需要金融专业的人和程序员配合才能擦出火花,我一直觉得金融是机器学习目前最适用的领域了,它的数据多,指标全,太适合做历史数据分析了,任重而道远,还有很多值得我去学习的。
最新两篇文章的源码 ipynb 和 py 文件也更新到了这个仓库中,有需要的大家自行下载观看,推荐使用jupyter notebook 打开,效果更好
参考文章:关于涨跌的思考
推荐阅读
和大家聊聊量化交易,以及人工智能可以在量化交易上的应用。我们程序员还是应该懂点金融知识的。
首先跟大家聊聊交易。股票大家应该了解过,股票这种投资方式相比于理财产品一类收益要大很多,当然风险也会高很多,这个大家都懂。实际上市场上除了股票,还有期货、现货、外汇这类市场。
我们国内的股票市场玩起来实际上有一定的局限性,只能买涨不能买跌。除非你是一个精明的短线高手,在行情不好的时候,大多数持仓的人都是在亏钱。不仅如此,国内的股票也有涨跌幅的上限,像比特币市场这种动辄一天百分之4,50涨幅这种刺激的情况是不会有的。
在国外股票市场或者类似于外汇市场这样的盘口,你不仅可以买涨,还能买跌,意思是即使你持仓的股票价格在跌,你却能赚到对应差值的钱。如没接触过这方面的同学可能不太好理解,我简单的说一下原理。
像我国股票市场那种买涨的形式,我花1000块,买了1手股票,就相当于我持有了这个股票,跟倒卖商品一样,等到涨价了,我把它卖出去,自然是能赚钱的。这个好理解。
那么买跌又是咋回事呢。我们可以把这种形式理解为一种契约关系。打个比方,比如黄金现价1千克20万,我看跌黄金,现在我向交易所提交一个合约,合约上写着:我,小之,黄金看跌,买跌一手!
然后交易所给我看着年轻的我,也给了我一张合约,这张合约代表的就是一公斤黄金现货。我拿着这个合约,到市场上卖了,这样,我手上就有了一公斤黄金在当前价格下的钱了,也就是20万现金。等到价格跌下去,比如跌到了18万一公斤黄金,我再把这一公斤黄金买回来还给交易所,那这中间的2万差价就是我赚的钱了。可能具体形式有所区别,但大概可以这么理解吧,专业人士见笑了。
外汇或者是现货这种市场还有一个特别好玩的东西,那就是杠杆。杠杆这玩意特别刺激,像刚刚说的黄金,咱买一手要20万,这实在不是一般人能玩的起的东西,这时候杠杆就起作用了。比如某个市场黄金的杠杆是200倍,那么一手20万的黄金,现在你只需要花1000块就可以买过来玩了。当然,这涨跌的时候盈利或者亏损的钱,还是按照之前的来,1000块与20万之间的差值,还是交易所借给你的。
现在你是用杠杆来进入这个游戏的,那么你是有可能完全把你本钱给亏光的,你投入了1000块,是完全可能亏损到大于1000块直至爆仓的,当然,你也有可能在很短的时间赚了几倍的钱。那么交易所为了保证自己不亏钱,它就会通过某种公式设置一个亏损上限,如果你亏到一定数目,它是会强制的帮你平仓的。
这个杠杆有多刺激,给大家打个比方就知道了。比如我们在国内股票做交易,你1000块的本钱,到顶涨停了,也就赚个100块,10%的盈利率是吧(不包括打新股情况)。那么在有杠杆的市场是啥情况呢,1000块的本钱,在200倍杠杆下,如果今天涨了10%,盈利率是2000%,直接翻了20倍!!当然,你也有可能一下亏个20倍导致裤子都亏没了。而且这些事情全部发生在转瞬之间,盘面上一个点位的波动,你都得在心中先乘上200再说。所以我之前看有个朋友做这种盘,他的收益浮动就是一下+1000,一下-1000的跳动,我觉得我没这个心理素质玩这个...
更更刺激的是,像外汇这种盘,是全天都可以随时交易的。不像我国的股票,每个半天只有2个小时左右的交易时间,并且今日购买的股票,第二天才能交易,无法进行日内交易。
从上面有关交易的内容中,我们可以看出,如果我们是自己人工来做交易,往往会有很多问题。
首先我们人是有情绪波动的,在交易的过程中,会有一些非理性的决策。即便你是分析师,或者你跟随一位强力分析师来做交易,也不可避免的遇到这些问题。面对波动,你眼睁睁看着自己的口袋慢慢变扁,即便你可能认识到这种波动是一种正常现象,也有可能忍不住自己的双手含泪割肉。等你回过头再看这些波动的情况才意识到这只不过是大驱使下的小小调节,而自己就被这种小小的变化给打败了,随即懊恼不已,追悔莫及,心里暗暗下定决心,下波翻盘!
然后以此循环。
我们做人工操作,还有一个极常见的问题,就是容易跟风,所谓遇涨买涨,见跌割肉,大概就是亏钱的少侠们交易的常态了。
那我们的量化交易,就是一种可以避免这些人为劣势的投资方法了。量化交易通过先进的数学模型,利用计算机技术从庞大的历史数据中海选出能带来超额收益的多种「大概率」事件,利用这些事件制定策略,自动的完成交易。
上面那些东西是从百度百科抄的,我还是用自己的话来解释下。首先,量化交易可以理解为一个自动化交易程序,这个程序分三个流程:输入策略,执行策略,输出结果。
策略比较好理解,比如我觉得这只股票在涨了两天之后,必然会跌!这就是一个策略,我通过算法来实现,每当遇到连续涨了两天的情况后,我就认为这是一个跌的信号,我可以进行一些卖出操作。可以理解为我这套量化交易程序的交易规则。
执行策略就是把这些策略接入到交易平台上,然后投放到市场上,让程序自动的为我们完成交易,每当市场达到了我们提前设置好的规则后,就会自动的进行市场交易操作。
那么,当我们通过量化交易在市场上执行了一段时间,或者通过把程序在历史数据上跑了一段时间后,我们最终获得的收益率或者其他的一些收益指标,就是我们的结果了。当然你赚的越多,自然这个策略可能在这个时间段就会越好。
而且我们通过量化交易来做市场,基本可以避免我们人为操作那些主观情绪上的问题,不管市场怎么变动,机器是不会觉得乐观或者悲观的,它只知道规则和条件,达不到买入条件,你涨的天花乱坠蛇皮棒棒高,它都不会有任何的心里波动和买入动作。
量化交易这么好,是不是用了就赚钱?显然没有这么好的事咯,我们继续分析分析。
人工智能在量化交易中的应用可以算个升华。常规的量化交易在金融公司可能是这么个形式,比如一个金融分析师,配一个程序员,分析师出策略,程序员把策略以代码形式实现,接入到交易程序里(当然,我听说现在的分析师自己要会写代码了)。这里的策略是分析师自己设计的,实际上还是一种主观策略。
人工智能就是机器自己生成这种策略,通过历史数据,来自动生成策略的模型。实际上这就是人工智能在量化交易中应用范围了。现在很多的智能投资顾问机器人,就是这样的。
但实际上,不管是人工输入策略还是人工智能自动生成的策略模型,都无法解决量化交易本身的一些弊端和风险。这就是我们上一节最后的问题了,我在这里说一下自己的理解。
量化交易的策略,总归是根据历史数据来总结的,但不论是股票还是外汇、现货,他们都有一个特点,就是其当前的价格并不一定对应于目前的价值水平,而是对该公司或者品种未来预期价值的一个定量。所以,我们预测价格,看的是它的预期,历史数据对未来价格的影响可能是不大的,它并不存在「预期」这样的未知信息。
比如黄金价格是和美元有一定挂钩的,如果美元大涨了,黄金可能就会跌。如果特朗普某次说了一句话,颁布了一个政策,大家预期美国的经济形式会变好,那么美元就会涨,黄金就会跌。但美国在政策发布的时候,经济并没有瞬间变好,这就是预期的价值,显然,历史数据上看不到这些。
那么我们的策略模型,跑到历史数据上,可能收益很高,但真实数据跑下来,可能就不是这么一回事了,这就是一个过拟合问题,在量化交易中是一个比较严重和常见的问题,也是要主要解决的问题之一。
还有一个问题就是,策略的回测结果,往往是跑在一个较长的时间周期上的,用我这个策略跑一年,你就能月入百万此类。不过,这个过程中,虽然总体是赚钱的,但短线的一些回撤,会有扛不住而爆仓的情况,这是隐藏的一些风险。
这两个问题对于人工智能产生的策略上,可能会更加突出一点,因为机器学习模型就是用已有数据作为训练标本来对未来预测的,它很有可能有过拟合的情况。
而且特征的选取也非常的复杂,在股市上,影响股价的因素不仅仅是历史股价了,公司的近况,股民的乐观程度,政策以及庄家的心情等等。特征在量化交易上一定是个大学问,耗时耗力。价格预测的模型会非常复杂。
而且金融领域和别的领域有一些不同,人工智能在别的领域,你可能可以选取一些解释性不高的方式来生成模型,比如像 AlphaGo 下围棋,它虽然棋力惊人,但你要问它你为啥下这步棋,它说不出来。但在金融上就完全不能这样了,预测的可解释性至关重要,所以可以尝试比如决策树、SVM和朴素贝叶斯这类解释性比较强的算法来进行价格预测。
可能读到这里,你可能就会问了,既然历史数据意义有限,感觉量化交易和人工智能,在交易上并没有什么卵用啊。实际上也并非如此,华尔街那么多公司已经在做的事显然不会是毫无价值的。
用人工智能分析历史数据和曾经发生的那些消息面,机器是可以分析和总结出规律的,当有新消息发布的时候,相比于人类,机器能够对消息造成的影响做出更迅猛、更理性、更全面的判断,机器能够对数据进行加工整合,通过这些判断来指导人们进行价格分析,这就是它的意义所在。
而且这个意义非常重大。
有点长,能看完这篇文章的都是真爱,之后的文章我将具体用代码实战一些量化策略和机器学习价格预测。
推荐阅读
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.