一、 前言  

      量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的投资决策

     从全球市场的参与主体来看,按照管理资产的规模,2018年全球排名前四以及前六位中的五家资管机构,都是依靠计算机技术来开展投资决策,而且进入2019年由量化及程序化交易所管理的资金规模进一步扩大。

     从就业人员的薪资水平来看,全球超70%的资金交易用计算机或者程序进行,其中一半是由量化或者程序化的管理人来操盘。在国外招聘网站搜索金融工程师(包括量化、数据科学等关键词)会出现超过33万个相关岗位。

   从高校的培养方向来看,已有超过450所美国大学设置了金融工程专业,每年相关专业毕业生达到1.5万人,市场需求与毕业生数量的差距显著,因此数据科学、计算机科学、会计以及相关STEM(基础科学)学生毕业后进入金融行业从事量化分析和应用开发的相关工作

 

二、量化交易特点

定量投资和传统的定性投资本质上来说是相同的,二者都是基于市场非有效或弱有效的理论基础。两者的区别在于定量投资管理是“定性思想的量化应用”,更加强调数据。量化交易具有以下几个方面的特点:

1、纪律性。根据模型的运行结果进行决策,而不是凭感觉。纪律性既可以克制人性中贪婪、恐惧和侥幸心理等弱点,也可以克服认知偏差,且可跟踪。

2、系统性。具体表现为“三多”。一是多层次,包括在大类资产配置、行业选择、精选具体资产三个层次上都有模型;二是多角度,定量投资的核心思想包括宏观周期、市场结构、估值、成长、盈利质量、分析师盈利预测、市场情绪等多个角度;三是多数据,即对海量数据的处理。

3、套利思想。定量投资通过全面、系统性的扫描捕捉错误定价、错误估值带来的机会,从而发现估值洼地,并通过买入低估资产、卖出高估资产而获利。

4、概率取胜。一是定量投资不断从历史数据中挖掘有望重复的规律并加以利用;二是依靠组合资产取胜,而不是单个资产取胜。

 

三、量化交易回测demo

  使用python 做量化交易

start = '2017-01-01'                       # 回测起始时间
end = '2018-01-01'                         # 回测结束时间
universe = DynamicUniverse('HS300')        # 证券池,支持股票、基金、期货、指数四种资产
benchmark = 'HS300'                        # 策略参考标准
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 1                           # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
  
# 配置账户信息,支持多资产多账户
accounts = {
    'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)
}
  
def initialize(context):
    pass
  
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context):    
    previous_date = context.previous_date.strftime('%Y-%m-%d')
     
    # 获取因子PE的的历史数据集,截止到前一个交易日
    hist = context.history(symbol=context.get_universe(exclude_halt=True), attribute='PE', time_range=1, style='tas')[previous_date]
     
    # 将因子值从小到大排序,并取前100支股票作为目标持仓
    signal = hist['PE'].order(ascending=True)
    target_position = signal[:100].index
     
    # 获取当前账户信息
    account = context.get_account('fantasy_account')   
    current_position = account.get_positions(exclude_halt=True)       
     
    # 卖出当前持有,但目标持仓没有的部分
    for stock in set(current_position).difference(target_position):
        account.order_to(stock, 0)
     
    # 根据目标持仓权重,逐一委托下单
    for stock in target_position:
        account.order(stock, 10000)

 

四、参考资料

优矿-量化交易系统-比较友好的界面以及代码风格