版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
選股策略(python版)本策略旨在通過特定的選股邏輯和交易規(guī)則,在中證500成分股中篩選出具有投資潛力的股票,并進行相應的買入和賣出操作。策略的核心在于結合多個技術指標對股票進行綜合評估,以實現穩(wěn)健的投資回報。策略特點1.**基于中證500成分股**:策略以中證500成分股為基礎股票池,這些股票通常具有較好的市場代表性和流動性。2.**多因子綜合評估**:策略綜合考慮了多個技術指標,如ATR(平均真實波幅)和ADTM(動態(tài)買賣氣指標),通過賦予不同因子權重,計算出每只股票的總體評分。3.**定期調倉**:策略設定為每20天進行一次調倉,以確保持倉股票始終符合選股標準。4.**資金等權分配**:對于選定的買入備選股票,策略采用等權分配資金的方式,以降低單一股票的風險。5.**考慮交易成本**:策略在計算盈利時,充分考慮了交易手續(xù)費等成本因素。策略流程1.**初始化階段**:-獲取中證500成分股,并設定為基礎股票池。-初始化策略運行天數、持倉情況、資金權重、買入點、可用資金、策略盈利等變量。2.**周期循環(huán)階段**:-在每個交易日的bar數據更新時,執(zhí)行以下操作:a.獲取過去1日的開盤價數據。b.當策略運行天數大于60天且到達20天的調倉周期時,執(zhí)行以下步驟:-獲取待買入和賣出的股票池。-對于待買入的股票,計算其在ATR和ADTM指標上的排名,并根據設定的權重計算總體評分。-根據總體評分排序,選取評分最低的10只股票作為買入備選。-賣出持倉中待賣出的股票,并計算相應的盈利和可用資金。-為買入備選股票等權分配資金,并執(zhí)行買入操作。3.**初步篩選股票池階段**:-獲取基礎股票池的歷史數據,包括22天的日最高價、2天的日最高價和62天的日收盤價。-根據設定的條件,篩選出待買入和待賣出的股票。策略優(yōu)化與改進方向1.**因子優(yōu)化**:可以嘗試引入更多技術指標或調整現有因子的權重,以提高策略的選股能力。2.**風險管理**:可以引入更復雜的風險管理機制,如止損策略、倉位控制等,以降低策略的回撤風險。3.**機器學習應用**:可以考慮利用機器學習算法對歷史數據進行訓練,以挖掘更多潛在的投資機會。本策略通過結合多個技術指標和定期調倉機制,在中證500成分股中尋找具有投資潛力的股票。策略代碼:#!/usr/bin/python#coding:gbkimportpandasaspdimportnumpyasnpimporttimeimportdatetime#1.==初始化部分==definit(ContextInfo):#獲取中證500成分股ContextInfo.s=ContextInfo.get_sector('000905.SH')#設定基礎股票池為中證500成分股ContextInfo.set_universe(ContextInfo.s)#策略運行天數ContextInfo.day=0#持倉情況ContextInfo.holdings={i:0foriinContextInfo.s}#資金權重ContextInfo.weight=[0.1]*10#設置資金分配權重#買入點ContextInfo.buypoint={}#可用資金ContextInfo.money=ContextInfo.capital#策略盈利ContextIfit=0#設置交易賬戶ContextInfo.accountID='testS'#2.==周期循環(huán)部分==defhandlebar(ContextInfo):rank1={}rank2={}rank_total={}tmp_stock={}#當前bar線索引號d=ContextInfo.barpos#獲取過去1日的開盤價數據price=ContextInfo.get_history_data(1,'1d','open',3)#策略運行天數大于60天且到達20天的調倉周期ifd>60andd%20==0:#當前bar線日期nowDate=timetag_to_datetime(ContextInfo.get_bar_timetag(d),'%Y%m%d')#獲取待買入、賣出股票池buys,sells=signal(ContextInfo)#獲取待買入forkinbuys.keys():ifbuys[k]==1:#獲取待買入個股在所有品種中的atr排名rank1[k]=ext_data_rank('atr',k[-2:]+k[0:6],0,ContextInfo)#獲取待買入個股在所有品種中的adtm排名rank2[k]=ext_data_rank('adtm',k[-2:]+k[0:6],0,ContextInfo)#人為設置因子的權重,此處取了0.5和-0.5rank_total[k]=0.5*rank1[k]-0.5*rank2[k]#對rank_total按照值value進行排序,并返回一個列表,列表里面的元素是形如(code,value)的元組tmp=sorted(rank_total.items(),key=lambdaitem:item[1])#如果買入備選股票數大于10只,則選取因子排序最小的10只iflen(tmp)>=10:tmp_stock={i[0]foriintmp[:10]}#如果買入備選股票數小于10只,則全選else:tmp_stock={i[0]foriintmp}forkinbuys.keys():ifknotintmp_stock:buys[k]=0iftmp_stock:print('買入備選股票列表:',tmp_stock)forkinContextInfo.s:#賣出持倉中待賣出的股票ifContextInfo.holdings[k]>0andsells[k]==1:print('readytosell')#將持倉中待賣出股票以昨日收盤價清倉order_shares(k,-ContextInfo.holdings[k]*100,'fix',price[k][-1],ContextInfo,ContextInfo.accountID)#計算賬戶可用資金(手續(xù)費按萬三設定)ContextInfo.money+=price[k][-1]*ContextInfo.holdings[k]*100-0.0003*ContextInfo.holdings[k]*100*price[k][-1]#計算賬戶盈利ContextIfit+=(price[k][-1]-ContextInfo.buypoint[k])*ContextInfo.holdings[k]*100-0.0003*ContextInfo.holdings[k]*100*price[k][-1]ContextInfo.holdings[k]=0#為待買入股票等權分配資金ContextInfo.money_distribution={k:i*ContextInfo.moneyfor(k,i)inzip(tmp_stock,ContextInfo.weight)}forkintmp_stock:#買入持倉中沒有的買入備選股票列表ifContextInfo.holdings[k]==0andbuys[k]==1:print('readytobuy')#備選股票買入手數order[k]=int(ContextInfo.money_distribution[k]/(price[k][-1]))/100#以昨日收盤價買入備選股票order_shares(k,order[k]*100,'fix',price[k][-1],ContextInfo,ContextInfo.accountID)#記錄買點ContextInfo.buypoint[k]=price[k][-1]#計算可用資金ContextInfo.money-=price[k][-1]*order[k]*100-0.0003*order[k]*100*price[k][-1]#記錄盈利ContextIfit-=0.0003*order[k]*100*price[k][-1]#記錄持倉中備選股票對應手數ContextInfo.holdings[k]=order[k]print(ContextInfo.money,ContextIfit,ContextInfo.capital)#3.==初步刪選股票池==defsignal(ContextInfo):buy={i:0foriinContextInfo.s}sell={i:0foriinContextInfo.s}#獲取基礎股票池歷史22天的日最高價data_high=ContextInfo.get_history_data(22,'1d','high',3)#獲取基礎股票池歷史2天的日最高價data_high_pre=ContextInfo.get_history_data(2,'1d','high',3)#獲取基礎股票池歷史62天的日收盤價data_close60=ContextInfo.get_history_data(62,'1d','close',3)forkinContextInfo.s:ifdata_close60.has_key(k):#過去62天未出現停牌,數據齊全iflen(data_high_pre[k])==2andlen(data_high[k])==22andlen(data_close60[k])==62:#超過20日最高價,加入買入備選ifdata_high_pre[k][-2]>max(data_high[k][:-2]):buy[k]=1#低于60日均線,加入賣出備選elifdata_high_pre[k][-2]<np.mean(data_close60[k][:-2]):sell[k]=1returnbuy,sell策略代碼注解:#!/usr/bin/python#coding:gbkimportpandasaspdimportnumpyasnpimporttimeimportdatetime#1.==初始化部分==definit(ContextInfo):#獲取中證500成分股ContextInfo.s=ContextInfo.get_sector('000905.SH')#設定基礎股票池為中證500成分股ContextInfo.set_universe(ContextInfo.s)#策略運行天數ContextInfo.day=0#持倉情況ContextInfo.holdings={i:0foriinContextInfo.s}#資金權重ContextInfo.weight=[0.1]*10#設置資金分配權重#買入點ContextInfo.buypoint={}#可用資金ContextInfo.money=ContextInfo.capital#策略盈利ContextIfit=0#設置交易賬戶ContextInfo.accountID='testS'#2.==周期循環(huán)部分==defhandlebar(ContextInfo):rank1={}rank2={}rank_total={}tmp_stock={}#當前bar線索引號d=ContextInfo.barpos#獲取過去1日的開盤價數據price=ContextInfo.get_history_data(1,'1d','open',3)#策略運行天數大于60天且到達20天的調倉周期ifd>60andd%20==0:#當前bar線日期nowDate=timetag_to_datetime(ContextInfo.get_bar_timetag(d),'%Y%m%d')#獲取待買入、賣出股票池buys,sells=signal(ContextInfo)#獲取待買入forkinbuys.keys():ifbuys[k]==1:#獲取待買入個股在所有品種中的atr排名rank1[k]=ext_data_rank('atr',k[-2:]+k[0:6],0,ContextInfo)#獲取待買入個股在所有品種中的adtm排名rank2[k]=ext_data_rank('adtm',k[-2:]+k[0:6],0,ContextInfo)#人為設置因子的權重,此處取了0.5和-0.5rank_total[k]=0.5*rank1[k]-0.5*rank2[k]#對rank_total按照值value進行排序,并返回一個列表,列表里面的元素是形如(code,value)的元組tmp=sorted(rank_total.items(),key=lambdaitem:item[1])#如果買入備選股票數大于10只,則選取因子排序最小的10只iflen(tmp)>=10:tmp_stock={i[0]foriintmp[:10]}#如果買入備選股票數小于10只,則全選else:tmp_stock={i[0]foriintmp}forkinbuys.keys():ifknotintmp_stock:buys[k]=0iftmp_stock:print('買入備選股票列表:',tmp_stock)forkinContextInfo.s:#賣出持倉中待賣出的股票ifContextInfo.holdings[k]>0andsells[k]==1:print('readytosell')#將持倉中待賣出股票以昨日收盤價清倉order_shares(k,-ContextInfo.holdings[k]*100,'fix',price[k][-1],ContextInfo,ContextInfo.accountID)#計算賬戶可用資金(手續(xù)費按萬三設定)ContextInfo.money+=price[k][-1]*ContextInfo.holdings[k]*100-0.0003*ContextInfo.holdings[k]*100*price[k][-1]#計算賬戶盈利ContextIfit+=(price[k][-1]-ContextInfo.buypoint[k])*ContextInfo.holdings[k]*100-0.0003*ContextInfo.holdings[k]*100*price[k][-1]ContextInfo.holdings[k]=0#為待買入股票等權分配資金ContextInfo.money_distribution={k:i*ContextInfo.moneyfor(k,i)inzip(tmp_stock,ContextInfo.weight)}forkintmp_stock:#買入持倉中沒有的買入備選股票列表ifContextInfo.holdings[k]==0andbuys[k]==1:print('readytobuy')#備選股票買入手數order[k]=int(ContextInfo.money_distribution[k]/(price[k][-1]))/100#以昨日收盤價買入備選股票order_shares(k,order[k]*100,'fix',price[k][-1],ContextInfo,ContextInfo.accountID)#記錄買點ContextInfo.buypoint[k]=price[k][-1]#計算可用資金ContextInfo.money-=price[k][-1]*order[k]*100-0.0003*order[k]*100*price[k][-1]#記錄盈利ContextIfit-=0.0003*order[k]*100*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《危機與沖突》課件
- 2024年度建筑材料放射性檢測委托協(xié)議書3篇
- 2024年物聯(lián)網智能傳感器生產與銷售合同
- 2024年校園網絡安全責任協(xié)議2篇
- 2025年鹽城貨運從業(yè)資格證在哪考
- 2025年德陽貨運從業(yè)資格證考試一共多少題
- 非謂語動詞解題原則與技巧課件
- 2025年六盤水貨運上崗資格證模擬考試
- 2024年度輕工企業(yè)節(jié)能減排承包合同3篇
- 2025年重慶貨運從業(yè)資格證考試題技巧答案大全
- 專題19與圓有關的最值問題12種常見考法歸類(原卷版)
- 山東2024年山東工業(yè)技師學院招聘23人筆試歷年典型考題及考點附答案解析
- 碳排放交易合同范本
- 2025屆高考寫作指導:議論文擬題方法及標題模板
- 知道智慧網課《化學分析》章節(jié)測試答案
- 11《葡萄溝》教學課件2023-2024學年統(tǒng)編版語文二年級上冊
- JBT 14682-2024 多關節(jié)機器人用伺服電動機技術規(guī)范(正式版)
- DL-T5434-2021電力建設工程監(jiān)理規(guī)范
- 2023-2024學年全國初中一年級上歷史人教版期末試卷(含答案解析)
- 青海省西寧市2023-2024學年七年級上學期期末英語試題(含答案)
- 眼的解剖結構與生理功能課件
評論
0/150
提交評論