量化交易入門筆記-小市值股票策略
阿新 • • 發佈:2018-12-16
'''
篩選出市值介於20億~30億的股票
選取其中市值最小的三隻股票
然後每天開盤買入,持有5個交易日,然後調倉
'''
import jqdata
def initialize(context):
"""初始化函式"""
# 設定參考基準
set_benchmark('000300.XSHG')
# 使用真實價格
set_option('use_real_price', True)
# 設定成效比例
set_option('order_volume_ratio', 1)
# 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 持倉數量
g.stocknum = 3
# 交易計時器
g.days = 0
# 調倉頻率
g.refresh_rate = 5
# 執行函式
run_daily(trade, 'every_bar')
def check_stocks(context):
"""股票篩選"""
# 設定條件
q = query(
valuation.code,
valuation.market_cap
).filter(
valuation.market_cap.between(20, 30)
).order_by(
valuation.market_cap.asc()
)
# 選出低市值的股票,構成buy_list
df = get_fundamentals(q)
buy_list = list(df['code'])
# 過濾掉停牌
buy_list = filter_paused_stock(buy_list)
return buy_list[:g.stocknum]
def filter_paused_stock(stock_list):
"""過濾掉停牌"""
current_data = get_current_data()
return [stock for stock in stock_list if not current_data[stock].paused]
def trade(context):
"""交易函式"""
if g.days % g.refresh_rate == 0:
# 獲取持倉列表
sell_list = list(context.portfolio.positions.keys())
# 如果有持倉,則賣出
if len(sell_list) > 0:
for stock in sell_list:
order_target(stock, 0)
# 分配資金
if len(context.portfolio.positions) < g.stocknum:
Num = g.stocknum - len(context.portfolio.positions)
Cash = context.portfolio.cash/Num
else:
Cash = 0
# 選股
stock_list = check_stocks(context)
# 買入股票
for stock in stock_list:
if len(context.portfolio.positions.keys()) < g.stocknum:
order_value(stock, Cash)
# 天計數加1
g.days = 1
else:
g.days += 1
回測結果:
注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!