同花顺Supermind量化交易 从决策树到随机森林--附源代码

本文介绍了使用决策树和随机森林进行量化交易的实践过程。首先,通过导入库包和处理数据,然后分别对决策树进行训练和测试,评估其样本内外预测能力。接着,转向随机森林的训练,展示其在评价因子数据上的应用,并呈现随机森林的绩效。整个过程旨在揭示这两种算法在复杂金融问题中的应用优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常情况下,我们使用线性去回归因子数据,用来解释因子对于收益的贡献程度。但事实情况下,此类方法过于简单,且市场收益并不一定与各类因子线性相关,难以达到预期效果。众所周知,树是机器学习中的一类算法,决策树算法则是其中的基础,而随机森林则是利用多棵决策树对样本进行训练并预测的一种算法。它们不同于支持向量机,KNN等需要大量数据前处理,且能处理复杂问题。

从决策树到随机森林

作者:邱吉尔

1. 导入库包

In [1]:

import pandas as pd 
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestClassifier
plt.style.use('seaborn')

2. 获取数据和数据合并处理

In [2]:

start_date='2017-01-01'
end_date='2019-01-21'

start_date=datetime.datetime.strptime(start_date,'%Y-%m-%d')
end_date=datetime.datetime.strptime(end_date,'%Y-%m-%d')

stock_list1=get_index_stocks('000300.SH',start_date)
stock_list2=get_index_stocks('000300.SH',end_date)
stock_list=list(set(stock_list1).intersection(set(stock_list2))) 

flag=True

for stock in stock_list:
    
    trade_days = get_trade_days(start_date, end_date).strftime('%Y-%m-%d')
    q = query(
      factor.date,
      factor.symbol,
      #趋势性
      factor.bbi,factor.ma,factor.expma,factor.priceosc,factor.ddi,
      #反趋势
      factor.bias, factor.cci,factor.dbcd,factor.dpo,factor.kdj, 
      #能量型
      factor.arbr,factor.cr,factor.psy,factor.vr_rate,factor.wad,
      #量价指标
      factor.mfi,factor.obv,factor.pvt,factor.wvad,
      #压力支撑型
      factor.bbiboll,factor.boll,factor.cdp,factor.env,factor.mike,
      #成交量
      factor.vr,factor.vma,factor.vmacd,factor.vosc,factor.vstd,factor.tapi,
      #超买超卖
      factor.adtm,
      #摆动类
      factor.mi,factor.micd,factor.rc,factor.rccd,factor.srmi,
      #强弱型
      factor.dptb,factor.jdqs,factor.jdrs,factor.zdzb,factor.atr,factor.mass,
      #日期类
      factor.up_n,factor.down_n  
    ).filter(
      factor.symbol==stock,
      factor.date.in_(trade_days)
    )
    df = get_factors(q)

    for i in range(len(df['factor_symbol'])):
        try:
            df.ix[i,'price']=get_price(df.ix[i,'factor_symbol'], None,df.ix[i,'factor_date'], '1d', ['close'], True, None,1, is_panel=1)['close'].ix[0,0]
        except:
            continue

    df['return']=df['price']/df['price'].shift(1)-1
    df['next_return']=df['return'].shift(-1)
    df['mtm5']=df['price']/df['price'].shift(5)-1
    df['next_mtm5']=df['mtm5'].shift(-1)
    df.dropna(inplace=True)
    #print(df)    
    
    if flag:
        flag=False
        data_total=df
    else:
        data_total=data_total.append(df)

data_total.set_index(['factor_symbol','factor_date'],inplace=True)

In [3]:

data_total.head()

Out[3]:

factor_bbi factor_ma factor_expma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值