éåæèµç³»åæç« ï¼
Backtrader æç¨ â Python éåæèµå®ææç¨(1)
Python éåæèµå®ææç¨(2) âMACDçç¥(+26.9%)
Python éåæèµå®ææç¨(3) âAè¡åæµMACDçç¥
Githubä»åºï¼
github.com/Ckend/pythoâ¦
ä»å¤©æä»¬æ¥ä½¿ç¨backtraderè¯è¯å¦ä¸ä¸ªéåæèµçç¥ï¼KDJçç¥ï¼KDJæ¯æå¸¸ç¨çææ ä¹ä¸ï¼å
¶ä¸æåå«âéæºææ âãå®éè¿ç»è®¡å¦åçï¼è¯å«Nä¸ªäº¤ææ¥å
æé«ä»·ãæä½ä»·ãææ°æ¶çä»·ä¸è
ä¹é´çæ¯ä¾å
³ç³»æ¥è®¡ç®éæºå¼ï¼RSVï¼ï¼ç¶ååæ ¹æ®å æç§»å¨å¹³å线(EMA)çæ¹æ³æ¥è®¡ç®Kå¼ãDå¼ãJå¼ã
å
·ä½è®¡ç®æ¹æ³å¦ä¸ï¼
RSV = ï¼æ¶çä»·-N卿æä½ä»·ï¼/ï¼N卿æé«ä»·-N卿æä½ä»·ï¼*100
Kå¼ = RSVçNå¨æå æç§»å¨å¹³åå¼
Då¼ = Kå¼çNå¨æå æç§»å¨å¹³åå¼
Jå¼ = 3_K-2_D
ä¸è¬æ¥è¯´ï¼RSVçN卿鿩9ï¼KåDçN卿鿩3ã
åºæ¬æ¦å¿µå¤§å®¶é½æäºï¼é£å¦ä½æ ¹æ®KDJå¼å³å®ä¹°å
¥åååºå¢ï¼
å½Jå¼ä¸ç©¿Kå¼çæ¶åï¼æ¯ä¹°å
¥ä¿¡å·ï¼æ¤æ¶ä¹°å
¥ã
å½Jå¼ä¸ç©¿Kå¼çæ¶åï¼æ¯ååºä¿¡å·ï¼æ¤æ¶ååºã
è¿ä¸ªçç¥æç¨åï¼è®©æä»¬æ¥è¯è¯çã
å¼å§ä¹åï¼ä½ è¦ç¡®ä¿Pythonåpipå·²ç»æåå®è£
å¨çµèä¸å¢ï¼å¦ææ²¡æï¼è¯·è®¿é®è¿ç¯æç« ï¼
è¶
详ç»Pythonå®è£
æå
è¿è¡å®è£
ãå¦æä½ ç¨Pythonçç®çæ¯æ°æ®åæï¼å¯ä»¥ç´æ¥å®è£
Anacondaï¼
Pythonæ°æ®åæä¸ææå¥½å¸®æâAnaconda
Windowsç¯å¢ä¸æå¼Cmd(å¼å§âè¿è¡âCMD)ï¼è¹æç³»ç»ç¯å¢ä¸è¯·æå¼Terminal(command+ç©ºæ ¼è¾å
¥Terminal)ï¼åå¤å¼å§è¾å
¥å½ä»¤å®è£
ä¾èµã
å½ç¶ï¼ææ´æ¨è大家ç¨VSCodeç¼è¾å¨ï¼ææ¬æä»£ç Copy䏿¥ï¼å¨ç¼è¾å¨ä¸æ¹çç»ç«¯è¿è¡å½ä»¤å®è£
ä¾èµæ¨¡åï¼å¤èæçä¸ä»¶äºåï¼
Python ç¼ç¨çæå¥½ææ¡£âVSCode è¯¦ç»æåã
å¨ç»ç«¯è¾å
¥ä»¥ä¸å½ä»¤å®è£
æä»¬æéè¦çä¾èµæ¨¡å:
pip install backtrader
çå° Successfully installed xxx å说æå®è£
æåã
Backtraderåºæ¬ä½¿ç¨è¯·çæä»¬åä¸ç¯æç« ï¼
backtraderæç¨âéåæèµå®ææç¨(1)
æ¬æå
¨é¨ä»£ç ï¼è¯·å¨Pythonå®ç¨å®å
¸åå°åå¤ï¼
éåæèµ4
è¿è¡ä¸è½½ã
2.åä¸KDJçç¥
å¦æä½ ä»¥åæ²¡ç¨è¿backtraderï¼è¯·å
çï¼
backtraderæç¨âéåæèµå®ææç¨(1)
è¿è¡å¦ä¹ ï¼ä¸ç¶ä½ 伿ç¹èãç´æ¥ä¸è½½ä»£ç å¦ä¹ 乿¯ä¸ç§æ¹å¼ï¼ä½åææ¯ä½ çèªå¦æ¬é¢å¤å¼ºã
é¦å
æä»¬éè¦å
计ç®KãDãJä¸ä¸ªå¼ï¼å颿们ä¹è¯´è¿äºä»ä»¬çè®¡ç®æ¹å¼ï¼
RSV = ï¼æ¶çä»·-N卿æä½ä»·ï¼/ï¼N卿æé«ä»·-N卿æä½ä»·ï¼*100
Kå¼ = RSVçNå¨æå æç§»å¨å¹³åå¼
Då¼ = Kå¼çNå¨æå æç§»å¨å¹³åå¼
Jå¼ = 3_K-2_D
ç¥éäºè®¡ç®æ¹å¼ï¼é£ä¹åçå·¥ä½å°±ç®åäºï¼
self.high_nine = bt.indicators.Highest(self.data.high, period=9)
self.low_nine = bt.indicators.Lowest(self.data.low, period=9)
self.rsv = 100 * bt.DivByZero(
self.data_close - self.low_nine, self.high_nine - self.low_nine, zero=None
self.K = bt.indicators.EMA(self.rsv, period=3)
self.D = bt.indicators.EMA(self.K, period=3)
self.J = 3 * self.K - 2 * self.D
å¤å¶ä»£ç
æåå³å®ä¹°å
¥ç¹åååºç¹ï¼
def next(self):
self.log("Close, %.2f" % self.dataclose[0])
if self.order:
return
if not self.position:
condition1 = self.J[-1] - self.D[-1]
condition2 = self.J[0] - self.D[0]
if condition1 < 0 and condition2 > 0:
self.log("BUY CREATE, %.2f" % self.dataclose[0])
self.order = self.buy()
else:
condition = (self.dataclose[0] - self.bar_executed_close) / self.dataclose[0]
if condition > 0.1 or condition < -0.1:
self.log("SELL CREATE, %.2f" % self.dataclose[0])
self.order = self.sell()
å¤å¶ä»£ç
ä¸è¿ä»ååºçç¥ä¸å¯ä»¥çå°ï¼æææ¶æ²¡æä½¿ç¨Jä¸ç©¿Kå¼çæ¹å¼æ¥ååºè¡ç¥¨ï¼èæ¯éç¨æ¶¨è·10%çéå¶æ§æ¡ä»¶ä½ä¸ºååºä¿¡å·ï¼ççè¿æ ·ççç¥è¡¨ç°å¦ä½ã
è¿éåä¸ç¯æç« 䏿 ·ï¼å±ç¨10000å
ä½ä¸ºæ¬éï¼å¯¹002859è¿åªè¡ç¥¨ï¼åæµå
¶2010å¹´1æ1æ¥è³2020å¹´4æ21æ¥æé´çèµ°å¿ï¼
ææä¸æ¯å¾å¥½ï¼æ¬é10000å
ï¼æåå©ä½9892å
ï¼ä¹å°±æ¯è¿äºæäºãä»çå©åäºæç¹ä¸æ¥çï¼è¯¥çç¥ç¡®å®äºææ¬¡æ°æ´å¤ï¼æ¯ç婿¬¡æ°å¤äºä¸æ¬¡ã
ä¸è¿è¿æ¯æä»¬åºäºéå¶æ§ååºçæ¡ä»¶ï¼å¦ææ¯Jå¼ä¸ç©¿Kå¼ä½ä¸ºååºä¿¡å·å¢ï¼
åºäº
backtrader
ï¼æä»¬åè¿æ ·çä¹°å
¥ååºä¿¡å·è°æ´ççé常ç®åï¼
def next(self):
self.log("Close, %.2f" % self.dataclose[0])
if self.order:
return
condition1 = self.J[-1] - self.D[-1]
condition2 = self.J[0] - self.D[0]
if not self.position:
if condition1 < 0 and condition2 > 0:
self.log("BUY CREATE, %.2f" % self.dataclose[0])
self.order = self.buy()
else:
if condition1 > 0 or condition2 < 0:
self.log("SELL CREATE, %.2f" % self.dataclose[0])
self.order = self.sell()
å¤å¶ä»£ç
ææå¦ä½ï¼
æå个å»ï¼æ¨è¿ä¸ªä¸å¤ªé è°±åï¼10000å
æ¬éåªå©9029å
äºã
使¯è¿æ ·å¹¶æ²¡æè¶³å¤è¯æ®å¦è®¤è¿ä¸ªçç¥çä»·å¼ï¼æ¥ä¸æ¥æä»¬å°è¯å°å®åMACDçç¥ç»åå¨ä¸èµ·ä½¿ç¨ã
3.å¤çç¥åæµ
éè¿åæµå¾å°çå¾è¡¨ï¼æåç°ï¼KDJææ å¨å³å®ä¹°å
¥ä¿¡å·çæ¶åæå¾å¤§çå»¶è¿ï¼æ¯MACDçä¹°å
¥ä¿¡å·å»¶è¿éå¾å¤ï¼ä½æ¯å®çååºä¿¡å·å´ä¸éï¼å¾ææã
æä»¥æä»¬å¯ä»¥èèå°MACDçç¥ä¹å¼å
¥è¿æ¥ï¼ä½¿ç¨MACDå³çä¹°å
¥ï¼KDJä¿¡å·å³çååºãå¼å
¥MACDçç¥ç¸å
³åéï¼
me1 = EMA(self.data, period=12)
me2 = EMA(self.data, period=26)
self.macd = me1 - me2
self.signal = EMA(self.macd, period=9)
bt.indicators.MACDHisto(self.data)
å¤å¶ä»£ç
è³äºä¸ºä»ä¹MACDçç¥æ¯è¿ä¹è®¡ç®çï¼è¯·çæä»¬ä¸ä¸ç¯æç« ï¼
Python éåæèµå®ææç¨(2) âMACDçç¥(+26.9%)
ãæä»¥æä»¬çæç« æ¯ç¯ç¯ç¸æ£çå¦ï¼å¦ææ²¡æé
读ï¼è¯·è®°å¾å头补ä¸ã
ä»ä¸é¢ä¸¤å¼ å¾ä¸ï¼å¤§å®¶å¯ä»¥çå°ä¸¤æ¡ååé常大ç线ï¼è¿æ¯ä¸¤æ¡3æ¥EMAç线ãæä»¬å¯ä»¥å°å
¶åæ¶æï¼å 为å®ä»¬æ²¡æå¤ªå¤ä»·å¼ãå ä¸ä¸ªplot=Falseåæ°å³å¯è®©å®ä»¬ä¸æ¾ç¤ºï¼
self.K = bt.indicators.EMA(self.rsv, period=3, plot=False)
self.D = bt.indicators.EMA(self.K, period=3, plot=False)
å¤å¶ä»£ç
åºäºMACDçç¥çä¹°å
¥ä¿¡å·è¿è¡ä¹°å
¥ï¼KDJçç¥çååºä¿¡å·è¿è¡ååºï¼
if not self.position:
condition1 = self.macd[-1] - self.signal[-1]
condition2 = self.macd[0] - self.signal[0]
if condition1 < 0 and condition2 > 0:
self.log('BUY CREATE, %.2f' % self.dataclose[0])
self.order = self.buy()
else:
condition1 = self.J[-1] - self.D[-1]
condition2 = self.J[0] - self.D[0]
if condition1 > 0 or condition2 < 0:
self.log("SELL CREATE, %.2f" % self.dataclose[0])
self.order = self.sell()
å¤å¶ä»£ç
åæµææå¦ä¸ï¼
æç»å¾å°10057.06ï¼èµäº57åé±ããå½ç¶ï¼æ»æ¯å纯KDJçç¥ä¸èµç好ã使¯è¿ä¸ªçç¥ä¾ç¶åå¨é®é¢ï¼å®å¨å¾å¤è½èµå¤§é±çæ¶åï¼è¿äºä¿é©å°å°è¡ç¥¨ååºäºï¼ä»¥è³äºå
¶äºæç次æ°å
¶å®å¤§äºçå©ç次æ°ã
å½ç¶ï¼å纯ä»ä¸åªè¡ç¥¨ä¸æä»¬æ¯æ æ³çåºè¿ä¸ªçç¥çæ´ä½å¥½åçï¼ä¸ä¸ç¯éåæèµæç« ï¼å¤§çº¦å¨2020/05/09ï¼ï¼æä»¬å°å¨Aè¡ä¸éæºå1000åªè¡ç¥¨ï¼æ¥éªè¯è¿ä¸ªå¤åçç¥çæ´ä½æ¶çãæ¬è¯·æå¾
Pythonå®ç¨å®å
¸çææ°æ´æ°å¦ã
æä»¬çæç« å°æ¤å°±ç»æå¦ï¼å¦æä½ 忬¢æä»¬ä»å¤©ç
Python 宿æç¨
ï¼è¯·æç»å
³æ³¨æä»¬ï¼å¦æå¯¹ä½ æå¸®å©ï¼éº»ç¦å¨ä¸é¢ç¹ä¸ä¸ªèµ/å¨çå¦ï¼æä»»ä½é®é¢é½å¯ä»¥å¨ä¸æ¹çè¨åºçè¨ï¼æä»¬é½ä¼èå¿è§£ççï¼
Pythonå®ç¨å®å
¸
ä¸åªæ¯ä¸ä¸ªå®å
¸