一、优矿
要登陆优矿,直接使用手机验证码登陆即可。
或者用账号:138+K134
二、效果



三、代码
from hmmlearn.hmm import GaussianHMM
import datetime
import numpy as np
from matplotlib import cm, pyplot as plt
import matplotlib.dates as dates
import pandas as pd
import seaborn as sns
sns.set_style('white')
beginDate = '20100401'
endDate = '20160317'
data = DataAPI.MktIdxdGet(ticker='000001',beginDate=beginDate,endDate=endDate,field=['tradeDate','closeIndex','lowestIndex','highestIndex','turnoverVol'],pandas="1")
data1 = DataAPI.FstTotalGet(exchangeCD=u"XSHE",beginDate=beginDate,endDate=endDate,field=['tradeVal'],pandas="1")
data2 = DataAPI.FstTotalGet(exchangeCD=u"XSHG",beginDate=beginDate,endDate=endDate,field=['tradeVal'],pandas="1")
tradeVal = data1 + data2
tradeDate = pd.to_datetime(data['tradeDate'][5:])
volume = data['turnoverVol'][5:]
closeIndex = data['closeIndex']
deltaIndex = np.log(np.array(data['highestIndex'])) - np.log(np.array(data['lowestIndex']))
deltaIndex = deltaIndex[5:]
logReturn1 = np.array(np.diff(np.log(closeIndex)))
logReturn1 = logReturn1[4:]
logReturn5 = np.log(np.array(closeIndex[5:])) - np.log(np.array(closeIndex[:-5]))
logReturnFst = np.array(np.diff(np.log(tradeVal['tradeVal'])))[4:]
closeIndex = closeIndex[5:]
X = np.column_stack([logReturn1,logReturn5,deltaIndex,volume,logReturnFst])
# Make an HMM instance and execute fit
model = GaussianHMM(n_components=6, covariance_type="diag", n_iter=1000).fit([X])
# Predict the optimal sequence of internal hidden state
hidden_states = model.predict(X)
#print("Transition matrix")
#print(model.transmat_)
#print()
#print("Means and vars of each hidden state")
#for i in range(model.n_components):
# print("{0}th hidden state".format(i))
# print("mean = ", model.means_[i])
# print("var = ", np.diag(model.covars_[i]))
#整合数据
res = pd.DataFrame({'tradeDate':tradeDate,'logReturn1':logReturn1,'logReturn5':logReturn5,'volume':volume,'state':hidden_states}).set_index('tradeDate')
plt.figure(figsize=(15, 8))
for i in range(model.n_components):
idx = (hidden_states==i)
plt.plot_date(tradeDate[idx],closeIndex[idx],'.',label='%dth hidden state'%i,lw=1)
plt.legend()
plt.grid(1)
plt.figure(figsize=(15, 8))
for i in range(model.n_components):
idx = (hidden_states==i)
idx = np.append(0,idx[:-1])#获得状态结果后第二天进行买入操作
#fast factor backtest
df = res.logReturn1
res['sig_ret%s'%i] = df.multiply(idx,axis=0)
plt.plot(np.exp(res['sig_ret%s'%i].cumsum()),label='%dth hidden state'%i)
plt.legend()
plt.grid(1)
plt.figure(figsize=(15, 8))
idxlong = (hidden_states==1) + (hidden_states==5) #做多状态
idxlong = np.append(0,idxlong[:-1])#获得状态结果后第二天进行买入操作
idxshort = (hidden_states==0) + (hidden_states==3) + (hidden_states==4) #做空状态
idxshort = np.append(0,idxshort[:-1])#获得状态结果后第二天进行买入操作
#fast factor backtest
df = res.logReturn1
res['sig_retbest'] = df.multiply(idxlong,axis=0) - df.multiply(idxshort,axis=0)
plt.plot_date(tradeDate,np.exp(res['sig_retbest'].cumsum()),'-',label='our strategy')
plt.legend()
plt.grid(1)
参考:https://uqer.io/v3/community/share/56ec30bf228e5b887be50b35