# 導入函數庫
from jqdata import *
# 初始化函數,設定基準等等
def initialize(context):
# 設定滬深300作爲基準
set_benchmark('000002.XSHG')
# 開啓動態復權模式(真實價格)
set_option('use_real_price', True)
### 股票相關設定 ###
# 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5),
type='stock')
g.security = get_index_stocks('000002.XSHG')
g.q = query(valuation, indicator).filter(valuation.code.in_(g.security))
g.N = 20
g.day = -1
def handle_data(context, data):
g.day += 1
if g.day % 30 == 0:
df = get_fundamentals(g.q)[['code', 'market_cap', 'roe']]
df['market_cap'] = (df['market_cap'] - df['market_cap'].min()) / (
df['market_cap'].max() - df['market_cap'].min())
df['roe'] = (df['roe'] - df['roe'].min()) / (df['roe'].max() - df['roe'].min())
df['score'] = df['roe'] - df['market_cap']
df = df.sort_values('score').iloc[-g.N:, :]
to_hold = df['code'].values
# 現在持有的不在to_hold中的我們就清倉
for stock in context.portfolio.positions:
if stock not in to_hold:
order_target(stock, 0)
to_buy = []
for stock in to_hold:
if stock not in context.portfolio.positions:
to_buy.append(stock)
print(to_buy)
if len(to_buy) > 0:
cash_per_stock = context.portfolio.available_cash / len(to_buy)
for stock in to_buy:
order_value(stock, cash_per_stock)