最近在學量化,剛學了一點點基礎,這篇博客只作爲一篇學習筆記,我想通過這種方式應該可以更好的激勵自己去學習。
需求:
選股:獲得市盈率大於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.
第一次做,還沒用到因子分析和機器學習算法等,還存在許多缺陷。