8.第一个金融策略

#策略:当沪深300中的股票如果开盘价低于10块则买入,在适当的条件下进行止盈止损

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
#set_option('use_real_price', True)

### 股票相关设定 ###
#佣金是给券商的,不管买入还是卖出都需要付手续费
#映花税:给国家交的税,只有买股票的时候需要缴纳该税
#type=stock表示类型为股票
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

#g.xxx 表示的是一个全局变量。该变量在当前文件中任何位置都可以被使用。
#get_index_stocks函数是获取该沪深300所有的股票,返回的是一个列表
g.security = get_index_stocks('000300.XSHG')
print(g.security)
#根据回测频率进行自动调用。回测频率为每天或者每分钟。
def handle_data(context, data):
#卖出股票的逻辑
for stock in g.security:
#获取stock该股票的开盘价
p = get_current_data()[stock].day_open
#context是上下文对象
#portfolio为账户信息对象
#positions:当前账户中持仓的所有股票。返回的是一个Position对象
#Position对象:某只股票的信息。
#total_amount持股数量
amount = context.portfolio.positions[stock].total_amount
#avg_cost:开仓均价,就是该只股票的平均价格(3天连续买入,每天价格不一样,就算求出均价)
cost = context.portfolio.positions[stock].avg_cost
#如果持有该股票且开盘价大于均价则买出
if amount > 0 and p >= cost * 1.25:
#order_target是下单函数中的一种,下单函数一共有四种
#将参数1表示的股票买卖到参数2的股数
order_target(stock,0) #止盈,买到0,就是全部卖出
elif amount > 0 and p <= cost * 0.9:
order_target(stock,0) #止损,买到0,就是全部卖出
#买入股票的逻辑:一般逻辑都是先卖后买,这样可以有更多的钱
stock_list = []
for stock in g.security:
#获取stock该股票的开盘价
p = get_current_data()[stock].day_open
amount = context.portfolio.positions[stock].total_amount
if p < 10 and amount == 0: #如果开盘价低于10块钱,并且没有持有该股票
#将股票加入到列表中,该列表里存储的是要买入的股票是哪些股
stock_list.append(stock)
#将可用资金分配来买列表中存储的股票
#获取现在账户的可用资金
cash = context.portfolio.available_cash

#使用可用资金平均购买列表中的每只股票
if len(stock_list) > 0:
for stock in stock_list:
order_value(stock,cash/len(stock_list))












posted @ 2019-01-23 13:23  波晓张  阅读(1128)  评论(1编辑  收藏  举报