[B5]我的第一個量化策略

最近在學量化,剛學了一點點基礎,這篇博客只作爲一篇學習筆記,我想通過這種方式應該可以更好的激勵自己去學習。

需求:
選股:獲得市盈率大於50且小於65,營業總收入前10的股票
調倉:每日調倉,將所有資金平攤到10個股票的購買策略,賣出一次性賣出所有不符合條件的股票。

第1步:選股
不在init()處調用

def init(context):
    # 在context中保存全局變量
    #context.s1 = "000001.XSHE"
    # 實時打印日誌
    #logger.info("RunInfo: {}".format(context.run_info))
    #定義一個選股的範圍
    pass

在before_trading()處選股

#每日選股:獲得市盈率大於50且小於65,營業收入前10的股票
# before_trading此函數會在每天策略交易開始前被調用,當天只會被調用一次
def before_trading(context):


    #選股
    q = query(
        fundamentals.eod_derivative_indicator.pe_ratio,
        fundamentals.income_statement.revenue
        ).filter(
            fundamentals.eod_derivative_indicator.pe_ratio >50,
            ).filter(
                fundamentals.eod_derivative_indicator.pe_ratio <65
                ).order_by(
                    fundamentals.income_statement.revenue.desc()
                    ).limit(10)

 

    fund = get_fundamentals(q)

    #print(fund.T)
    context.stock_list = fund.T.index

第2步:交易

#買賣:買入每天選出來的10只,賣出

# 你選擇的證券的數據更新將會觸發此段邏輯,例如日或分鐘歷史數據切片或者是實時數據切片更新
def handle_bar(context, bar_dict):
    # 開始編寫你的主要的算法邏輯

    # bar_dict[order_book_id] 可以拿到某個證券的bar信息
    # context.portfolio 可以拿到現在的投資組合信息

    # 使用order_shares(id_or_ins, amount)方法進行落單

    # TODO: 開始編寫你的算法吧!
    #order_shares(context.s1, 1000)
    


    #在此交易
    #先判斷倉位是否有股票,如果有,賣出(判斷不在新的股票池中)
    if len(context.portfolio.positions.keys()) != 0:

        for stock in context.portfolio.positions.keys():

            #如果舊的股票不在新的股票池當中,賣出
            if stock not in context.stock_list:

                order_target_percent(stock, 0)


    #買入最新的每日更新的股票
    #等比例資金買入,投資組合總價值的百分比平分
    weight = 1.0 / len(context.stock_list)

    for stock in context.stock_list:

        order_target_percent(stock, weight)
 
    pass

第3步:結束

# after_trading函數會在每天交易結束後被調用,當天只會被調用一次
def after_trading(context):
    pass

第4步:回測策略

在這裏插入圖片描述可以看出,這個策略還是不錯的,回測年化收益率47.34%,最大回測8.46%,夏普比率1.58.
第一次做,還沒用到因子分析和機器學習算法等,還存在許多缺陷。

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