获取实时k线
import requests
import pandas as pd
url = 'https://api.hbdm.com/market/history/kline?symbol=ETH_CQ&period=5min&size=200'
result = requests.get(url=url, timeout=2).json()['data']
k = pd.DataFrame(result)
画蜡烛图
蜡烛图对于直观理解很重要. mpl.finance早已迁移至mpl_finance, 此外在有时画蜡烛图需要涉及时间格式的处理(请参考这里)
import matplotlib.pyplot as plt
import mpl_finance as mpf
fig, ax = plt.subplots()
#mpf.candlestick_ochl(ax, quotes) #涉及对时间的不必要处理, 不好用
mpf.candlestick2_ochl(ax, k['open'], k['close'], k['high'], k['low'], width=1, colorup='r',colordown='g')
进一步的可视化
这里将使用talib
talib的安装与简易使用, BBANDS函数解析之后再写
民工三连: MA, MACD, BBANDS
from talib import MA,MACD,BBANDS
u,m,l = BBANDS(k['close'])
ma5 = MA(k['close'], 5)
ma10 = MA(k['close'], 10)
fig, axs = plt.subplots(2,1)
mpf.candlestick2_ochl(axs[0], k['open'], k['close'], k['high'], k['low'], width=1, colorup='r',colordown='g')
axs[0].plot(ma5, color='b')
axs[0].plot(ma10, color=(0.1, 0.2, 0.5))
axs[0].plot(u, color='y')
axs[0].plot(l, color='y')
macd, macdsignal, macdhist = MACD(k['close'], fastperiod=12, slowperiod=26, signalperiod=9)
axs[1].plot(macd)
axs[1].plot(macdsignal)
axs[1].bar(range(len(macdhist)),macdhist)
一个简易的多因子策略
根据经验观测, 尝试构造以下简单策略:
- BBANDS反转策略: 在BBANDS下界多单,上界空单, 当超出时按比例加仓(需要小仓位, 否则容易爆仓)
- 超过MA30后加仓, 相反则减仓
- MA5>MA10时加仓,相反则减仓
- macd上突后加仓, 相反则减仓
实现(理想情况)(用于回测):
stackmalong = (k['close']>ma30)*1.0
stackmashort = (ma5>ma10)*2.0
stackmacd = (mahist>0)*2.0
#bbands 策略略微复杂一些,
决策(用于交易)(伪代码)
具体的实现将在下一篇文章里
stackc = current_stack = hold/asset+1
stackr = recommended_stack = f(k)
if stackr-stackc>0:
tobuy = (stackr-stackc)*asset*p/100
equprice = f2(depth)
api_buy(tobuy, equprice)
else:
tosell = (stackr-stackc)*asset*p/100
equprice = f2(depth)
api_sell(tosell, equprice)
此外, k线并非只由close构成, 尤其是合约中由于止损/爆仓的存在, 会出现上下插针的情况, 对于简单策略影响很大
将盘口纳入考量也十分必要, 限于篇幅暂不表述
在high/low中经常会触发策略,而等k线结束通常早就凉了, 长线可能还好, 短线会哭的**都不认识的