【量化課程】08_1.機器學習量化策略基礎實戰

文章目錄

    • 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'] += 1if  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:returnweight =  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 = 5context.stock_num = 50if '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.pswp.cn/news/36883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android布局【FrameLayout】

文章目錄 常見屬性說明項目結構主要代碼 常見屬性 android:foreground:設置前景android:foregroundGravity:設置前景位置 說明 FrameLayout的其他屬性與前面學的差不多,只不過需要特別注意上面兩個即可 項目結構 主要代碼 activity_main…

【leetcode】第2章 鏈表

203. 移除鏈表元素 方法:添加一個虛擬節點,這不用考慮頭節點刪除情況 public ListNode removeElements(ListNode head, int val) {// 虛擬節點,指向頭節點ListNode dummy new ListNode(0);dummy.next head;ListNode p dummy;// 找到被刪…

數據結構:樹狀數組

老規矩,推薦一篇原理講解清晰的博客!(樹狀數組(詳細分析應用),看不懂打死我!_樹形數組_鮮果維他命的博客-CSDN博客) 相對于線段樹,樹狀數組的優點就是代碼簡潔,容易修改。單缺點就是優點問題只…

計算機視覺中的特征檢測和描述

一、說明 這篇文章是關于計算機視覺中特征檢測和描述概念的簡要理解。在其中,我們探討了它們的定義、常用技術、簡單的 python 實現和一些限制。 二、什么是特征檢測和描述? 特征檢測和描述是計算機視覺中的基本概念,在圖像識別、對象跟蹤和圖…

Beats:使用 Filebeat 將 golang 應用程序記錄到 Elasticsearch - 8.x

毫無疑問,日志記錄是任何應用程序最重要的方面之一。 當事情出錯時(而且確實會出錯),我們需要知道發生了什么。 為了實現這一目標,我們可以設置 Filebeat 從我們的 golang 應用程序收集日志,然后將它們發送…

Maven教程_編程入門自學教程_菜鳥教程-免費教程分享

教程簡介 Maven 是一款基于 Java 平臺的項目管理和整合工具,它將項目的開發和管理過程抽象成一個項目對象模型(POM)。開發人員只需要做一些簡單的配置,Maven 就可以自動完成項目的編譯、測試、打包、發布以及部署等工作。Maven 是…

微信小程序備案流程

微信小程序備案流程 📔 千尋簡筆記介紹 千尋簡筆記已開源,Gitee與GitHub搜索chihiro-notes,包含筆記源文件.md,以及PDF版本方便閱讀,且是用了精美主題,閱讀體驗更佳,如果文章對你有幫助請幫我…

二、異常日志

二、異常日志 (一)、錯誤碼 錯誤碼的制定原則:快速溯源、溝通標準化錯誤碼不體現版本號和錯誤等級信息全部正常,但不得不填充錯誤碼時返回五個零:00000錯誤碼為字符串類型,共 5 位,分成兩個部分…

win10 anaconda pytorch avalanche-lib 實驗步驟記錄

conda create --name test_python3.10 conda activate test_python3.10 配置conda國內源(北外) conda install pytorch torchvision torchaudio cpuonly -c pytorch pip3 install avalanche-lib -i https://pypi.tuna.tsinghua.edu.cn/simple conda install jupyter jupyte…

[tidb] tiup升級tidb的版本到 v7.1.1

備份 為了避免數據丟失,升級前需要備份當前tidb集群的數據,參考 TiDB 備份與恢復概述 | PingCAP 文檔中心 說明 由于新版本的tidb的tiflash需要cpui支持avx2,所有升級前先驗證當前升級的服務器是否支持avx2。升級的文檔可以參考 使用 TiUP…

Android布局【TableLayout】

文章目錄 說明常見屬性子控件設置屬性 項目結構主要代碼 說明 TableLayout也稱為表格布局 常見屬性 android:collapseColumns:設置需要被隱藏的列的序列號,從0開始android:stretchColumns:設置允許被拉伸的列的列序號,從0開始&…

docker私有鏡像倉庫搭建

1、下載registry鏡像 docker pull registry:2.52、生成登錄私有倉庫的用戶名以及密碼 mkdir -p /opt/registry/auth/ docker run --entrypoint htpasswd registry:2.5 -Bbn username userpwd >> /opt/registry/auth/htpasswd3、創建配置文件 mkdir -p /opt/registry/…

Git - 配置代理 和 取消代理配置

一. 配置代理 (使git走網路代理) git config --global http.proxy socks5://127.0.0.1:1080 git config --global https.proxy socks5://127.0.0.1:1080 其中 1080 是 SOCKS 代理的端口,一般默認 1080,可以在代理工具的設置中查看 地址記錄&#xff1a…

Python中使用隧道爬蟲ip提升數據爬取效率

作為專業爬蟲程序員,我們經常面臨需要爬取大量數據的任務。然而,有些網站可能會對頻繁的請求進行限制,這就需要我們使用隧道爬蟲ip來繞過這些限制,提高數據爬取效率。本文將分享如何在Python中使用隧道爬蟲ip實現API請求與響應的技…

(十八)大數據實戰——Hive的metastore元數據服務安裝

前言 Hive的metastore服務作用是為Hive CLI或者Hiveserver2提供元數據訪問接口。Hive的metastore 是Hive元數據的存儲和管理組件,它負責管理 Hive 表、分區、列等元數據信息。元數據是描述數據的數據,它包含了關于表結構、存儲位置、數據類型等信息。本…

Android Jetpack Compose 中的分頁與緩存展示

Android Jetpack Compose 中的分頁與緩存展示 在幾乎任何類型的移動項目中,移動開發人員在某個時候都會處理分頁數據。如果數據列表太大,無法一次從服務器檢索完畢,這就是必需的。因此,我們的后端同事為我們提供了一個端點&#…

ArcGIS Pro應用—暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用全流程科研能力提升教程

詳情點擊鏈接:ArcGIS Pro應用—暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用全流程科研能力提升教程 第一:GIS及ArcGIS Pro 1.GIS基本原理及常用軟件 2.ArcGIS Pro 安裝與配置 3.ArcGIS Pro 3.0 的新…

C語言自動抓取淘寶商品詳情網頁數據,實現輕松高效爬蟲

你是否曾經遇到過需要大量獲取網頁上的數據,但手動復制粘貼又太過費時費力?那么這篇文章就是為你而寫。今天我們將會詳細討論如何使用C語言實現自動抓取網頁上的數據。本文將會從以下8個方面進行逐步分析討論。 1. HTTP協議的基本原理 在開始之前&…

小白到運維工程師自學之路 第七十三集 (kubernetes應用部署)

一、安裝部署 1、以Deployment YAML方式創建Nginx服務 這個yaml文件在網上可以下載 cat nginx-deployment.yaml apiVersion: apps/v1 #apiVersion是當前配置格式的版本 kind: Deployment #kind是要創建的資源類型,這里是Deploymnet metadata: #metadata是該資源…

Photoshop多圖片與多窗口下排列操作方法

首先,在Photoshop中打開6張圖片,在“窗口”菜單下切換窗口排列狀態: 在 “窗口”菜單下對窗口進行排列,分別呈現如下: (一). 點擊“窗口” -> “排列”->"全部垂直拼貼": &am…