Commit a36f0cb9 by 20210801014

commit code

parent ec78c98c
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
start_date = '20190103'
end_date = '20210122'
import json
import talib
import numpy as np
def initialize(context):
# MACD 金叉MA 多头 指标设置DIF 短线=12, DIF 长线=26, DEA=9
context.short_period = 12
context.long_period = 26
context.dea = 9
context.trading_day_count = 0
# MA 多头 MA 短线=5,MA 长线=20
context.ma_short = 5
context.ma_long = 20
# 资金
context.cash = 10000
# 交易费用
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0003, min_cost=5))
def is_all_nan(data):
for datum in data:
if str(datum) != 'nan':
return False
return True
# 计算MACD
def macd(context, data):
stock_set = set()
d = data.history(data.keys(), 'price', bar_count=34, frequency='1d')
for key in data.keys():
s = np.asarray(d[key])
if not is_all_nan(s):
macd, macdsignal, macdhist = talib.MACD(s, context.short_period, context.long_period, context.dea)
if macdhist[-1] > 0:
stock_set.add(key.symbol)
return stock_set
# 计算MA
def ma(context, data):
stock_set = set()
d_5 = data.history(data.keys(), 'price', bar_count=5, frequency='1d')
d_20 = data.history(data.keys(), 'price', bar_count=20, frequency='1d')
for key in data.keys():
s_5 = np.asarray(d_5[key])
s_20 = np.asarray(d_20[key])
if not is_all_nan(s_5) and not is_all_nan(s_20):
ma5 = talib.MA(s_5, timeperiod=5, matype=0)
ma20 = talib.MA(s_20, timeperiod=20, matype=0)
if ma5[-1] > ma20[-1]:
stock_set.add(key.symbol)
return stock_set
def handle_data(context, data):
# 每20日交易一次
if context.trading_day_count % 20 == 0:
set_macd = macd(context, data)
set_ma = ma(context, data)
candidate_list = list(set_macd & set_ma)
max_stock_count = 10
if len(candidate_list) > max_stock_count:
candidate_list = candidate_list[0:10]
# 全部卖出
for equity in context.portfolio.positions:
position = context.portfolio.positions[equity]
sid = position.sid
if data.can_trade(sid):
context.order_target_percent(sid, 0)
cash = context.portfolio.cash
# 买入
for stock in candidate_list:
sid = context.symbol(stock)
if data.can_trade(sid):
price = data.current(sid, 'price')
context.order(sid, int(cash / price / 100 / len(candidate_list)) * 100)
# 交易日+1
context.trading_day_count = context.trading_day_count + 1
m=M.trade.v2(
instruments=instruments,
start_date=start_date,
end_date=end_date,
initialize=initialize,
handle_data=handle_data,
order_price_field_buy='open', # 以开盘价买入
order_price_field_sell='open', # 以开盘价卖出
capital_base=100000, # 本金
m_deps=np.random.randn()
)
\ No newline at end of file
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
start_date = '20190103'
end_date = '20210122'
import json
import talib
import numpy as np
def initialize(context):
# MACD 金叉MA 多头 指标设置DIF 短线=12, DIF 长线=26, DEA=9
context.short_period = 12
context.long_period = 26
context.dea = 9
context.trading_day_count = 0
# MA 多头 MA 短线=5,MA 长线=20
context.ma_short = 5
context.ma_long = 20
# 资金
context.cash = 10000
# 交易费用
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0003, min_cost=5))
def is_all_nan(data):
for datum in data:
if str(datum) != 'nan':
return False
return True
def min_cap(context, data):
market_cap_data = D.history_data(instruments, data.current_dt, data.current_dt,
fields=['market_cap', 'amount', 'suspended'])
# 根据是否停牌的字段确定每日选出来的股票
daily_buy_stock = market_cap_data.groupby('date').apply(lambda df: df[(df['amount'] > 0) # 需要有成交量
& (df['suspended'] == False) # 是否停牌
].sort_values('market_cap')[:10]) #
# context.logger.info(daily_buy_stock['instrument'])
return set(daily_buy_stock['instrument'])
# 计算MACD
def macd(context, data):
stock_set = set()
d = data.history(data.keys(), 'price', bar_count=34, frequency='1d')
for key in data.keys():
s = np.asarray(d[key])
if not is_all_nan(s):
macd, macdsignal, macdhist = talib.MACD(s, context.short_period, context.long_period, context.dea)
if macdhist[-1] > 0:
stock_set.add(key.symbol)
return stock_set
# 计算MA
def ma(context, data):
stock_set = set()
d_5 = data.history(data.keys(), 'price', bar_count=5, frequency='1d')
d_20 = data.history(data.keys(), 'price', bar_count=20, frequency='1d')
for key in data.keys():
s_5 = np.asarray(d_5[key])
s_20 = np.asarray(d_20[key])
if not is_all_nan(s_5) and not is_all_nan(s_20):
ma5 = talib.MA(s_5, timeperiod=5, matype=0)
ma20 = talib.MA(s_20, timeperiod=20, matype=0)
if ma5[-1] > ma20[-1]:
stock_set.add(key.symbol)
return stock_set
def rebalance(context, data):
set_cap = min_cap(context, data)
# context.logger.info(set_cap)
set_macd = macd(context, data)
set_ma = ma(context, data)
candidate_list = list(set_cap & set_macd & set_ma)
max_stock_count = 10
if len(candidate_list) > max_stock_count:
candidate_list = candidate_list[0:10]
if len(candidate_list) > 0:
# 当前持有的股票
stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
# 无需卖出
stock_not_to_sell = [i for i in stock_hold_now if i in candidate_list]
# 需要卖出的股票
stock_to_sell = [i for i in stock_hold_now if i not in stock_not_to_sell]
# 卖出
for stock in stock_to_sell:
if data.can_trade(context.symbol(stock)):
context.order_target_percent(context.symbol(stock), 0)
# 等权重买入
weight = 1 / len(candidate_list)
# 买入
for stock in candidate_list:
if data.can_trade(context.symbol(stock)):
context.order_target_percent(context.symbol(stock), weight)
# 交易日+1
context.trading_day_count = context.trading_day_count + 1
def handle_data(context, data):
# 每10日交易一次
if context.trading_day_count % 20 == 0:
rebalance(context, data)
m=M.trade.v2(
instruments=instruments,
start_date=start_date,
end_date=end_date,
initialize=initialize,
handle_data=handle_data,
order_price_field_buy='open', # 以开盘价买入
order_price_field_sell='open', # 以开盘价卖出
capital_base=100000, # 本金
m_deps=np.random.randn()
)
\ No newline at end of file
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
instruments =['000021.SZA','000034.SZA','000066.SZA','000158.SZA','000555.SZA','000606.SZA','000662.SZA','000938.SZA','000948.SZA','000606.SZA','300157.SZA','300164.SZA','300191.SZA','600121.SHA','600123.SHA','600157.SHA','600188.SHA','600193.SHA','600295.SHA','600339.SHA','300610.SZA','300637.SZA','300641.SZA','300655.SZA','300665.SZA','300690.SZA','300699.SZA','300716.SZA','300717.SZA','300721.SZA','000060.SZA','000426.SZA','000511.SZA','000603.SZA','000612.SZA','000630.SZA','000633.SZA','000657.SZA','000688.SZA','000693.SZA','300592.SZA','300621.SZA','300635.SZA','300649.SZA','300668.SZA','600039.SHA','600068.SHA','600133.SHA','600170.SHA','600209.SHA','603218.SHA','603320.SHA','603333.SHA','603396.SHA','603416.SHA','603488.SHA','603507.SHA','603577.SHA','603606.SHA','603488.SHA','300403.SZA','300475.SZA','600060.SHA','600336.SHA','600619.SHA','600690.SHA','600839.SHA','600854.SHA','600870.SHA','600983.SHA','600867.SHA','600896.SHA','600976.SHA','600993.SHA','600998.SHA','601607.SHA','603079.SHA','603108.SHA','603127.SHA','603139.SHA','002351.SZA','002369.SZA','002371.SZA','002388.SZA','002384.SZA','002402.SZA','002414.SZA','002463.SZA','002475.SZA','002484.SZA','002711.SZA','002769.SZA','002800.SZA','002889.SZA','300013.SZA','300240.SZA','300350.SZA','600004.SHA','600009.SHA','600026.SHA','601128.SHA','601166.SHA','601169.SHA','601229.SHA','601288.SHA','601398.SHA','601328.SHA','601818.SHA','601939.SHA','601988.SHA','600804.SHA','603042.SHA','603083.SHA','603118.SHA','603322.SHA','603421.SHA','603559.SHA','603602.SHA','603703.SHA','603803.SHA']
start_date = '20190103'
end_date = '20210122'
import json
import talib
import numpy as np
import cvxopt as opt
from cvxopt import blas, solvers
solvers.options['show_progress'] = False
def initialize(context):
context.set_commission(PerOrder(buy_cost=0.003, sell_cost=0.003, min_cost=5))
def optimal_portfolio(returns):
returns = np.asmatrix(returns)
n = len(returns)
# 转化为cvxopt matrices
# Σ: 这是收益的协方差矩阵,代表着股票之间的关系
S = opt.matrix(np.cov(returns))
# μ = (μ1, ..., μn):这是通过历史数据计算出来的每只股票的期望收益。
pbar = opt.matrix(np.mean(returns, axis=1))
# 约束条件
G = -opt.matrix(np.eye(n))
h = opt.matrix(0.0, (n, 1))
A = opt.matrix(1.0, (1, n))
b = opt.matrix(1.0)
# 使用凸优化计算有效前沿
# 计算最优组合
wt = solvers.qp(opt.matrix(0.1 * S), -pbar, G, h, A, b)['x']
return np.asarray(wt)
def handle_data(context, data):
if context.trading_day_index % 20 == 0:
prices = data.history(data.keys(), fields='price', bar_count=6, frequency='1d').dropna(
axis=1).pct_change().dropna(axis=0)
if not prices.empty:
weights = optimal_portfolio(prices.T)
for stock, weight in zip(prices.columns, weights):
if data.can_trade(stock):
context.order_target_percent(stock, weight[0])
m=M.trade.v2(
instruments=instruments,
start_date=start_date,
end_date=end_date,
initialize=initialize,
handle_data=handle_data,
order_price_field_buy='open', # 以开盘价买入
order_price_field_sell='open', # 以开盘价卖出
capital_base=100000, # 本金
m_deps=np.random.randn()
)
\ No newline at end of file
start_date = '20190103'
end_date = '20210122'
import pandas as pd
import json
import talib
import numpy as np
import cvxopt as opt
from cvxopt import blas, solvers
solvers.options['show_progress'] = False
# 股票
df = pd.read_csv('stock_list.csv',header=None)
instruments = df[0].to_list()
# 每个行业下股票数量
industries = df[1].to_list()
industries_cnt = [industries.count(i) for i in np.unique(industries)]
def initialize(context):
# 设置手续费
context.set_commission(PerOrder(buy_cost=0.003, sell_cost=0.003, min_cost=5))
context.rebalance_period = 20
context.observation = 5
context.max_weight_per_stock = 0.1
context.max_weight_per_industry = 0.3
def optimal_portfolio(context, returns):
returns = np.asmatrix(returns)
n = len(returns)
# 转化为cvxopt matrices
S = opt.matrix(np.cov(returns))
pbar = opt.matrix(np.mean(returns, axis=1))
# 初始约束条件
G1 = -opt.matrix(np.eye(n))
h1 = opt.matrix(0.0, (n, 1))
# 每只股票权重限制
G2 = opt.matrix(np.eye(n))
h2 = opt.matrix(context.max_weight_per_stock, (n, 1))
# 行业限制
G3 = np.zeros((len(industries_cnt), n))
start = 0
end = 0
for i in range(len(industries_cnt)):
end += industries_cnt[i]
G3[i, start:end] = 1
start = end
G3 = opt.matrix(G3)
h3 = opt.matrix(context.max_weight_per_industry, (len(industries_cnt), 1))
G = opt.matrix(np.concatenate([G1, G2, G3]))
h = opt.matrix(np.concatenate([h1, h2, h3]))
A = opt.matrix(1.0, (1, n))
b = opt.matrix(1.0)
# 使用凸优化计算有效前沿
# 计算最优组合
wt = solvers.qp(opt.matrix(0.1 * S), -pbar, G, h, A, b)['x']
return np.asarray(wt)
def handle_data(context, data):
if context.trading_day_index % 20 == 0:
prices = data.history(data.keys(), fields='price', bar_count=6, frequency='1d').dropna(
axis=1).pct_change().dropna(axis=0)
if not prices.empty:
weights = optimal_portfolio(context, prices.T)
for stock, weight in zip(prices.columns, weights):
if data.can_trade(stock):
context.order_target_percent(stock, weight[0])
m=M.trade.v2(
instruments=instruments,
start_date=start_date,
end_date=end_date,
initialize=initialize,
handle_data=handle_data,
order_price_field_buy='open', # 以开盘价买入
order_price_field_sell='open', # 以开盘价卖出
capital_base=100000, # 本金
m_deps=np.random.randn()
)
\ No newline at end of file
start_date = '20190103'
end_date = '20210122'
import pandas as pd
import json
import talib
import numpy as np
import cvxopt as opt
from cvxopt import blas, solvers
solvers.options['show_progress'] = False
# 股票
df = pd.read_csv('stock_list.csv',header=None)
instruments = df[0].to_list()
# 每个行业下股票数量
industries = df[1].to_list()
industries_cnt = [industries.count(i) for i in np.unique(industries)]
def initialize(context):
# 设置手续费
context.set_commission(PerOrder(buy_cost=0.003, sell_cost=0.003, min_cost=5))
context.rebalance_period = 20
context.observation = 5
context.max_weight_per_stock = 0.1
context.max_weight_per_industry = 0.3
def optimal_portfolio(context, returns):
returns = np.asmatrix(returns)
n = len(returns)
# 转化为cvxopt matrices
S = opt.matrix(np.cov(returns))
pbar = opt.matrix(np.mean(returns, axis=1))
# 初始约束条件
G1 = -opt.matrix(np.eye(n)) # opt默认是求最大值,因此要求最小化问题,还得乘以一个负号
h1 = opt.matrix(0.0, (n, 1))
# 每只股票权重限制
G2 = opt.matrix(np.eye(n))
h2 = opt.matrix(context.max_weight_per_stock, (n, 1))
# 行业限制
G3 = np.zeros((len(industries_cnt), n))
start = 0
end = 0
for i in range(len(industries_cnt)):
end += industries_cnt[i]
G3[i, start:end] = 1
start = end
G3 = opt.matrix(G3)
h3 = opt.matrix(context.max_weight_per_industry, (len(industries_cnt), 1))
G = opt.matrix(np.concatenate([G1, G2, G3]))
h = opt.matrix(np.concatenate([h1, h2, h3]))
A = opt.matrix(1.0, (1, n))
b = opt.matrix(1.0)
# 使用凸优化计算有效前沿
# 计算最优组合
wt = solvers.qp(opt.matrix(0.1 * S), -pbar, G, h, A, b)['x']
return np.asarray(wt)
def is_all_nan(data):
for datum in data:
if str(datum) != 'nan':
return False
return True
def min_cap(context, data):
market_cap_data = D.history_data(instruments, data.current_dt, data.current_dt,
fields=['market_cap', 'amount', 'suspended'])
# 根据是否停牌的字段确定每日选出来的股票
daily_buy_stock = market_cap_data.groupby('date').apply(lambda df: df[(df['amount'] > 0) # 需要有成交量
& (df['suspended'] == False) # 是否停牌
].sort_values('market_cap')[:30]) #
# context.logger.info(daily_buy_stock['instrument'])
return set(daily_buy_stock['instrument'])
# 计算MA
def ma(context, data):
stock_set = set()
d_5 = data.history(data.keys(), 'price', bar_count=5, frequency='1d')
d_20 = data.history(data.keys(), 'price', bar_count=20, frequency='1d')
for key in data.keys():
s_5 = np.asarray(d_5[key])
s_20 = np.asarray(d_20[key])
if not is_all_nan(s_5) and not is_all_nan(s_20):
ma5 = talib.MA(s_5, timeperiod=5, matype=0)
ma20 = talib.MA(s_20, timeperiod=20, matype=0)
if ma5[-1] > ma20[-1]:
stock_set.add(key.symbol)
return stock_set
def handle_data(context, data):
if context.trading_day_index % 20 == 0:
set_cap = min_cap(context, data)
set_ma = ma(context, data)
candidate_list = list(set_cap & set_ma)
candidate = []
for stock in candidate_list:
candidate.append(context.symbol(stock))
if len(candidate) > 1:
prices = data.history(candidate, fields='price', bar_count=6, frequency='1d').dropna(
axis=1).pct_change().dropna(axis=0)
if not prices.empty:
weights = optimal_portfolio(context, prices.T)
for stock, weight in zip(prices.columns, weights):
if data.can_trade(stock):
context.order_target_percent(stock, weight[0])
m=M.trade.v2(
instruments=instruments,
start_date=start_date,
end_date=end_date,
initialize=initialize,
handle_data=handle_data,
order_price_field_buy='open', # 以开盘价买入
order_price_field_sell='open', # 以开盘价卖出
capital_base=100000, # 本金
m_deps=np.random.randn()
)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment