• QQ空间
  • 回复
  • 收藏

【宽客策略源码】机器学习(股票)

geek168 数据策略 2019-8-11 16:07 81998人围观

本策略选取了七个特征变量组成了滑动窗口长度为15天的训练集,随后训练了一个二分类(上涨/下跌)的支持向量机模型.
若没有仓位则在每个星期一的时候输入标的股票近15个交易日的特征变量进行预测,并在预测结果为上涨的时候购买标的.
若已经持有仓位则在盈利大于10%的时候止盈,在星期五损失大于2%的时候止损.
特征变量为:1.收盘价/均值2.现量/均量3.最高价/均价4.最低价/均价5.现量6.区间收益率7.区间标准差

训练数据为:SHSE.600000浦发银行,时间从2016-03-01到2017-06-30
回测时间为:2017-07-01 09:00:00到2017-10-01 09:00:00



  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from datetime import datetime
  4. import numpy as np
  5. from gm.api import *
  6. import sys
  7. try:
  8.     from sklearn import svm
  9. except:
  10.     print('请安装scikit-learn库和带mkl的numpy')
  11.     sys.exit(-1)

  12. def init(context):
  13.     # 订阅浦发银行的分钟bar行情
  14.     context.symbol = 'SHSE.600000'
  15.     subscribe(symbols=context.symbol, frequency='60s')
  16.     start_date = '2016-03-01'  # SVM训练起始时间
  17.     end_date = '2017-06-30'  # SVM训练终止时间
  18.     # 用于记录工作日
  19.     # 获取目标股票的daily历史行情
  20.     recent_data = history(context.symbol, frequency='1d', start_time=start_date, end_time=end_date, fill_missing='last',
  21.                           df=True)
  22.     days_value = recent_data['bob'].values
  23.     days_close = recent_data['close'].values
  24.     days = []
  25.     # 获取行情日期列表
  26.     print('准备数据训练SVM')
  27.     for i in range(len(days_value)):
  28.         days.append(str(days_value[i])[0:10])
  29.     x_all = []
  30.     y_all = []
  31.     for index in range(15, (len(days) - 5)):
  32.         # 计算三星期共15个交易日相关数据
  33.         start_day = days[index - 15]
  34.         end_day = days[index]
  35.         data = history(context.symbol, frequency='1d', start_time=start_day, end_time=end_day, fill_missing='last',
  36.                        df=True)
  37.         close = data['close'].values
  38.         max_x = data['high'].values
  39.         min_n = data['low'].values
  40.         amount = data['amount'].values
  41.         volume = []
  42.         for i in range(len(close)):
  43.             volume_temp = amount[i] / close[i]
  44.             volume.append(volume_temp)
  45.         close_mean = close[-1] / np.mean(close)  # 收盘价/均值
  46.         volume_mean = volume[-1] / np.mean(volume)  # 现量/均量
  47.         max_mean = max_x[-1] / np.mean(max_x)  # 最高价/均价
  48.         min_mean = min_n[-1] / np.mean(min_n)  # 最低价/均价
  49.         vol = volume[-1]  # 现量
  50.         return_now = close[-1] / close[0]  # 区间收益率
  51.         std = np.std(np.array(close), axis=0)  # 区间标准差
  52.         # 将计算出的指标添加到训练集X
  53.         # features用于存放因子
  54.         features = [close_mean, volume_mean, max_mean, min_mean, vol, return_now, std]
  55.         x_all.append(features)
  56.     # 准备算法需要用到的数据
  57.     for i in range(len(days_close) - 20):
  58.         if days_close[i + 20] > days_close[i + 15]:
  59.             label = 1
  60.         else:
  61.             label = 0
  62.         y_all.append(label)
  63.     x_train = x_all[: -1]
  64.     y_train = y_all[: -1]
  65.     # 训练SVM
  66.     context.clf = svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,
  67.                           tol=0.001, cache_size=200, verbose=False, max_iter=-1,
  68.                           decision_function_shape='ovr', random_state=None)
  69.     context.clf.fit(x_train, y_train)
  70.     print('训练完成!')
  71. def on_bar(context, bars):
  72.     bar = bars[0]
  73.     # 获取当前年月日
  74.     today = bar.bob.strftime('%Y-%m-%d')
  75.     # 获取数据并计算相应的因子
  76.     # 于星期一的09:31:00进行操作
  77.     # 当前bar的工作日
  78.     weekday = datetime.strptime(today, '%Y-%m-%d').isoweekday()
  79.     # 获取模型相关的数据
  80.     # 获取持仓
  81.     position = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  82.     # 如果bar是新的星期一且没有仓位则开始预测
  83.     if not position and weekday == 1:
  84.         # 获取预测用的历史数据
  85.         data = history_n(symbol=context.symbol, frequency='1d', end_time=today, count=15,
  86.                          fill_missing='last', df=True)
  87.         close = data['close'].values
  88.         train_max_x = data['high'].values
  89.         train_min_n = data['low'].values
  90.         train_amount = data['amount'].values
  91.         volume = []
  92.         for i in range(len(close)):
  93.             volume_temp = train_amount[i] / close[i]
  94.             volume.append(volume_temp)
  95.         close_mean = close[-1] / np.mean(close)
  96.         volume_mean = volume[-1] / np.mean(volume)
  97.         max_mean = train_max_x[-1] / np.mean(train_max_x)
  98.         min_mean = train_min_n[-1] / np.mean(train_min_n)
  99.         vol = volume[-1]
  100.         return_now = close[-1] / close[0]
  101.         std = np.std(np.array(close), axis=0)
  102.         # 得到本次输入模型的因子
  103.         features = [close_mean, volume_mean, max_mean, min_mean, vol, return_now, std]
  104.         features = np.array(features).reshape(1, -1)
  105.         prediction = context.clf.predict(features)[0]
  106.         # 若预测值为上涨则开仓
  107.         if prediction == 1:
  108.             # 获取昨收盘价
  109.             context.price = close[-1]
  110.             # 把浦发银行的仓位调至95%
  111.             order_target_percent(symbol=context.symbol, percent=0.95, order_type=OrderType_Market,
  112.                                  position_side=PositionSide_Long)
  113.             print('SHSE.600000以市价单开多仓到仓位0.95')
  114.     # 当涨幅大于10%,平掉所有仓位止盈
  115.     elif position and bar.close / context.price >= 1.10:
  116.         order_close_all()
  117.         print('SHSE.600000以市价单全平多仓止盈')
  118.     # 当时间为周五并且跌幅大于2%时,平掉所有仓位止损
  119.     elif position and bar.close / context.price < 1.02 and weekday == 5:
  120.         order_close_all()
  121.         print('SHSE.600000以市价单全平多仓止损')
  122. if __name__ == '__main__':
  123.     '''
  124.     strategy_id策略ID,由系统生成
  125.     filename文件名,请与本文件名保持一致
  126.     mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  127.     token绑定计算机的ID,可在系统设置-密钥管理中生成
  128.     backtest_start_time回测开始时间
  129.     backtest_end_time回测结束时间
  130.     backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  131.     backtest_initial_cash回测初始资金
  132.     backtest_commission_ratio回测佣金比例
  133.     backtest_slippage_ratio回测滑点比例
  134.     '''
  135.     run(strategy_id='strategy_id',
  136.         filename='main.py',
  137.         mode=MODE_BACKTEST,
  138.         token='token_id',
  139.         backtest_start_time='2017-07-01 09:00:00',
  140.         backtest_end_time='2017-10-01 09:00:00',
  141.         backtest_adjust=ADJUST_PREV,
  142.         backtest_initial_cash=10000000,
  143.         backtest_commission_ratio=0.0001,
  144.         backtest_slippage_ratio=0.0001)
复制代码


机器学习.png


路过

雷人

握手

鲜花

鸡蛋
原作者: abctrader
关注微信