????????軟件不錯,滿足了我對股票,期貨,期權的全部要求。而且數據可以提供下載,簡直沒話說了。
????????數據清洗問題,我其實很早以前就在思考這個問題,回測,到底在測什么?什么樣的數據可以用來回測?什么樣的回測才是好的回測,才是可以拿來實盤的?說什么tick回測更精準,我到哪去找?我交易也沒指望那么高頻率,誤差出現,我能hold住就行。
不管了,就這樣,默認他的數據有用,直接上來干吧!
? ? ? ? 先做多因子選股策略:
? ? ? ? 擇時函數:
def signal(ContextInfo):buy = {i:0 for i in ContextInfo.s}sell = {i:0 for i in ContextInfo.s}data_high = ContextInfo.get_history_data(22,'1d','high',3)data_high_pre = ContextInfo.get_history_data(2,'1d','high',3)data_close60 = ContextInfo.get_history_data(62,'1d','close',3)#print data_high#print data_close#print data_close60
#選擇買入點for k in ContextInfo.s:if k in data_close60:if len(data_high_pre[k]) == 2 and len(data_high[k]) == 22 and len(data_close60[k]) == 62:if data_high_pre[k][-2] > max(data_high[k][:-2]):buy[k] = 1 #超過20日最高價,加入買入備選elif data_high_pre[k][-2] < np.mean(data_close60[k][:-2]):sell[k] = 1 #低于60日均線,加入賣出備選#print buy#print sellreturn buy,sell #買入賣出備選
獲取數據排序?
for k in list(buys.keys()):if buys[k] == 1:
#找因子rank1[k] = ext_data_rank('atr',k[-2:]+k[0:6],0,ContextInfo)rank2[k] = ext_data_rank('adtm',k[-2:]+k[0:6],0,ContextInfo)#print rank1[k], rank2[k]rank_total[k] = 0.5 * rank1[k]- 0.5 * rank2[k] #因子的權重需要人為設置,此處取了0.5print (1111111, rank1[k])
策略代碼
#coding:gbk
"""
回測模型示例(非實盤交易策略)
#HS300日線下運行,20個交易日進行 一次調倉,每次買入在買入備選中因子評分前10的股票,每支股票各分配當前可用資金的10%(權重可調整)
#擴展數據需要在補完HS300成分股數據之后生成,本模型中擴展數據暫時使用VBA指標ATR和ADTM生成,命名為atr和adtm
"""
import pandas as pd
import numpy as np
import time
import datetime
#對所有股票進行擇時交易
def signal(ContextInfo):buy = {i:0 for i in ContextInfo.s}sell = {i:0 for i in ContextInfo.s}data_high = ContextInfo.get_history_data(22,'1d','high',3)data_high_pre = ContextInfo.get_history_data(2,'1d','high',3)data_close60 = ContextInfo.get_history_data(62,'1d','close',3)#print data_high#print data_close#print data_close60for k in ContextInfo.s:if k in data_close60:if len(data_high_pre[k]) == 2 and len(data_high[k]) == 22 and len(data_close60[k]) == 62:if data_high_pre[k][-2] > max(data_high[k][:-2]):buy[k] = 1 #超過20日最高價,加入買入備選elif data_high_pre[k][-2] < np.mean(data_close60[k][:-2]):sell[k] = 1 #低于60日均線,加入賣出備選#print buy#print sellreturn buy,sell #買入賣出備選def init(ContextInfo):ContextInfo.s = ContextInfo.get_sector('000300.SH')ContextInfo.set_universe(ContextInfo.s)ContextInfo.day = 0ContextInfo.holdings = {i:0 for i in ContextInfo.s}ContextInfo.weight = [0.1]*10 #設置資金分配權重ContextInfo.buypoint = {}ContextInfo.money = ContextInfo.capitalContextInfo.profit = 0ContextInfo.accountID='testS'
#獲取發出買入信號的股票,進行因子評級
def handlebar(ContextInfo):rank1 = {}rank2 = {}rank_total = {}tmp_stock = {}d = ContextInfo.barposprice = ContextInfo.get_history_data(1,'1d','open',3)if d > 60 and d % 20 == 0: #每月一調倉nowDate = timetag_to_datetime(ContextInfo.get_bar_timetag(d),'%Y%m%d')print(nowDate)buys, sells = signal(ContextInfo)order = {}for k in list(buys.keys()):if buys[k] == 1:rank1[k] = ext_data_rank('atr',k[-2:]+k[0:6],0,ContextInfo)rank2[k] = ext_data_rank('adtm',k[-2:]+k[0:6],0,ContextInfo)#print rank1[k], rank2[k]rank_total[k] = 0.5 * rank1[k]- 0.5 * rank2[k] #因子的權重需要人為設置,此處取了0.5和-0.5print (1111111, rank1[k])tmp = sorted(list(rank_total.items()), key = lambda item:item[1])#print tmpif len(tmp) >= 10:tmp_stock = {i[0] for i in tmp[:10]}else:tmp_stock = {i[0] for i in tmp} #買入備選中若超過10只股票則選10支,不足10支則全選for k in list(buys.keys()):if k not in tmp_stock:buys[k] = 0if tmp_stock:print('stock pool:',tmp_stock)for k in ContextInfo.s:if ContextInfo.holdings[k] > 0 and sells[k] == 1:print('ready to sell')order_shares(k,-ContextInfo.holdings[k]*100,'fix',price[k][-1],ContextInfo,ContextInfo.accountID)ContextInfo.money += price[k][-1] * ContextInfo.holdings[k] * 100 - 0.0003*ContextInfo.holdings[k]*100*price[k][-1] #手續費按萬三設定ContextInfo.profit += (price[k][-1]-ContextInfo.buypoint[k]) * ContextInfo.holdings[k] * 100 - 0.0003*ContextInfo.holdings[k]*100*price[k][-1]#print price[k][-1]print(k)#print ContextInfo.moneyContextInfo.holdings[k] = 0ContextInfo.money_distribution = {k:i*ContextInfo.money for (k,i) in zip(tmp_stock,ContextInfo.weight)}for k in tmp_stock:if ContextInfo.holdings[k] == 0 and buys[k] == 1:print('ready to buy')order[k] = int(ContextInfo.money_distribution[k]/(price[k][-1]))/100order_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]ContextInfo.profit -= 0.0003*order[k]*100*price[k][-1]print(k)ContextInfo.holdings[k] = order[k]print(ContextInfo.money,ContextInfo.profit,ContextInfo.capital)profit = ContextInfo.profit/ContextInfo.capitalif not ContextInfo.do_back_test:ContextInfo.paint('profit_ratio', profit, -1, 0)