日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python基于機器學習預測股票交易信號

瀏覽:127日期:2022-06-18 13:11:57
目錄引言數據獲取與指標構建數據獲取構建目標變量(target variable)技術指標特征構建計算技術指標模型預測與評估加入技術指標特征特征的優化結語引言

近年來,隨著技術的發展,機器學習和深度學習在金融資產量化研究上的應用越來越廣泛和深入。目前,大量數據科學家在Kaggle網站上發布了使用機器學習/深度學習模型對股票、期貨、比特幣等金融資產做預測和分析的文章。從金融投資的角度看,這些文章可能缺乏一定的理論基礎支撐(或交易思維),大都是基于數據挖掘。但從量化的角度看,有很多值得我們學習參考的地方,尤其是Pyhton的深入應用、數據可視化和機器學習模型的評估與優化等。下面借鑒Kaggle上的一篇文章《Building an Asset Trading Strategy》,以上證指數為例,構建雙均線交易策略,以交易信號為目標變量,以技術分析指標作為預測特征變量,使用多種機器學習模型進行對比評估和優化。文中的特征變量構建和提取,機器學習模型的對比評估和結果可視化都是很好的參考模板。

數據獲取與指標構建

先引入需要用到的libraries,這是Python語言的突出特點之一。這些涉及到的包比較多,包括常用的numpy、pandas、matplotlib,技術分析talib,機器學習sklearn和數據包tushare等。

#先引入后面可能用到的librariesimport numpy as npimport pandas as pd import tushare as ts#技術指標import talib as ta#機器學習模塊from sklearn.linear_model import LogisticRegressionfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.ensemble import GradientBoostingClassifierfrom xgboost import XGBClassifier,XGBRegressorfrom catboost import CatBoostClassifier,CatBoostRegressorfrom sklearn.ensemble import RandomForestClassifier,RandomForestRegressorfrom sklearn.model_selection import train_test_split,KFold,cross_val_scorefrom sklearn.metrics import accuracy_scoreimport shapfrom sklearn.feature_selection import SelectKBest,f_regressionfrom sklearn import preprocessing#畫圖import seaborn as snsimport matplotlib.pyplot as pltimport plotly.graph_objects as goimport plotly.express as px%matplotlib inline #正常顯示畫圖時出現的中文和負號from pylab import mplmpl.rcParams[’font.sans-serif’]=[’SimHei’]mpl.rcParams[’axes.unicode_minus’]=False數據獲取

用tushare獲取上證行情數據作為分析樣本。

#默認以上證指數交易數據為例def get_data(code=’sh’,start=’2000-01-01’,end=’2021-03-02’): df=ts.get_k_data(’sh’,start=’2005’) df.index=pd.to_datetime(df.date) df=df[[’open’,’high’,’low’,’close’,’volume’]] return dfdf=get_data()df_train,df_test=df.loc[:’2017’],df.loc[’2018’:]構建目標變量(target variable)

以交易信號作為目標變量,使用價格信息和技術指標作為特征變量進行預測分析。以雙均線交易策略為例,當短期均線向上突破長期均線時形成買入信號(設定為1),當短期均線向下跌破長期均線時發出賣出信號(設定為0),然后再使用機器學習模型進行預測和評估。這里將短期移動平均值(SMA1)和長期移動平均值(SMA2)的參數分別設置為10和60,二者的設定具有一定的任意性,參數的選擇會影響后續結果,所以理想情況下需要進行參數優化來找到最優值。

def trade_signal(data,short=10,long=60,tr_id=False): data[’SMA1’] = data.close.rolling(short).mean() data[’SMA2’] = data.close.rolling(long).mean() data[’signal’] = np.where(data[’SMA1’] >data[’SMA2’], 1.0, 0.0) if(tr_id is not True):display(data[’signal’].value_counts())df_tr1 = df_train.copy(deep=True) df_te1 = df_test.copy(deep=True) trade_signal(df_tr1) #trade_signal(df_te1,tr_id=True) plt.figure(figsize=(14,12), dpi=80)ax1 = plt.subplot(211)plt.plot(df_tr1.close,color=’b’)plt.title(’上證指數走勢’,size=15)plt.xlabel(’’)ax2 = plt.subplot(212)plt.plot(df_tr1.signal,color=’r’)plt.title(’交易信號’,size=15)plt.xlabel(’’)plt.show()

python基于機器學習預測股票交易信號

df_tr1[[’SMA1’,’SMA2’,’signal’]].iloc[-250:].plot(figsize=(14,6),secondary_y=[’signal’])plt.show()

python基于機器學習預測股票交易信號

#刪除均線變量df_tr1=df_tr1.drop([’SMA1’,’SMA2’], axis=1)df_te1=df_te1.drop([’SMA1’,’SMA2’], axis=1)#畫目標變量與其他變量之間的相關系數圖cmap = sns.diverging_palette(220, 10, as_cmap=True)def corrMat(df,target=’demand’,figsize=(9,0.5),ret_id=False): corr_mat = df.corr().round(2);shape = corr_mat.shape[0] corr_mat = corr_mat.transpose() corr = corr_mat.loc[:, df.columns == target].transpose().copy() if(ret_id is False):f, ax = plt.subplots(figsize=figsize)sns.heatmap(corr,vmin=-0.3,vmax=0.3,center=0, cmap=cmap,square=False,lw=2,annot=True,cbar=False)plt.title(f’Feature Correlation to {target}’) if(ret_id):return corrcorrMat(df_tr1,’signal’,figsize=(7,0.5))

python基于機器學習預測股票交易信號

當前的特征open、high、low、close、volumes與目標變量的線性相關值非常小,這可能意味著存在高非線性,相對平穩值的穩定振蕩(圓形散射),或者也許它們不是理想的預測特征變量,所以下面需要進行特征構建和選取。

技術指標特征構建

為方便分析,下面以常見的幾個技術指標作為特征引入特征矩陣,具體指標有:

移動平均線:移動平均線通過減少噪音來指示價格的運動趨勢。

隨機振蕩器%K和%D:隨機振蕩器是一個動量指示器,比較特定的證券收盤價和一定時期內的價格范圍。%K、%D分別為慢、快指標。

相對強弱指數(RSI):動量指標,衡量最近價格變化的幅度,以評估股票或其他資產的價格超買或超賣情況。

變化率(ROC):動量振蕩器,測量當前價格和n期過去價格之間的百分比變化。ROC值越高越有可能超買,越低可能超賣。

動量(MOM):證券價格或成交量加速的速度;價格變化的速度。

#復制之前的數據df_tr2=df_tr1.copy(deep=True)df_te2=df_te1.copy(deep=True)計算技術指標

#使用talib模塊直接計算相關技術指標#下面參數的選取具有主觀性def indicators(data): data[’MA13’]=ta.MA(data.close,timeperiod=13) data[’MA34’]=ta.MA(data.close,timeperiod=34) data[’MA89’]=ta.MA(data.close,timeperiod=89) data[’EMA10’]=ta.EMA(data.close,timeperiod=10) data[’EMA30’]=ta.EMA(data.close,timeperiod=30) data[’EMA200’]=ta.EMA(data.close,timeperiod=200) data[’MOM10’]=ta.MOM(data.close,timeperiod=10) data[’MOM30’]=ta.MOM(data.close,timeperiod=30) data[’RSI10’]=ta.RSI(data.close,timeperiod=10) data[’RSI30’]=ta.RSI(data.close,timeperiod=30) data[’RS200’]=ta.RSI(data.close,timeperiod=200) data[’K10’],data[’D10’]=ta.STOCH(data.high,data.low,data.close, fastk_period=10) data[’K30’],data[’D30’]=ta.STOCH(data.high,data.low,data.close, fastk_period=30) data[’K20’],data[’D200’]=ta.STOCH(data.high,data.low,data.close, fastk_period=200)indicators(df_tr2)indicators(df_te2)corrMat(df_tr2,’signal’,figsize=(15,0.5))

python基于機器學習預測股票交易信號

上圖可以看到明顯線性相關的一組特征是作為特征工程的結果創建的。如果在特征矩陣中使用基本數據集特征,很可能對目標變量的變化影響很小或沒有影響。另一方面,新創建的特征具有相當寬的相關值范圍,這是相當重要的;與目標變量(交易信號)的相關性不算特別高。

#刪除缺失值df_tr2 = df_tr2.dropna() df_te2 = df_te2.dropna()模型預測與評估

下面使用常用的機器學習算法分別對數據進行擬合和交叉驗證評估

models.append((’RF’, RandomForestClassifier(n_estimators=25)))models = []#輕量級模型 #線性監督模型models.append((’LR’, LogisticRegression(n_jobs=-1)))models.append((’TREE’, DecisionTreeClassifier())) #非監督模型models.append((’LDA’, LinearDiscriminantAnalysis())) models.append((’KNN’, KNeighborsClassifier())) models.append((’NB’, GaussianNB())) #高級模型models.append((’GBM’, GradientBoostingClassifier(n_estimators=25)))models.append((’XGB’,XGBClassifier(n_estimators=25,use_label_encoder=False)))models.append((’CAT’,CatBoostClassifier(silent=True,n_estimators=25)))

構建模型評估函數

def modelEval(ldf,feature=’signal’,split_id=[None,None],eval_id=[True,True,True,True], n_fold=5,scoring=’accuracy’,cv_yrange=None,hm_vvals=[0.5,1.0,0.75]): ’’’ Split Train/Evaluation <DataFrame> Set Split ’’’ # split_id : Train/Test split [%,timestamp], whichever is not None # test_id : Evaluate trained model on test set only if(split_id[0] is not None):train_df,eval_df = train_test_split(ldf,test_size=split_id[0],shuffle=False) elif(split_id[1] is not None):train_df = df.loc[:split_id[1]]; eval_df = df.loc[split_id[1]:] else:print(’Choose One Splitting Method Only’) ’’’ Train/Test Feature Matrices + Target Variables Split’’’ y_train = train_df[feature] X_train = train_df.loc[:, train_df.columns != feature] y_eval = eval_df[feature] X_eval = eval_df.loc[:, eval_df.columns != feature] X_one = pd.concat([X_train,X_eval],axis=0) y_one = pd.concat([y_train,y_eval],axis=0) ’’’ Cross Validation, Training/Evaluation, one evaluation’’’ lst_res = []; names = []; lst_train = []; lst_eval = []; lst_one = []; lst_res_mean = [] if(any(eval_id)):for name, model in models: names.append(name) # Cross Validation Model on Training Se if(eval_id[0]):kfold = KFold(n_splits=n_fold, shuffle=True)cv_res = cross_val_score(model,X_train,y_train, cv=kfold, scoring=scoring)lst_res.append(cv_res) # Evaluate Fit Model on Training Data if(eval_id[1]):res = model.fit(X_train,y_train)train_res = accuracy_score(res.predict(X_train),y_train); lst_train.append(train_res) if(eval_id[2]):if(eval_id[1] is False): # If training hasn’t been called yet res = model.fit(X_train,y_train)eval_res = accuracy_score(res.predict(X_eval),y_eval); lst_eval.append(eval_res) # Evaluate model on entire dataset if(eval_id[3]):res = model.fit(X_one,y_one)one_res = accuracy_score(res.predict(X_one),y_one); lst_one.append(one_res) ’’’ [out] Verbal Outputs ’’’ lst_res_mean.append(cv_res.mean()) fn1 = cv_res.mean() fn2 = cv_res.std(); fn3 = train_res fn4 = eval_res fn5 = one_res s0 = pd.Series(np.array(lst_res_mean),index=names) s1 = pd.Series(np.array(lst_train),index=names) s2 = pd.Series(np.array(lst_eval),index=names) s3 = pd.Series(np.array(lst_one),index=names) pdf = pd.concat([s0,s1,s2,s3],axis=1) pdf.columns = [’cv_average’,’train’,’test’,’all’] ’’’ Visual Ouputs ’’’ sns.set(style='whitegrid') fig,ax = plt.subplots(1,2,figsize=(15,4)) ax[0].set_title(f’{n_fold} Cross Validation Results’) sns.boxplot(data=lst_res, ax=ax[0], orient='v',width=0.3) ax[0].set_xticklabels(names) sns.stripplot(data=lst_res,ax=ax[0], orient=’v’,color='.3',linewidth=1) ax[0].set_xticklabels(names) ax[0].xaxis.grid(True) ax[0].set(xlabel='') if(cv_yrange is not None):ax[0].set_ylim(cv_yrange) sns.despine(trim=True, left=True) sns.heatmap(pdf,vmin=hm_vvals[0],vmax=hm_vvals[1],center=hm_vvals[2], ax=ax[1],square=False,lw=2,annot=True,fmt=’.3f’,cmap=’Blues’) ax[1].set_title(’Accuracy Scores’) plt.show()

基準模型:使用原始行情數據作為特征

modelEval(df_tr1,split_id=[0.2,None])

python基于機器學習預測股票交易信號

結果顯示,cross_val_score徘徊在準確度= 0.5的區域,這表明僅使用指數/股票的價格數據(開盤、最高、最低、成交量、收盤)很難準確預測價格變動的方向性。大多數模型的訓練得分往往高于交叉驗證得分。有意思的是,DecisionTreeClassifier & RandomForest即使很少估計可以達到非常高的分數,但交叉驗證的得分卻很低,表明對訓練數據可能存在過度擬合了。

加入技術指標特征

modelEval(df_tr2,split_id=[0.2,None],cv_yrange=(0.8,1.0),hm_vvals=[0.8,1.0,0.9])

結果表明,與基準模型相比,準確率得分有了非常顯著的提高。線性判別分析(LDA)的表現非常出色,不僅在訓練集上,而且在交叉驗證中,得分顯著提高。毫無疑問,更復雜的模型GBM,XGB,CAT,RF在全樣本中評估得分較高。與有監督學習模型相比,kNN和GaussianNB的無監督模型表現較差。

特征的優化

def feature_importance(ldf,feature=’signal’,n_est=100): # Input dataframe containing feature & target variable X = ldf.copy() y = ldf[feature].copy() del X[feature] # CORRELATION imp = corrMat(ldf,feature,figsize=(15,0.5),ret_id=True) del imp[feature] s1 = imp.squeeze(axis=0);s1 = abs(s1) s1.name = ’Correlation’ # SHAP model = CatBoostRegressor(silent=True,n_estimators=n_est).fit(X,y) explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) shap_sum = np.abs(shap_values).mean(axis=0) s2 = pd.Series(shap_sum,index=X.columns,name=’Cat_SHAP’).T # RANDOMFOREST model = RandomForestRegressor(n_est,random_state=0, n_jobs=-1) fit = model.fit(X,y) rf_fi = pd.DataFrame(model.feature_importances_,index=X.columns, columns=[’RandForest’]).sort_values(’RandForest’,ascending=False) s3 = rf_fi.T.squeeze(axis=0) # XGB model=XGBRegressor(n_estimators=n_est,learning_rate=0.5,verbosity = 0) model.fit(X,y) data = model.feature_importances_ s4 = pd.Series(data,index=X.columns,name=’XGB’).T # KBEST model = SelectKBest(k=5, score_func=f_regression) fit = model.fit(X,y) data = fit.scores_ s5 = pd.Series(data,index=X.columns,name=’K_best’) # Combine Scores df0 = pd.concat([s1,s2,s3,s4,s5],axis=1) df0.rename(columns={’target’:’lin corr’}) x = df0.values min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x) df = pd.DataFrame(x_scaled,index=df0.index,columns=df0.columns) df = df.rename_axis(’Feature Importance via’, axis=1) df = df.rename_axis(’Feature’, axis=0) pd.options.plotting.backend = 'plotly' fig = df.plot(kind=’bar’,title=’Scaled Feature Importance’) fig.show()feature_importance(df_tr2)

python基于機器學習預測股票交易信號

注意到,對于很多特征,相關性(Pearson’s value)小的在其他方法中也會給出小的得分值。同樣,高相關的特征在其他特征重要性方法中得分也很高。當談到特征的重要性時,有一些特征顯示出一些輕微的不一致,總的來說,大多數方法都可以觀察到特征評分的相似性。在機器學習中,某些特征對于大多數方法來說都有一個非常低的相對分數值,因此可能沒有什么影響,即使把它們刪除,也不會降低模型的準確性。刪除可能不受影響的特性將使整個方法更加有效,同時可以專注于更長和更深入的超參數網格搜索,可能得到比原來模型更準確的結果。

df_tr2_FI = df_tr2.drop(columns=[’open’,’high’,’low’,’close’,’EMA10’])modelEval(df_tr2_FI,split_id=[0.2,None],cv_yrange=(0.8,1.0),hm_vvals=[0.8,1.0,0.9])

python基于機器學習預測股票交易信號

結語

本文只是以上證指數為例,以技術指標作為特征,使用機器學習算法對股票交易信號(注意這里不是股價或收益率)進行預測評估,目的在于向讀者展示Python機器學習在金融量化研究上的應用。從金融維度來看,分析的深度較淺,實際上對股價預測有用的特征有很多,包括(1)外在因素, 如股票相關公司的競爭對手、客戶、全球經濟、地緣政治形勢、財政和貨幣政策、資本獲取等。因此,公司股價可能不僅與其他公司的股價相關,還與大宗商品、外匯、廣義指數、甚至固定收益證券等其他資產相關;(2)股價市場因素,如很多投資者關注技術指標。(3)公司基本面因素,如公司的年度和季度報告可以用來提取或確定關鍵指標,如凈資產收益率(ROE)和市盈率(price -to - earnings)。此外,新聞可以預示即將發生的事件,這些事件可能會推動股價向某個方向發展。當關注股票價格預測時,我們可以使用類似的方法來構建影響預測變量的因素,希望本文能起到拋磚引玉的作用。

以上就是python基于機器學習預測股票交易信號的詳細內容,更多關于python 預測股票交易信號的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
999国产精品| 青草久久视频| 激情黄产视频在线免费观看| 日韩国产在线观看| 精品在线播放| 精品一区在线| 日韩在线卡一卡二| 日韩精品免费视频人成| 人人爱人人干婷婷丁香亚洲| 日韩av二区在线播放| 国产日产高清欧美一区二区三区| 五月亚洲婷婷 | 欧美日韩中文字幕一区二区三区| 色爱综合网欧美| 欧美亚洲精品在线| 99国产精品自拍| 日韩欧美三区| 超碰99在线| 亚洲一区导航| 91偷拍一区二区三区精品| 亚洲福利久久| 日韩国产在线观看| 日韩高清中文字幕一区二区| 婷婷成人基地| 国产乱人伦精品一区| 精品三级av| 亚洲少妇自拍| 精品视频自拍| 亚洲午夜久久| av资源亚洲| 亚洲欧美久久| 在线看片福利| 日韩欧美中文字幕在线视频| 亚洲女同av| 日韩欧美中文在线观看| 国精品一区二区三区| 久久99蜜桃| 亚洲欧美日韩国产| 精品美女久久| 日本99精品| 日韩中文欧美| 精品中文字幕一区二区三区四区| 日韩视频一区| 久久91导航| 精品免费av一区二区三区| 日韩精品视频在线看| 伊人久久婷婷| 亚洲午夜一级| 三上悠亚国产精品一区二区三区| 国产精品a级| 久久精品123| 红杏一区二区三区| 国产伦理久久久久久妇女| 在线日韩成人| 亚洲制服欧美另类| 91精品国产91久久久久久黑人| 久久国产尿小便嘘嘘| 日韩视频1区| 日韩中文字幕视频网| 免费成人在线观看| 男人的天堂久久精品| 午夜在线播放视频欧美| 黄色成人91| 黄色免费成人| 欧美中文字幕| 亚洲精品少妇| 日韩不卡一区二区三区| 欧美伊人久久| 国产精品密蕾丝视频下载| 日韩1区2区日韩1区2区| 亚洲另类视频| 国产精品亚洲综合久久| 成人日韩av| 欧美日韩三区| 国产精品日韩| 国产亚洲电影| 97人人精品| 亚洲综合精品四区| 国产欧美一区二区色老头| 国内精品美女在线观看| 日韩免费看片| 日韩制服丝袜先锋影音| 国产精品一区二区av日韩在线| 精品成av人一区二区三区| 99精品在线观看| 美女精品网站| 美女性感视频久久| 婷婷六月综合| 国产精品扒开腿做爽爽爽软件| 在线天堂中文资源最新版| 在线视频精品| 狂野欧美性猛交xxxx| 久久一区二区三区电影| 欧美日韩视频免费看| 精品日韩视频| 国产欧美一区二区三区精品观看| 亚洲精品国产嫩草在线观看| 7m精品国产导航在线| 久久久精品日韩| 国产一区 二区| 中文字幕在线高清| 午夜亚洲福利| 91精品国产91久久久久久黑人| 日韩精品国产欧美| 欧美日韩国产高清| 风间由美中文字幕在线看视频国产欧美| 日韩专区精品| 国产精品蜜月aⅴ在线| 午夜亚洲一区| 欧洲av一区二区| 欧美aⅴ一区二区三区视频| 亚洲一区二区三区高清| 中文在线免费视频| 免费亚洲一区| 国产剧情在线观看一区| 激情综合网址| av在线资源| 精品国产一区二区三区性色av| 亚洲精品自拍| 一区二区国产在线| 蜜桃视频一区二区三区| 欧美另类专区| 激情综合网五月| 91精品国产成人观看| 中文在线а√在线8| 国产成人久久精品一区二区三区| 国产亚洲欧美日韩在线观看一区二区 | 日本一区中文字幕| 亚洲一区导航| 日韩精品久久理论片| 日本一区二区三区中文字幕| 日韩中文欧美在线| 亚洲精品极品| 日本欧美在线看| 黄色成人91| 一本一道久久a久久精品蜜桃| 国产福利一区二区精品秒拍 | 日韩国产欧美三级| 三级在线观看一区二区| 石原莉奈一区二区三区在线观看 | 国产一区二区三区天码| 国产精品2区| 美女久久精品| 视频在线不卡免费观看| 久久久久蜜桃| 久久aⅴ国产紧身牛仔裤| 在线视频亚洲欧美中文| 国产乱论精品| 一本大道色婷婷在线| 午夜欧美精品久久久久久久| 日本中文字幕视频一区| 麻豆中文一区二区| 国产精品99一区二区三区| 久久婷婷激情| 欧美久久久网站| 群体交乱之放荡娇妻一区二区| 模特精品在线| 精品国产中文字幕第一页| 亚洲第一精品影视| 国产一精品一av一免费爽爽| 天堂а√在线最新版中文在线| 99亚洲视频| 麻豆一区二区三区| 精品国模一区二区三区| 亚洲婷婷丁香| 日韩欧美少妇| 欧美精品二区| 99成人在线视频| 精品视频久久| 欧美片网站免费| 亚洲深夜福利| 久久婷婷久久| 樱桃视频成人在线观看| 日韩1区2区3区| 99视频精品| 久久一区二区三区电影| 老牛国内精品亚洲成av人片| 亚洲伊人精品酒店| 亚洲欧美伊人| 欧美日韩视频网站| 麻豆视频一区二区| 日本在线成人| 91精品精品| 日韩免费一区| 国产精品国产一区| 欧美日韩18| 青草久久视频| 国产免费久久| 日本91福利区| 日本麻豆一区二区三区视频| 日韩在线卡一卡二| 丝袜a∨在线一区二区三区不卡| 国产在线观看www| 国产黄大片在线观看| 精品视频国内| 四虎成人av| 久久高清免费| 日韩国产一区| 亚洲一级二级| 亚洲欧洲一区|