聚寬平臺——雙因子策略實現

# 導入函數庫
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)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章