【干货分享】从零开始学量化:04阿尔法策略

  1. 策略原理:
    始终买入沪深300中市值最小的5只
    先订阅000300分钟行情(也可订阅其他symbol,只是用来作行情触发)
    第一个bar行情到来时在md_init中选股
    选出股票池与持仓作对比
    无持仓时直接按照股票池等权买入
    有持仓时,不在股票池中的股票卖出
    在成交回报on_order_filled中判断是否都已卖出,卖出仓位都成交以后再买入。

  2. 代码解读:
    2.1 Alpha.py

# !/usr/bin/env python
# -*- coding: utf-8 -*-
from gmsdk.api import StrategyBase


class Alpha(StrategyBase):

    def __init__(self, *args, **kwargs):
        super(Alpha, self).__init__(*args, **kwargs)
        self.buy_dict = {}
        self.sell_dict = {}
        self.is_traded = False

    def initialize(self):
        pass

    # 收到第一根Bar后交易
    def on_bar(self, bar):
        print(bar.strtime)
        if self.is_traded:
            return
        self.is_traded = True
        self.initialize()
        self.handle_data()

    def handle_data(self):
        pass

    def on_order_filled(self, order):
        if order.sec_id in self.sell_dict and order.strategy_id == self.strategy_id:
            self.sell_dict.pop(order.sec_id)
            if len(self.sell_dict) == 0:  # 由于资金每次都开满,等卖盘全部成交资金回流时再买入
                cash = self.get_cash()
                for bar in self.buy_dict.values():
                    vol = int(cash.available * 0.95 / len(self.buy_dict) / bar.close / 100) * 100
                    self.open_long(bar.exchange, bar.sec_id, 0, vol)
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from Alpha import Alpha

'''
请在Strategy中修改个人账号密码和策略ID
'''

class Strategy(Alpha):
    def __init__(self, *args, **kwargs):
        super(Strategy, self).__init__(*args, **kwargs)
        self.md.subscribe('SHSE.000300.bar.60')  # 订阅一个symbol,在交易时间触发下单

    def initialize(self):
        # region 获取沪深300中当天可交易的股票
        instruments1 = self.get_instruments('SHSE', 1, 1)
        instruments2 = self.get_instruments('SZSE', 1, 1)
        symbol_list1 = set(instrument.symbol for instrument in instruments2 + instruments1)  # 获取当日可交易的股票,剔除B股
        constituents = self.get_constituents('SHSE.000300')
        symbol_list2 = set(constituent.symbol for constituent in constituents)  # 获取沪深300成分股(剔除ST、*ST股票,以及上市时间不足3个月等股票后剩余的股票)
        symbol_list = symbol_list1 & symbol_list2
        symbol_list = ','.join(symbol for symbol in symbol_list)
        # endregion

        # region 选出市值最小的5只
        market_index = self.get_last_market_index(symbol_list)
        data = [mi for mi in market_index]
        data = sorted(data, key=lambda mi: mi.market_value)[:5]  # 市值最小的5只
        # endregion

        # region 为了计算仓位,获取昨日dailybar,存入buy_dict
        buy_list = ','.join(d.symbol for d in data)
        dailybars = self.get_last_dailybars(buy_list)
        self.buy_dict = {dailybar.sec_id: dailybar for dailybar in dailybars}
        # endregion


    def handle_data(self):
        # region 没有持仓时直接open_long
        print(self.buy_dict.keys())
        positions = self.get_positions()
        if len(positions) == 0:
            cash = self.get_cash()
            for b in self.buy_dict.values():
                vol = int(cash.available * 0.95 / len(self.buy_dict) / b.close / 100) * 100
                self.open_long(b.exchange, b.sec_id, 0, vol)
            return
        # endregion

        # region 有持仓时结合持仓获取buy_dict,sell_dict
        for p in positions:
            if p.sec_id in self.buy_dict:
                self.buy_dict.pop(p.sec_id)
            else:
                self.sell_dict[p.sec_id] = p
        # endregion

        for p in self.sell_dict.values():  # 先卖出,卖盘成交时再买入,若资金足够也可以直接买入
            self.close_long(p.exchange, p.sec_id, 0, p.volume)

    def on_order_status(self, order):
        pass

if __name__ == '__main__':
    my_strategy = Strategy(
        username='username',  # 请修改账号
        password='password',  # 请修改密码
        strategy_id='strategy_id',  # 请修改策略ID
        mode=2,
        td_addr='localhost:8001')
    ret = my_strategy.run()
    print('exit code: ', ret)
  1. Python相关函数(上传乱码,具体函数见证经社——
    3.1 Python标准函数:http://zjshe.cn/q/forum.php?mod=viewthread&tid=51&extra=page%3D1)
    3.2 掘金接口函数:
  2. 金融术语:
    阿尔法策略:投资者在市场交易中面临着系统性风险(即贝塔或Beta、β风险)和非系统性风险(即阿尔法或Alpha、α风险),通过对系统性风险进行度量并将其分离,从而获取超额绝对收益(即阿尔法收益)的策略组合,即为阿尔法策略。从广义上讲,获取阿尔法收益的投资策略有很多种,其中既包括传统的基本面分析选股策略、估值策略、固定收益策略等等,也包括利用衍生工具对冲掉贝塔风险、获取阿尔法收益的可转移阿尔法策略。后者在国内通常被称为阿尔法对冲策略,并在近年A股市场上得到广泛应用。本策略只是展示了选股策略,并没有将贝塔风险对冲。
1赞

顶顶顶~好贴莫沉

其实帖子也没有什么沉不沉的问题,这反正也不是一个热点问题库。只需要把比较高质量的信息和分析发到这里来就行了。

嗯嗯好嘞