雙動力策略是期貨領域非常有名的策略,這裏我們把這個策略移植到了股票領域,由於股票只能做多,因此我們把期貨做空的策略邏輯直接刪除,即可得股票的雙動力策略。策略的邏輯如下圖所示:
這裏有做空的邏輯,我們把他刪掉,直接利用做多的邏輯,程序代碼如下:
import talib
def initialize(context):
# 初始化此策略
# 設置我們要操作的股票池, 這裏我們只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
g.K1 = 0.4
g.K2 = 0.6
g.buy = 0
#當五日均線高於十日均線時買入,當五日均線低於十日均線時賣出
def handle_data(context, data):
security = g.security
# 獲取歷史價格,最高價
H = get_history(30, '1d', field = 'high', fq = 'pre')
# 獲取歷史價格,最低價
L = get_history(30, '1d', field = 'low', fq = 'pre')
# 獲取歷史價格,收盤價
C = get_history(30, '1d', field = 'close', fq = 'pre')
# 獲取歷史價格,開盤價
O = get_history(30, '1d', field = 'open', fq = 'pre')
# 最高價最高價
HH = H[security].max()
# 收盤價最低價
LC = C[security].min()
# 收盤價最高價
HC = C[security].max()
# 最低價最低價
LL = L[security].min()
# 用於計算入場指標
Range = max(HH - LC, HC - LL)
# 計算移動平均線
ma10 = talib.MA(C[security].values, 20)
JX = ma10[-1]
ZSX = min(ma10[-11:-1])
amount = context.portfolio.positions[security]['amount']
cash = context.portfolio.cash
if H[security][-1] > (O[security][-1] + g.K1 * Range) and C[security][-1] > JX and amount == 0:
# 全部的可用資金買入
order_target_value(security, cash)
# 記錄買入價格
g.buy = C[security][-1]
if (L[security][-1] < (O[security][-1] - g.K2 * Range) and amount > 0) or (L[security][-1] > g.buy and L[security][-1] < ZSX):
order_target(security, 0)
g.buy = 0