量化择时——动量策略

本文介绍了一个基于Python的股票交易策略,使用了Iwencai库进行选股,设置了止损止盈机制,并且每天根据每日收盘价动态调整持仓。策略每月初执行选股,并在满足特定条件时买入和卖出股票。
摘要由CSDN通过智能技术生成

#==================================================================================================
#导包操作
from datetime import timedelta, date
import pandas as pd
#==================================================================================================
#==================================================================================================
#初始化函数,设置初始条件
def init(context):
    context.n = 50
    #设置最大持股
    run_monthly(trade,date_rule=2)
    #设置trade函数能每个月月初第二个交易日运行
    get_iwencai('未停牌,上市时间超过2年')
    #使用问财进行选股,每日执行一次,储存在context.iwencai_securities对象中
#==================================================================================================
#==================================================================================================
#设置止损止盈,handle_bar是每日(分钟/tick)运行
def handle_bar(context,bar_dict):
    #获取账户持仓信息
    holdstock = list(context.portfolio.stock_account.positions.keys()) 
    if len(holdstock) > 0:
        num = -0.1
        for stock in holdstock:
            close = history(stock,['close'],1,'1d').values
            if close/context.portfolio.positions[stock].last_price -1 <= num:
                order_target(stock,0)
                log.info('股票{}已止损'.format(stock))
#==================================================================================================
#==================================================================================================
#选股函数,这里用字典选股
def stocks_zf(context,bar_dict):
    df = {'security': [], '30zf': []}
    #创建字典,格式如上。'security'是键,[]是值。
    stocks=context.iwencai_securities
    #将问财选股结果导到stocks
    for symbol in stocks:
        df['security'].append(symbol)
        #将依次选出的个股添加到字典的键'security'的值中,这里append是添加操作。
    for i in range(len(df['security'])):
        quote = history(df['security'][i], ['quote_rate'], 30, '1d', True, fq='pre')
        #获取过去30日涨跌幅数据
        AMP30 = quote.values[:].sum()
        #将这些数据求和,直接是.sum()
        df['30zf'].append(AMP30)
        #将计算出的值添加到键中
    df = pd.DataFrame(df).sort_values(by ='30zf', ascending=False)
    #pd.bar_dictFrame(df)将字典转化成bar_dictFrame格式,.sort_values是排序,by是以XX为标准排序,ascending=False
    #是从大到小排序。
    context.sample = df['security'][:50]
    #截取排序后的DF格式的前50个股票,并输出
    return context.sample
#==================================================================================================
#==================================================================================================
def trade(context, bar_dict):
    zf_list = stocks_zf(context,bar_dict)
    #将选股函数的结果导到zf_list中,用于交易函数运行。
    stock_list = list(set(zf_list))
    if len(list(context.portfolio.stock_account.positions.keys())) > 0:
        for stock in list(list(context.portfolio.stock_account.positions.keys())):
            if stock not in stock_list:
                order_target(stock, 0)
    if len(stock_list) > 0:
        for stock in stock_list:
            if stock not in list(list(context.portfolio.stock_account.positions.keys())):
                if len(list(context.portfolio.stock_account.positions.keys())) < context.n :
                    number = context.n  - len(list(context.portfolio.stock_account.positions.keys()))
                    order_value(stock,context.portfolio.stock_account.available_cash/number)
                else: 
                    order_value(stock,context.portfolio.stock_account.available_cash)

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值