支持向量机(股票)——Python量化
机器学习
目录
机器学习
1. 原理
什么是机器学习?
什么是支持向量机?
利用支持向量机预测股票涨跌
参数优化
2. 策略思路
3. 策略代码
4. 回测结果与稳健性分析
1. 原理
什么是机器学习?
无监督学习是指针对未标记过的数据集进行学习。比如聚类问题,没有准确的标准说明应该聚成几类,只有相对概念。这类模型包括:K_means聚类、层次聚类法等。
什么是支持向量机?
支持向量机是最典型的一类机器学习模型,常用于解决二分类问题。支持向量机的原理是在一个样本空间内,找到一个平面,将样本数据分为两个部分,即两个分类,这个平面就叫做超平面。
已知A、B、C三条线均可以将样本空间分为两类,那么问题来了,应该选择哪一个?
支持向量机背后的数学原理十分优美,但由于推导过程过于复杂,这里不再赘述。总之,支持向量机的核心就是寻找最优超平面。
支持向量机不仅可以解决线性可分问题,也可以解决非线性可分问题。其核心思想是将原始样本点映射到高维空间上,将非线性转化为线性可分,在高维空间中找到满足条件的最优超平面,再映射到低维空间中。
利用支持向量机预测股票涨跌
在利用支持向量机进行预测之前,先将数据集分为训练集和测试集。常用的分类方法是将数据及进行8:2分解,0.8部分是训练集,0.2部分是测试集。用训练集训练模型,再用测试集评价模型的准确率等指标。
在利用支持向量机预测时,还有很重要的一步是进行参数优化。SVM的参数包括以下几个。
还有一些其他的参数,因为本示例不对其进行优化,所以这里不再赘述了。
参数优化
2. 策略思路
第一步:获取原始数据,这里获取2016-04-01到2017-07-30的数据。
第二步:计算SVM模型的输入变量。
x 表示输入的特征值,共7个,分别为:
y 表示5个交易日后收盘价是否上涨,
第三步:利用训练好的模型预测股价未来走向。若上涨(y=1)则开仓。
第四步:设置止损止盈点。
若已经持有仓位则在盈利大于10%的时候止盈,在星期五损失大于2%的时候止损。
回测时间:2017-07-01 09:00:00 到 2017-10-01 09:00:00
回测初始资金:1000万
回测标的:SHSE.600000
3. 策略代码
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import sys
import datetime
import numpy as np
try:from sklearn import svm
except:print('请安装scikit-learn库和带mkl的numpy')sys.exit(-1)'''
示例策略仅供参考,不建议直接实盘使用。本策略以支持向量机算法为基础,训练一个二分类(上涨/下跌)的模型,模型以历史15天数据的数据预测未来5天的涨跌与否。
特征变量为:1.收盘价/均值、2.现量/均量、3.最高价/均价、4.最低价/均价、5.现量、6.区间收益率、7.区间标准差。
若没有仓位,则在每个星期一预测涨跌,并在预测结果为上涨的时候购买标的.
若已经持有仓位,则在盈利大于10%的时候止盈,在星期五涨幅小于2%的时候止盈止损.
'''def init(context):# 股票标的context.symbol = 'SHSE.600000'# 历史窗口长度context.history_len = 10# 预测窗口长度context.forecast_len = 5# 训练样本长度context.training_len = 90# 20天为一个交易月# 止盈幅度context.earn_rate = 0.10# 最小涨幅卖出幅度context.sell_rate = 0.02# 订阅行情subscribe(symbols=context.symbol, frequency='60s')def on_bar(context, bars):bar = bars[0]# 当前时间now = context.now# 获取当前时间的星期weekday = now.isoweekday()# 上一交易日last_date = get_previous_trading_date(exchange='SZSE', date=now)# 上一年的交易日last_year_date = get_previous_N_trading_date(last_date,counts=context.training_len,exchanges='SHSE')# 获取持仓position = context.account().position(symbol=context.symbol, side=PositionSide_Long)# 如果当前时间是星期一且没有仓位,则开始预测if weekday == 1 and now.hour==9 and now.minute==31 and not position:# 获取预测用的历史数据features = clf_fit(context,last_year_date,last_date)features = np.array(features).reshape(1, -1)prediction = context.clf.predict(features)[0]# 若预测值为上涨则买入if prediction == 1:order_target_percent(symbol=context.symbol, percent=1, order_type=OrderType_Market,position_side=PositionSide_Long)# 当涨幅大于10%,平掉所有仓位止盈elif position and bar.close/position['vwap'] >= 1+context.earn_rate:order_close_all()# 当时间为周五尾盘并且涨幅小于2%时,平掉所有仓位止损elif position and weekday == 5 and bar.close/position['vwap'] < 1+context.sell_rate and now.hour==14 and now.minute==55:order_close_all()def on_order_status(context, order):# 标的代码symbol = order['symbol']# 委托价格price = order['price']# 委托数量volume = order['volume']# 目标仓位target_percent = order['target_percent']# 查看下单后的委托状态,等于3代表委托全部成交status = order['status']# 买卖方向,1为买入,2为卖出side = order['side']# 开平仓类型,1为开仓,2为平仓effect = order['position_effect']# 委托类型,1为限价委托,2为市价委托order_type = order['order_type']if status == 3:if effect == 1:if side == 1:side_effect = '开多仓'elif side == 2:side_effect = '开空仓'else:if side == 1:side_effect = '平空仓'elif side == 2:side_effect = '平多仓'order_type_word = '限价' if order_type==1 else '市价'print('{}:标的:{},操作:以{}{},委托价格:{},委托数量:{}'.format(context.now,symbol,order_type_word,side_effect,price,volume))def clf_fit(context,start_date,end_date):"""训练支持向量机模型:param start_date:训练样本开始时间:param end_date:训练样本结束时间"""# 获取目标股票的daily历史行情recent_data = history(context.symbol, frequency='1d', start_time=start_date, end_time=end_date, fill_missing='last',df=True).set_index('eob')days_value = recent_data['bob'].valuesdays_close = recent_data['close'].valuesdays = list(recent_data['bob'])x_train = []y_train = []# 整理训练数据for index in range(context.history_len, len(recent_data)):## 自变量 X# 回溯N个交易日相关数据start_date = recent_data.index[index-context.history_len]end_date = recent_data.index[index]data = recent_data.loc[start_date:end_date,:]# 准备训练数据close = data['close'].valuesmax_x = data['high'].valuesmin_n = data['low'].valuesvolume = data['volume'].valuesclose_mean = close[-1] / np.mean(close) # 收盘价/均值volume_mean = volume[-1] / np.mean(volume) # 现量/均量max_mean = max_x[-1] / np.mean(max_x) # 最高价/均价min_mean = min_n[-1] / np.mean(min_n) # 最低价/均价vol = volume[-1] # 现量return_now = close[-1] / close[0] # 区间收益率std = np.std(np.array(close), axis=0) # 区间标准差# 将计算出的指标添加到训练集Xx_train.append([close_mean, volume_mean, max_mean, min_mean, vol, return_now, std])## 因变量 Yif index<len(recent_data)-context.forecast_len:y_start_date = recent_data.index[index+1]y_end_date = recent_data.index[index+context.forecast_len]y_data = recent_data.loc[y_start_date:y_end_date,'close']if y_data[-1] > y_data[0]:label = 1else:label = 0y_train.append(label)# 最新一期的数据(返回该数据,作为待预测的数据)if index==len(recent_data)-1:new_x_traain = [close_mean, volume_mean, max_mean, min_mean, vol, return_now, std]else:# 剔除最后context.forecast_len期的数据x_train = x_train[:-context.forecast_len]# 训练SVMcontext.clf = svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, verbose=False, max_iter=-1,decision_function_shape='ovr', random_state=None)context.clf.fit(x_train, y_train)# 返回最新数据return new_x_traaindef get_previous_N_trading_date(date,counts=1,exchanges='SHSE'):"""获取end_date前N个交易日,end_date为datetime格式,包括date日期:param date:目标日期:param counts:历史回溯天数,默认为1,即前一天"""if isinstance(date,str) and len(date)>10:date = datetime.datetime.strptime(date,'%Y-%m-%d %H:%M:%S')if isinstance(date,str) and len(date)==10:date = datetime.datetime.strptime(date,'%Y-%m-%d')previous_N_trading_date = get_trading_dates(exchange=exchanges, start_date=date-datetime.timedelta(days=max(counts+30,counts*2)), end_date=date)[-counts]return previous_N_trading_datedef on_backtest_finished(context, indicator):print('*'*50)print('回测已完成,请通过右上角“回测历史”功能查询详情。')if __name__ == '__main__':'''strategy_id策略ID,由系统生成filename文件名,请与本文件名保持一致mode实时模式:MODE_LIVE回测模式:MODE_BACKTESTtoken绑定计算机的ID,可在系统设置-密钥管理中生成backtest_start_time回测开始时间backtest_end_time回测结束时间backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POSTbacktest_initial_cash回测初始资金backtest_commission_ratio回测佣金比例backtest_slippage_ratio回测滑点比例'''run(strategy_id='strategy_id',filename='main.py',mode=MODE_BACKTEST,token='{{token}}',backtest_start_time='2021-02-01 09:00:00',backtest_end_time='2021-02-28 09:00:00',backtest_adjust=ADJUST_PREV,backtest_initial_cash=10000000,backtest_commission_ratio=0.0001,backtest_slippage_ratio=0.0001)
4. 回测结果与稳健性分析
设定初始资金1000万,手续费率为0.01%,滑点比率为0.01%。回测结果如下图所示。
回测期累计收益率为9.30%,年化收益率为38.13%,沪深300指数收益率为5.09%,策略收益率跑输指数。策略最大回撤为0.56%,胜率50.0%。
为了检验策略的稳健性,改变回测时间,得到结果如下。
由上表可知,策略整体收益均小于0,远远跑输基准水平。
注:来自掘金量化
支持向量机(股票)——Python量化相关推荐
- 股票python量化交易002-常见量化指标(技术面)
量化指标入口 认识东方财富平台 东方财富网:财经门户,提供专业的财经.股票.行情.证券.基金.理财.银行.保险.信托.期货.黄金.股吧.博客等各类财经资讯及数据 进入东方财富官网,从下图可以看出: 1 ...
- 日内回转交易(股票)——Python量化
目录 1. 原理 1.1 日内回转交易 1.2 股票的日内回转交易 1.3 MACD指标简介 2. 策略思路 3. 策略代码 4. 回测结果与稳健性分析 1. 原理 1.1 日内回转交易 日内回转交易 ...
- 小市值(股票)——Python量化
小市值策略(股票) (以下部分内容参考<因子投资:方法与实践>一书) 目录 小市值策略(股票) 1. 原理 1.1 因子投资 1.2 规模因子 2. 策略逻辑 3. 策略代码 4. 回测结 ...
- 指数增强(股票)——Python量化
指数增强策略 目录 指数增强策略 1. 策略原理 2. 策略步骤 3. 策略代码 4. 回测结果和稳健性分析 1. 策略原理 说到指数增强,就不得不说指数. 在进行股票投资时,有一种分类方式是将投资分 ...
- 股票python量化交易008-JoinQuant中JQData的使用
查阅JoinQuant中JQData的使用文档 python代码实现 导入JQData,并认证用户身份.认证完毕显示"auth success"后即可使用 from jqdatas ...
- 布林线均值回归(股票)——Python量化
布林线均值回归策略 目录 布林线均值回归策略 1. 原理 2. 策略思路 3. 策略代码 4. 回测结果与稳健性分析 1. 原理 提起布林线均值回归策略,就不得不提布林带这个概念.布林带是利用统计学中 ...
- 行业轮动(股票)——Python量化
行业轮动策略 目录 行业轮动策略 1. 原理 行业轮动现象 行业轮动的原因 行业轮动下资产配置 1. 美林时钟:大类资产配置 2. 策略设计 2. 策略思路 3. 策略代码 4. 回测结果分析与稳健性 ...
- 股票python量化交易002-常见量化指标(基本面)
基本面指标有哪些? 除了boll/kdj/macd等技术指标,还有基本面指标.基本面指标主要有股票价格,成交量,财务等宏观指标. 财务指标很重要 对应巴菲特说的价值投资. 在炒股软件中按F10就会出现 ...
- 股票python量化交易010-JQData财务指标
认识财务报表 财务指标数据 这里说的财务指标数据是我们平时看到的股票市值,负债数据,现金数据,利润数据等一系统财务相关的值通过运算生成的一份财务指标数据,如EPS,ROE等 eps 每股收益EPS(元 ...
最新文章
- hdu5249KPI动态中位数(两个set)
- 类型转换与采样 || SMOTE算法
- Oracle 游标使用全解
- 201209阶段二FFmpeg转码
- Python 自动生成环境依赖包 requirements
- JS如何截取两个字符串之间及字符串前后内容 - 代码篇
- 线程、多线程和线程池,看完这些你就能全部搞懂了
- mysql 存储时间 时间戳_具体场景下MySQL中用“时间戳”存储时间的问题
- iOS 封装跑马灯和轮播效果
- The type 'System.Object' is defined in an assembly that is not referenced
- 刚刚修复的Windows 0day和Chrome 0day 已被组合用于 WizardOpium 攻击(详解)
- SQLCE数据库的几点研究
- 终极之战:Linux Windows
- SqlHelper和数据访问层
- (笔记)记录Sql中一些例子和常用语法
- 聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】01_电商秒杀商品回顾
- monkey的基本操作命令
- 选中Checkbox,则向数组中增加其所属条目的某个属性值,取消选中,则删除。
- (a++) + (++a)
- UOS将字体制作成软件包,可双击安装
热门文章
- 软件自动化测试框架STAF概述
- 惠普关闭 secure boot
- twr java_Java7新特性 - TWR(try-with-resources)
- ScrollMagic结合TweenMax的Demo
- 电脑可以用的免费配音软件,语音识别,语音转文字,文字转语音。
- 还未挥洒热血,却道了离别(内涵高质量毕业答辩PPT模板)
- it职业生涯_如何通过这些有用的网站提升您的自由职业生涯
- $wnd and $doc Calling native JavaScript with JSNI
- Android常用颜色收集colors.xml
- ZeroDivisionError: integer division or modulo by zero