什么是量化投资
-
量化投资的本质是利用大数据寻找规律,进而构建出有效的交易策略。
-
规律有很多,但我们需要寻找到的规律应具有一些特点,譬如可靠和稳定、长期存在、有理论支撑、符合人性、简单直接等。
-
在不成熟的市场更有效。A股现在是量化投资的好时代,未来的难度会加大。
量化投资的分类
-
择时策略,例如基于技术指标来确定买卖点。
-
基本面选股策略
-
仓位管理策略
-
套利策略、算法交易策略等
处理的数据
-
交易数据,例如开盘价、收盘价、成交量、涨跌幅、最高价、最低价等。
-
宏观经济数据,例如GDP、失业率、利率、CPI等。
-
基本面数据、例如财务数据、企业新闻稿、股东变化等。
-
高频数据(分为主笔数据和分笔数据,前者是每一笔成交的信息,后者是3~5秒的汇总交易数据)。
-
舆情数据、事件数据等。
一言以蔽之,有什么数据,做什么策略。
参考资料来源
国泰君安、广发、海通、申万、长江等券商的金融工程研报都是不错的参考资料,值得一看。
一个例子:行业轮动策略
#####策略思路
寻找行业间的股价波动关系,用一阶滞后的数据来寻找相关关系。
策略应用
这个月某行业的股票涨幅好,下个月某某行业的涨幅也会好,那么就可以提前介入某某行业。
策略代码
#导入模块
import numpy as np
import pandas as pd
import itertools
from datetime import datetime
#from deteutil.parser import parse
from scipy import stats as ss
import matplotlib.pyplot as plt
import seaborn as sn
sn.set_style('white')
#自定义获取行业行情的函数
def get_sw_ind_quotation():
index_symbol = DataAPI.IndustryGet(industryVersion=u"SW",industryVersionCD=u"",industryLevel=u"1",isNew=u"1",field=u"",pandas="1")['indexSymbol'].tolist()
index_symbol = [str(item)+'.ZICN' for item in index_symbol]
symbol_history_list = []
for symbol in index_symbol:
df_daily_ind_symbol = DataAPI.MktIdxdGet(indexID=u"",ticker=symbol[:6],beginDate=u"20150807",endDate=u"20180807",field=u"ticker,tradeDate,closeIndex",pandas="1")
symbol_history_list.append(df_daily_ind_symbol)
df_daily_ind_symbol = pd.concat(symbol_history_list,axis=0)
df_daily_ind_unstack = df_daily_ind_symbol.set_index(['tradeDate','ticker']).unstack()['closeIndex']
return df_daily_ind_unstack
df_daily_ind_unstack = get_sw_ind_quotation()
df_daily_ind_unstack = df_daily_ind_unstack.iloc[1:]
df_daily_ind_unstack['tradeDate'] = df_daily_ind_unstack.index
#自定义行业月度行情的函数
def getMonthlyIndex(df_index):
df_index['tradeDate'] = df_index['tradeDate'].map(lambda x: datetime.strptime(x, "%Y-%m-%d") )
df_index['year_month'] = df_index['tradeDate'].map(lambda x: (x.year,x.month))
return df_index.groupby(['year_month']).head(1)
df_monthly_ind_unstack = getMonthlyIndex(df_daily_ind_unstack[:])
df_monthly_ind_unstack.sort_values(['tradeDate'])
del df_monthly_ind_unstack['tradeDate']
del df_monthly_ind_unstack['year_month']
df_monthly_ind_return = df_monthly_ind_unstack.pct_change(axis=0)
df_monthly_ind_return = df_monthly_ind_return.dropna(how='all')
df_monthly_ind_return_rank = df_monthly_ind_return.rank(axis=1)
index_symbol = DataAPI.IndustryGet(industryVersion=u"SW",industryVersionCD=u"",industryLevel=u"1",isNew=u"1",field=u"",pandas="1")['indexSymbol'].tolist()
#自定义计算相关系数的函数
def get_corr(ind1,ind2,df_ind):
x = df_ind[ind1].iloc[0:-1].values
y = df_ind[ind2].iloc[1:].values
return np.corrcoef(x,y)[0][1]
#计算下相关系数
predict_corr = {}
for item in itertools.product(index_symbol,repeat=2):
predict_corr[item] = get_corr(item[0],item[1],df_monthly_ind_return_rank)
predict_corr = pd.Series(predict_corr)
filter_corr = predict_corr[(predict_corr>0.45) |(predict_corr<-0.45) ]
result = filter_corr.sort_values(ascending=0)
result = pd.DataFrame(result)
result.columns =['相关系数']
result=result.reset_index()
result.columns =['领先行业','滞后行业','相关系数']
result
#行业代码替换成行业名称
index_symbol = DataAPI.IndustryGet(industryVersion=u"SW",industryVersionCD=u"",industryLevel=u"1",isNew=u"1",field=u"",pandas="1")
a=0
result['领先行业'] = result['领先行业'].map(lambda x: index_symbol[index_symbol.indexSymbol == x]['industryName'].values)
result['滞后行业'] = result['滞后行业'].map(lambda x: index_symbol[index_symbol.indexSymbol == x]['industryName'].values)
result
运行结果
刺猬偷腥
2018年8月26日