# Competitive Securities

## 策略实现：

• 计算三只同一行业股票过去4天内前3天的平均成交价（VWAP），这里选用的是中国平安 (601318.XSHG)、中国太保 (601601.XSHG)和中国人寿 (601628.XSHG)

• 当某两只股票的价格低于`0.995 * VWAP`，同时另一只股票价格高于VWAP时，买入后者

• 当某两只股票的价格高于`1.025 * VWAP`，同时另一只股票价格低于VWAP时，清空后者

``````import pandas as pd
import numpy as np
from datetime   import datetime
from matplotlib import pylab

import quartz
import quartz.backtest as qb
import quartz.performance as qp
from quartz.api import *
``````
``````"Competitive Securities"

start = pd.datetime(2012, 1, 1)
end   = pd.datetime(2014, 12, 1)
bm = 'HS300'
universe = ['601601.XSHG', '601318.XSHG', '601628.XSHG']
csvs = []

capital_base = 5000
window = 4
threshold_dn = 0.995
threshold_up = 1.025
refresh_rate = 4

def initialize(account):
account.amount = 1000
account.universe = universe

def handle_data(account):

vwap3, price = {}, {}
for stk in account.universe:
if stk not in account.hist:
continue

vwap3[stk] = sum(account.hist[stk]['turnoverValue'][:3])/sum(account.hist[stk]['turnoverVol'][:3])
price[stk] = account.hist[stk].iloc[window-1,:]['closePrice']

if len(vwap3)!=3:
return

stk_0 = account.universe[0]
stk_1 = account.universe[1]
stk_2 = account.universe[2]

if price[stk_1] <= threshold_dn * vwap3[stk_1] and price[stk_2] <= threshold_dn * vwap3[stk_2] and price[stk_0] > vwap3[stk_0]:
order(stk_0, account.amount)
if price[stk_2] <= threshold_dn * vwap3[stk_2] and price[stk_0] <= threshold_dn * vwap3[stk_0] and price[stk_1] > vwap3[stk_1]:
order(stk_1, account.amount)
if price[stk_0] <= threshold_dn * vwap3[stk_0] and price[stk_1] <= threshold_dn * vwap3[stk_1] and price[stk_2] > vwap3[stk_2]:
order(stk_2, account.amount)

if price[stk_1] >= threshold_up * vwap3[stk_1] and price[stk_2] >= threshold_up * vwap3[stk_2] and price[stk_0] < vwap3[stk_0]:
order_to(stk_0, 0)
if price[stk_2] >= threshold_up * vwap3[stk_2] and price[stk_0] >= threshold_up * vwap3[stk_0] and price[stk_1] < vwap3[stk_1]:
order_to(stk_1, 0)
if price[stk_0] >= threshold_up * vwap3[stk_0] and price[stk_1] >= threshold_up * vwap3[stk_1] and price[stk_2] < vwap3[stk_2]:
order_to(stk_2, 0)
``````

``````perf = qp.perf_parse(bt)
out_keys = ['annualized_return', 'volatility', 'information',
'sharpe', 'max_drawdown', 'alpha', 'beta']

for k in out_keys:
print '%s: %s' % (k, perf[k])

annualized_return: 0.14708285
volatility: 0.285959506628
information: 0.525131029268
sharpe: 0.395275720443
max_drawdown: 0.391931712536
alpha: 0.089663482291
beta: 1.15117691695
``````
``````perf['cumulative_return'].plot()
perf['benchmark_cumulative_return'].plot()
pylab.legend(['current_strategy','HS300'])

<matplotlib.legend.Legend at 0x55bf290>
``````