【量化课程】08_1.机器学习量化策略基础实战

news2024/11/24 6:37:04

文章目录

    • 1. 常用机器学习模型
      • 1.1 回归模型
      • 1.2 分类模型
        • 1.2.1 SVC介绍
        • 1.2.2 SVC在量化策略中的应用
    • 2. 机器学习量化策略实现的基本步骤
    • 3. 策略实现

1. 常用机器学习模型

1.1 回归模型

  • 线性回归
  • 多层感知器回归
  • 自适应提升树回归
  • 随机森林回归

1.2 分类模型

  • 线性分类
  • 支持向量机
  • XGBoost分类
  • K近邻分类

1.2.1 SVC介绍

SVC(Support Vector Classifier)是一种在机器学习中常用的分类算法,它基于支持向量机(Support Vector Machine)算法。SVC通过寻找最佳的超平面来实现分类任务,在数据平面上进行线性或非线性的划分。

1.2.2 SVC在量化策略中的应用

在量化策略中,SVC(Support Vector Classifier)可以用于股票预测和交易决策。以下是SVC在量化策略中的应用步骤:

  • 数据准备:首先,需要准备训练数据和测试数据。训练数据包括历史股票价格和相关特征,以及对应的标签(例如涨跌幅度)。测试数据包括最新的股票价格和特征,用于进行预测。

  • 特征工程:根据历史股票数据,使用技术指标或其他特征工程方法构建特征。这些特征可能包括移动平均线、波动性指标、成交量等。

  • 数据预处理:将训练数据和测试数据进行标准化,使其均值为0,方差为1。这可以提高分类算法的性能。

  • 训练模型:使用训练数据训练SVC模型。在训练过程中,SVC将学习股票的价格模式和特征之间的关系。

  • 模型预测:使用训练好的SVC模型对测试数据进行预测。根据预测结果,判断股票是涨还是跌。

  • 交易决策:根据预测结果进行交易决策。例如,如果SVC预测股票会涨,可以选择买入;如果SVC预测股票会跌,可以选择卖出或不做操作。

  • 交易执行:根据交易决策执行相应的交易操作。这可能涉及到下单、调整仓位等操作。

  • 盈亏评估:根据交易结果评估策略的盈亏情况。可以计算交易收益、回撤等指标,进行策略的优化和调整。

需要注意的是,SVC作为机器学习算法,对数据的准备和特征工程至关重要。合理选择特征和调整参数可以显著影响SVC的预测性能。此外,量化策略中还需要考虑交易成本、风险管理和市场流动性等因素,以构建更加完整和可靠的策略。

2. 机器学习量化策略实现的基本步骤

  1. 加载数据
  2. 标注数据
  3. 特征工程,分割训练集和测试集
  4. 选择机器学习模型并配置适当的参数
  5. 训练模型
  6. 利用模型数据样本之外的数据进行回测
  7. 对回测结果进行可视化

3. 策略实现

本部分将介绍如何在BigQuant实现一个基于支持向量机模型的选股策略

from biglearning.api import M
from biglearning.api import tools as T
from bigdatasource.api import DataSource
from biglearning.module2.common.data import Outputs
from zipline.finance.commission import PerOrder


# 对训练数据和测试数据进行标准化处理
def m6_run_bigquant_run(input_1, input_2, input_3):
    train_df = input_1.read()
    features = input_2.read()
    feature_min = train_df[features].quantile(0.005)
    feature_max = train_df[features].quantile(0.995)
    train_df[features] = train_df[features].clip(feature_min,feature_max,axis=1) 
    data_1 = DataSource.write_df(train_df)
    test_df = input_3.read()
    test_df[features] = test_df[features].clip(feature_min,feature_max,axis=1)
    data_2 = DataSource.write_df(test_df)
    return Outputs(data_1=data_1, data_2=data_2, data_3=None)

# 后处理函数
def m6_post_run_bigquant_run(outputs):
    return outputs

# 处理每个交易日的数据
def m4_handle_data_bigquant_run(context, data):
    context.extension['index'] += 1
    if  context.extension['index'] % context.rebalance_days != 0:
        return 
    
    date = data.current_dt.strftime('%Y-%m-%d')
    
    cur_data = context.indicator_data[context.indicator_data['date'] == date]

    cur_data = cur_data[cur_data['pred_label'] == 1.0]
    
    stock_to_buy =  list(cur_data.sort_values('instrument',ascending=False).instrument)[:context.stock_num]
    if date == '2017-02-06':
        print(date, len(stock_to_buy), stock_to_buy)

    # 获取当前持仓股票
    stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
    
    # 需要保留的股票
    no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]

    # 需要卖出的股票
    stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]
  

    for stock in stock_to_sell:
        if data.can_trade(context.symbol(stock)):
            context.order_target_percent(context.symbol(stock), 0)
    
    if len(stock_to_buy) == 0:
        return

    weight =  1 / len(stock_to_buy)
    
    for stock in stock_to_buy:
        if data.can_trade(context.symbol(stock)):
            context.order_target_percent(context.symbol(stock), weight)
 
# 准备工作
def m4_prepare_bigquant_run(context):
    pass

# 初始化策略
def m4_initialize_bigquant_run(context):
    context.indicator_data = context.options['data'].read_df()
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    context.rebalance_days = 5
    context.stock_num = 50
    if 'index' not in context.extension:
        context.extension['index'] = 0


# 开盘前处理函数
def m4_before_trading_start_bigquant_run(context, data):
    pass


# 获取2020年至2021年股票数据
m1 = M.instruments.v2(
    start_date='2020-01-01',
    end_date='2021-01-01',
    market='CN_STOCK_A',
    instrument_list='',
    max_count=0
)

# 使用高级自动标注器获取标签
m2 = M.advanced_auto_labeler.v2(
    instruments=m1.data,
    label_expr="""shift(close, -5) / shift(open, -1)-1
rank(label)
where(label>=0.95,1,0)""",
    start_date='',
    end_date='',
    benchmark='000300.SHA',
    drop_na_label=False,
    cast_label_int=False
)

# 输入特征
m3 = M.input_features.v1(
    features="""(close_0-mean(close_0,12))/mean(close_0,12)*100
rank(std(amount_0,15))
rank_avg_amount_0/rank_avg_amount_8
ts_argmin(low_0,20)
rank_return_30
(low_1-close_0)/close_0
ta_bbands_lowerband_14_0
mean(mf_net_pct_s_0,4)
amount_0/avg_amount_3
return_0/return_5
return_1/return_5
rank_avg_amount_7/rank_avg_amount_10
ta_sma_10_0/close_0
sqrt(high_0*low_0)-amount_0/volume_0*adjust_factor_0
avg_turn_15/(turn_0+1e-5)
return_10
mf_net_pct_s_0
(close_0-open_0)/close_1
 """
)

# 抽取基础特征
m15 = M.general_feature_extractor.v7(
    instruments=m1.data,
    features=m3.data,
    start_date='',
    end_date='',
    before_start_days=0
)

# 提取派生特征
m16 = M.derived_feature_extractor.v3(
    input_data=m15.data,
    features=m3.data,
    date_col='date',
    instrument_col='instrument',
    drop_na=False,
    remove_extra_columns=False
)

# 合并标签和特征
m7 = M.join.v3(
    data1=m2.data,
    data2=m16.data,
    on='date,instrument',
    how='inner',
    sort=False
)

# 删除缺失值
m13 = M.dropnan.v1(
    input_data=m7.data
)

# 获取2021年至2022年股票数据
m9 = M.instruments.v2(
    start_date=T.live_run_param('trading_date', '2021-01-01'),
    end_date=T.live_run_param('trading_date', '2022-01-01'),
    market='CN_STOCK_A',
    instrument_list='',
    max_count=0
)

# 抽取基础特征
m17 = M.general_feature_extractor.v7(
    instruments=m9.data,
    features=m3.data,
    start_date='',
    end_date='',
    before_start_days=0
)

# 提取派生特征
m18 = M.derived_feature_extractor.v3(
    input_data=m17.data,
    features=m3.data,
    date_col='date',
    instrument_col='instrument',
    drop_na=False,
    remove_extra_columns=False
)

# 删除缺失值
m14 = M.dropnan.v1(
    input_data=m18.data
)

# 标准化训练数据和测试数据
m6 = M.cached.v3(
    input_1=m13.data,
    input_2=m3.data,
    input_3=m14.data,
    run=m6_run_bigquant_run,
    post_run=m6_post_run_bigquant_run,
    input_ports='',
    params='{}',
    output_ports=''
)

# 对数据进行RobustScaler标准化处理
m8 = M.RobustScaler.v13(
    train_ds=m6.data_1,
    features=m3.data,
    test_ds=m6.data_2,
    scale_type='standard',
    quantile_range_min=0.01,
    quantile_range_max=0.99,
    global_scale=True
)

# 使用SVC进行训练和预测
m10 = M.svc.v1(
    training_ds=m8.train_data,
    features=m3.data,
    predict_ds=m8.test_data,
    C=1,
    kernel='rbf',
    degree=3,
    gamma=-1,
    coef0=0,
    tol=0.1,
    max_iter=100,
    key_cols='date,instrument',
    other_train_parameters={}
)

# 创建交易策略实例
m4 = M.trade.v4(
    instruments=m9.data,
    options_data=m10.predictions,
    start_date='',
    end_date='',
    handle_data=m4_handle_data_bigquant_run,
    prepare=m4_prepare_bigquant_run,
    initialize=m4_initialize_bigquant_run,
    before_trading_start=m4_before_trading_start_bigquant_run,
    volume_limit=0,
    order_price_field_buy='open',
    order_price_field_sell='open',
    capital_base=10000000,
    auto_cancel_non_tradable_orders=True,
    data_frequency='daily',
    price_type='后复权',
    product_type='股票',
    plot_charts=True,
    backtest_only=False,
    benchmark=''
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openLayers实战(五):overlay绘制标记

引入与创建overlay import Overlay from "ol/Overlay";// 创建map实例以及其他地图操作请看前几篇文章 // 省略2k行代码methods: {creatMark(markDom, txt, idstr) {if (markDom null) {markDom document.createElement("div");if (txt) {ma…

2024」预备研究生mem-阴影图形

一、阴影图形 二、课后题

java 加载商户API私钥 (pem证书私钥)

1. pem证书放在resources目录下 2. 加载证书的工具类 import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; // 商户API私钥 (把证书放在项目路径下, 然后加载出来), 加载证书的工具类PrivateKey merchantPrivateKey PemUtil.loadPrivateKey(new FileInp…

深入探究进程、线程和协程:并发编程的三重境界

文章目录 🍀引言🍀进程:隔离的执行环境🍀概念🍀应用场景🍀代码演示 🍀线程:轻量级的执行单元🍀概念🍀应用场景🍀代码演示 🍀协程&…

文件恢复软件推荐!这款你值得拥有!

“朋友们,怎么会有人总是在清理电脑的时候把重要的文件一起删掉啊?我真的每次只要一清理电脑,重要文件必不见!大家有什么比较实用的文件恢复软件推荐吗?感谢!” 使用电脑时误删文件已经是一件比较常见的事情…

1.MySQL数据库的基本操作

数据库操作过程: 1.用户在客户端输入 SQL 2.客户端会把 SQL 通过网络发送给服务器 3.服务器执行这个 SQL,把结果返回给客户端 4.客户端收到结果,显示到界面上 数据库的操作 这里的数据库不是代表一个软件,而是代表一个数据集合。 显示当前的数据库 …

【编码魔法师系列_六大原则5】迪米特原则(Law of Demeter Principle)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

DolphinDB 入选 Gartner《中国数据库市场指南》代表厂商

近日,国际知名研究机构 Gartner 发布2023年《中国 DBMS 市场指南(Market Guide for DBMS, China)》研究报告,在中国范围内评估并重点推荐了36家极具实力的企业,DolphinDB 以领先的技术和商业能力顺势入榜。 DolphinDB …

Mybatis 源码 ② :流程分析

文章目录 一、前言二、Mybatis 初始化1. AutoConfiguredMapperScannerRegistrar2. MapperScannerConfigurer3. ClassPathMapperScanner3.1 ClassPathMapperScanner#scan3.2 ClassPathMapperScanner#processBeanDefinitions 4. 总结 三、 Mapper Interface 的创建1. MapperFacto…

3段代码详解python中的单线程、多线程和多进程

目录 1. 单线程: 2. 多线程: 3. 多进程: 什么时候使用单线程、多线程和多进程 总结 在并发编程中,使用适当的并发模型可以提高程序执行效率和性能。Python提供了单线程、多线程和多进程三种方式来实现并发执行任务。 单线程…

护眼灯买哪种好,2023护眼台灯推荐

护眼台灯的光照一般比较均匀,相比普通台灯,一般具有防蓝光、防频闪等功能,能够提供一个健康舒适的学习、生活灯光环境,建议选购内置智能感光模式的护眼台灯,以确保灯光亮度一直处于均衡状态,让眼睛更轻松。…

从源代码编译构建Apach Spark3.2.4

从源代码编译构建Apach Spark3.2.4 编译说明编译Apache Spark下载源码构建环境准备使用本地Maven构建更改Scala版本下载Jar包构建可运行的发行版构建异常构建成功 运行测试 编译说明 对于大多数用户来说,使用官方预编译版本的Spark已经足够满足日常需求。只有在特定…

Hands on RL 之 Proximal Policy Optimization (PPO)

Hands on RL 之 Proximal Policy Optimization (PPO) 文章目录 Hands on RL 之 Proximal Policy Optimization (PPO)1. 回顾Policy Gradient和TRPO2. PPO (Clip)3. PPO(Penalty)4. PPO中Advantage Function的计算5.实现 PPO-ClipReference 1. 回顾Policy Gradient和TRPO ​ 首…

构建Actual网页客户端镜像

什么是 Actual ? Actual 是一款超快速且注重隐私的本地优先的财务应用程序,用于管理您的财务。其核心是经过充分验证且深受喜爱的信封预算方法。它是 100% 免费和开源的。 Actual 具有多设备同步、可选的端到端加密等等功能。默认情况下,它不…

ssm医院门诊挂号系统源码和论文PPT

ssm医院门诊挂号系统源码和论文PPT008 开题报告 任务书 源码 数据库sql 论文 开发环境: 开发工具:idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具:navcat,小海豚等 开发技术:java ssm tomcat8.5 1.选题的背景和意义 …

高性能MySQL实战(二):索引

大家好,我是 方圆。我们在上篇 高性能MySQL实战(一):表结构 中已经建立好了表结构,这篇我们则是针对已有的表结构和搜索条件为表创建索引。除此之外,我还会讲一些关于索引必须要了解的知识。原文收录在我的…

原来这才叫休息!——科学家揭示真正的“休息模式”

什么叫做休息?好好休息个周末?好好出去旅游一下?但事实上,往往越休息越感觉累。为什么呢?也许我们对休息存在误解,这篇文章会帮我们分析究竟该如何休息。 为什么你睡了11个小时仍然觉得疲累?为什…

【量化课程】06_化调仓策略

文章目录 6.1 如何衡量投资组合的收益率6.1.1 投资组合收益率的计算方法6.1.2 投资组合的绝对收益率和相对收益率 6.2 如何衡量投资组合的风险6.2.1 风险的定义6.2.2 投资组合的风险6.2.3 衡量投资组合的风险 6.3 最优化方法计算投资组合的最佳仓位6.3.1 等权重6.3.2 市值加权6…

Linux下常见的代理服务器软件介绍

在Linux系统中,代理服务器是我们搭建网络环境和处理网络请求的常用工具。但是,你知道Linux下常见的代理服务器软件有哪些吗?本文将为你带来对几款常见的Linux代理服务器软件的介绍,帮助你选择适合的代理服务器。 一、Squid&#…

根据数组中元素的位置号x,y和指定的计算规则z=f(x,y)创建数组,让x,y位置上的值是znp.fromfunction()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 根据数组中元素的位置号x,y 和指定的计算规则zf(x,y) 创建数组,让x,y位置上的值是z np.fromfunction() 选择题 下列说法错误的是? import numpy as np def func(i, j): return …