手把手教會(huì)你如何做日內(nèi)回轉(zhuǎn)交易策略?

股票日內(nèi)回轉(zhuǎn)交易是指投資者就同一個(gè)標(biāo)的(如股票)在同一交易日(T)內(nèi)各完成多次買進(jìn)和賣出的行為,保持標(biāo)的股數(shù)不變,其目的是盡可能多地高拋低吸、賺取差價(jià)收益,減少浮虧。日內(nèi)回轉(zhuǎn)交易跟普通的做T有所不同,它比較適合長期持股投資者,每日操作完畢,當(dāng)日持倉股數(shù)不變,避免踏空風(fēng)險(xiǎn),只利用賬戶閑余資金賺取收益。日內(nèi)回轉(zhuǎn)交易的魅力就在于此,獲取除了股票本身股價(jià)上漲收益之外的第二份收益,即日內(nèi)差價(jià)收益,有機(jī)會(huì)依靠風(fēng)險(xiǎn)低的小倉位持倉,獲取大于滿倉持有的超額收益。
一、日內(nèi)回轉(zhuǎn)交易有哪些特點(diǎn)?
嚴(yán)格來說,日內(nèi)回轉(zhuǎn)交易只是利用原有的股票底倉的基礎(chǔ)上實(shí)現(xiàn)的變相T+0,因而其具有如下特點(diǎn):
1.T日內(nèi)買賣,確保股數(shù)不變;
2.T日交易部分全平,確保不持倉過夜;
3.T日內(nèi)同一標(biāo)的回轉(zhuǎn)交易。
二、日內(nèi)回轉(zhuǎn)交易的作用有哪些?
股票的收益主要來自做多,等股價(jià)上漲后拋出獲益,但是如果投資者持有某股票一年時(shí)間,期間該股票有漲有跌,最后回到原來的價(jià)格相當(dāng)于沒漲。這時(shí)候如果投資者賬戶里又有一定比例的現(xiàn)金,同時(shí)持有股票和現(xiàn)金的缺點(diǎn)是,行情好的時(shí)候,不能滿倉梭哈以獲取最大收益;而好處呢,就是下跌時(shí)不會(huì)遭遇滿倉跌停。所以,股票倉位的多少?zèng)]有好壞之分,關(guān)鍵在于適時(shí)做出增倉和減倉的行為,把價(jià)差做好,獲取除了股票本身股價(jià)上漲收益之外的第二份收益,即差價(jià)收益。
1.當(dāng)你持有的長線股票沒有被套牢而是已經(jīng)盈利,如果你判斷該股仍有空間,運(yùn)用日內(nèi)回轉(zhuǎn)交易策略可以在股價(jià)上行過程中增加整體收益率。
2.當(dāng)你持有的長線股票暫時(shí)被套牢,但是股價(jià)目前還在下行通道上或者在底部震蕩區(qū)域,運(yùn)用日內(nèi)回轉(zhuǎn)交易策略可以在股價(jià)震蕩或者下行過程中減少浮虧幅度。
三、日內(nèi)回轉(zhuǎn)交易策略實(shí)操
1.在正式交易前需要先配置一定的底倉,配置底倉的作用是利用替代法實(shí)現(xiàn)“T+0”。由于當(dāng)天買入的股票當(dāng)天不能賣出,但底倉是可以賣出的,用底倉替代新買入的股票進(jìn)行賣出操作。
2.交易數(shù)量
每次交易的數(shù)量 + 當(dāng)日買入的數(shù)量(turnaround的第一位)< 底倉數(shù)量(以賣出信號(hào)為例)
3.回測(cè)標(biāo)的:浦發(fā)銀行(600000.SH)
4.策略代碼
# coding:gbk
'''
本策略首先買入當(dāng)前股票10000股
隨后根據(jù)60s的數(shù)據(jù)來計(jì)算MACD(12,26,9)線,并在MACD>0,MACD_pre<0的時(shí)候買入100股,MACD<0,MACD_pre>0的時(shí)候賣出100股
但每日操作的股票數(shù)不超過原有倉位,并于收盤前把倉位調(diào)整至開盤前的倉位
本策略需在個(gè)股分鐘線下運(yùn)行
'''??
import?talib??
import?numpy?as?np??
import?pandas?as?pd??
#=======================================策略初始化部分================================================??
def?init(ContextInfo):??
????#?第一次交易信號(hào)??
????ContextInfo.first?=?0??
????#?設(shè)定交易股數(shù)??
????ContextInfo.Lots?=?100??
????#?每日回轉(zhuǎn)持倉量??
????ContextInfo.total?=?10000??
????#?設(shè)置交易賬號(hào)??
????ContextInfo.accountID?=?'testS'?
????#?持倉情況??
????ContextInfo.MarketPosition?=?{}??
????#?手續(xù)費(fèi)列表
????commissionList = [0,0.0001,0.0003,0.0003,0,5]
??? #?設(shè)定買入印花稅為?0,賣出印花稅為?0.0001,開倉手續(xù)費(fèi)和平倉(平昨)手續(xù)費(fèi)均為萬三,平今手續(xù)費(fèi)為?0,最小手續(xù)費(fèi)為?5
????ContextInfo.set_commission(0,commissionList)
??? #?設(shè)置基礎(chǔ)股票池(獲取基礎(chǔ)信息里默認(rèn)品種的代碼)??
????ContextInfo.set_universe([ContextInfo.stockcode?+?'.'?+?ContextInfo.market])??
#============================================策略周期循環(huán)部分=========================================??
def?handlebar(ContextInfo):??
????#?獲取當(dāng)前bar線索引??
????d?=?ContextInfo.barpos??
????#?當(dāng)前bar索引小于35,退出周期循環(huán)??
????if?d?<?35:??
????????return??
????#?設(shè)置起止時(shí)間??
????startdate?=?timetag_to_datetime(ContextInfo.get_bar_timetag(d?-?35),?'%Y%m%d%H%M%S')??
????enddate?=?timetag_to_datetime(ContextInfo.get_bar_timetag(d),?'%Y%m%d%H%M%S')??
????#?print(startdate,enddate)??
????#?格式化當(dāng)前bar對(duì)應(yīng)時(shí)間??
????date?=?timetag_to_datetime(ContextInfo.get_bar_timetag(d),?'%Y-%m-%d?%H:%M:%S')??
????#?print('日期',?date)??
????#?獲取基礎(chǔ)股票池起止時(shí)間范圍內(nèi)的1分鐘收盤價(jià)數(shù)據(jù)(ContextInfo.period為基礎(chǔ)信息中的默認(rèn)周期)??
????df?=?ContextInfo.get_market_data(['close'],?stock_code=ContextInfo.get_universe(),?start_time=startdate,??
????????????????????????????????????end_time=enddate,?period=ContextInfo.period)??
????#?如果返回空DataFrame則退出當(dāng)前bar的周期循環(huán)??
????if?df.empty:??
????????return??
????#?如果并未買入股票??
????if?ContextInfo.first?==?0:??
????????order_shares(ContextInfo.get_universe()[0],?ContextInfo.total,?'fix',?df.iloc[-1,?0],?ContextInfo,??
????????????????????ContextInfo.accountID)??
????????ContextInfo.first?=?1??
????????ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?=?ContextInfo.total??
????#?14:55:00之后不再交易??
????if?int(date[-8:-6]?+?date[-5:-3])?>?1455:??
????????return??
????#?獲取賬戶可用資金??
????avaliable?=?get_avaliable(ContextInfo.accountID,?'STOCK')??
????#?獲取股票可用余額??
????holding?=?get_holdings(ContextInfo.accountID,?'STOCK')??
????#?初始化股票可用余額??
????if?ContextInfo.get_universe()[0]?not?in?holding.keys():??
????????holding[ContextInfo.get_universe()[0]]?=?0??
????#?計(jì)算MACD線??
????if?ContextInfo.total?>=?0:??
????????recent_date?=?np.array(df.iloc[-35:,?0])??
????????#?利用talib庫的MACD函數(shù)計(jì)算MACD曲線,返回三個(gè)結(jié)果:macd(12日EMA-26日EMA)、signal(9日macd的EMA)、hist(macd-signal)??
????????macd?=?talib.MACD(recent_date)[0][-1]??
????????macd_pre?=?talib.MACD(recent_date)[0][-2]??
????????#===================================開盤至臨近收盤交易========================================??
????????if?date[-8:-3]?!=?'14:55':??
????????????#?前2日macd為負(fù),昨日macd為正,買入??
????????????if?macd?>?0?and?macd_pre?<?0:??
????????????????if?avaliable?>?df.iloc[-1,?0]?*?ContextInfo.Lots?*?100:??
????????????????????order_shares(ContextInfo.get_universe()[0],?ContextInfo.Lots,?'fix',?df.iloc[-1,?0],?ContextInfo,??
????????????????????????????????ContextInfo.accountID)??
????????????????????ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?+=?ContextInfo.Lots??
????????????????#?print(ContextInfo.get_universe()[0],?'市價(jià)單開多倉',?ContextInfo.Lots,?'股')??
????????????#?前2日macd為正,昨日macd為負(fù),賣出??
????????????elif?macd?<?0?and?macd_pre?>?0?and?holding[ContextInfo.get_universe()[0]]?>=?ContextInfo.Lots:??
????????????????order_shares(ContextInfo.get_universe()[0],?-ContextInfo.Lots,?'fix',?df.iloc[-1,?0],?ContextInfo,??
????????????????????????????ContextInfo.accountID)??
????????????????print(ContextInfo.get_universe()[0],?'市價(jià)單平多倉',?ContextInfo.Lots,?'股')??
????????????????ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?-=?ContextInfo.Lots??
????????#============================臨近收盤時(shí)若倉位數(shù)不等于昨倉則回轉(zhuǎn)所有倉位=========================??
????????else:??
????????????#?臨近收盤持倉股數(shù)大于每日回轉(zhuǎn)持倉量,賣出大于的數(shù)量??
????????????if?ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?>?ContextInfo.total:??
????????????????order_shares(ContextInfo.get_universe()[0],??
????????????????????????????-(ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?-?ContextInfo.total),?'fix',??
????????????????????????????df.iloc[-1,?0],?ContextInfo,?ContextInfo.accountID)??
????????????????#?print(ContextInfo.get_universe()[0],?'回轉(zhuǎn)操作市價(jià)單平多倉',?ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?-?ContextInfo.total,?'股')??
????????????????ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?=?ContextInfo.total??
????????????#?臨近收盤持倉股數(shù)小于每日回轉(zhuǎn)持倉量,買入小于的數(shù)量??
????????????if?ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?<?ContextInfo.total:??
????????????????order_shares(ContextInfo.get_universe()[0],??
????????????????????????????(ContextInfo.total?-?ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]),?'fix',??
????????????????????????????df.iloc[-1,?0],?ContextInfo,?ContextInfo.accountID)??
????????????????#?print(ContextInfo.get_universe()[0],?'回轉(zhuǎn)操作市價(jià)單開多倉',?ContextInfo.total?-?ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?,?'股')??
????????????????ContextInfo.MarketPosition[ContextInfo.get_universe()[0]]?=?ContextInfo.total??
#========================================獲取賬戶可用資金=============================================??
def?get_avaliable(accountid,?datatype):??
????result?=?0??
????resultlist?=?get_trade_detail_data(accountid,?datatype,?"ACCOUNT")??
????for?obj?in?resultlist:??
????????result?=?obj.m_dAvailable??
????return?result??
#=================================獲取持倉信息——股票可用余額{"code":股數(shù)}===============================?
def?get_holdings(accountid,?datatype):??
????holdinglist?=?{}??
????resultlist?=?get_trade_detail_data(accountid,?datatype,?"POSITION")??
????for?obj?in?resultlist:??
????????holdinglist[obj.m_strInstrumentID?+?"."?+?obj.m_strExchangeID]?=?obj.m_nCanUseVolume??
????return?holdinglist??
#======================================================================================================
四、策略回測(cè)
1.回測(cè)頻率、周期、手續(xù)費(fèi)等可視化設(shè)置

2.回測(cè)結(jié)果展示
(1)回測(cè)收益

(2)回測(cè)凈值曲線

可以看出,日內(nèi)回轉(zhuǎn)交易策略的最大回撤都維持在較低水平,同時(shí),勝率和年化收益率也相對(duì)偏低,可以起到增加收益或者減少浮虧的作用。