掘金量化—Python SDK文档—5.API 介绍(1)

Python SDK文档

5.API 介绍

5.1基本函数

init - 初始化策略

初始化策略, 策略启动时自动执行。可以在这里初始化策略配置参数。

函数原型:

init(context)

参数:

参数名 类型 说明
context context 上下文,全局变量可存储在这里

示例:

def init(context):
    # 订阅bar
    subscribe(symbols='SHSE.600000,SHSE.600004', frequency='30s', count=5)
	# 增加对象属性,如:设置一个股票资金占用百分比
	context.percentage_stock = 0.8

注意: 回测模式下init函数里不支持交易操作,仿真模式和实盘模式支持

schedule - 定时任务配置

在指定时间自动执行策略算法, 通常用于选股类型策略

函数原型:

schedule(schedule_func, date_rule, time_rule)

参数:

参数名 类型 说明
schedule_func function 策略定时执行算法
date_rule str n + 时间单位, 可选'd/w/m' 表示 n 天/n 周/n 月
time_rule str 执行算法的具体时间 (%H:%M:%S 格式)

返回值:

None

示例:

def init(context):
    #每天的19:06:20执行策略algo_1
    schedule(schedule_func=algo_1, date_rule='1d', time_rule='19:06:20')
	#每月的第一个交易日的09:40:00执行策略algo_2
	schedule(schedule_func=algo_2, date_rule='1m', time_rule='9:40:00')

def algo_1(context):
    print(context.symbols)

def algo_2(context):
    order_volume(symbol='SHSE.600000', volume=200, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open)




注意:

1.time_rule 的时,分,秒均不可以只输入个位数,例:'9:40:0''14:5:0'

2.目前暂时支持1d1w1m,其中1w1m仅用于回测

run - 运行策略

函数原型:

run(strategy_id='', filename='', mode=MODE_UNKNOWN, token='', backtest_start_time='',
    backtest_end_time='', backtest_initial_cash=1000000,
    backtest_transaction_ratio=1, backtest_commission_ratio=0,
    backtest_slippage_ratio=0, backtest_adjust=ADJUST_NONE, backtest_check_cache=1,
    serv_addr='', backtest_match_mode=0)

参数:

参数名 类型 说明
strategy_id str 策略 id
filename str 策略文件名称
mode int 策略模式 MODE_LIVE(实时)=1 MODE_BACKTEST(回测) =2
token str 用户标识
backtest_start_time str 回测开始时间 (%Y-%m-%d %H:%M:%S 格式)
backtest_end_time str 回测结束时间 (%Y-%m-%d %H:%M:%S 格式)
backtest_initial_cash double 回测初始资金, 默认 1000000
backtest_transaction_ratio double 回测成交比例, 默认 1.0, 即下单 100%成交
backtest_commission_ratio double 回测佣金比例, 默认 0
backtest_slippage_ratio double 回测滑点比例, 默认 0
backtest_adjust int 回测复权方式(默认不复权) ADJUST_NONE(不复权)=0 ADJUST_PREV(前复权)=1 ADJUST_POST(后复权)=2
backtest_check_cache int 回测是否使用缓存:1 - 使用, 0 - 不使用;默认使用
serv_addr str 终端服务地址, 默认本地地址, 可不填,若需指定应输入 ip+端口号,如"127.0.0.1:7001"
backtest_match_mode int 回测市价撮合模式: 1-实时撮合:在当前 bar 的收盘价/当前 tick 的 price 撮合,0-延时撮合:在下个 bar 的开盘价/下个 tick 的 price 撮合,默认是模式 0

返回值:

None

示例:

run(strategy_id='strategy_1', filename='main.py', mode=MODE_BACKTEST, token='token_id',
    backtest_start_time='2016-06-17 13:00:00', backtest_end_time='2017-08-21 15:00:00')

注意: 

1. run 函数中,mode=1也可改为mode=MODE_LIVE,两者等价,backtest_adjust同理

2. backtest_start_time 和 backtest_end_time 中月,日,时,分,秒均可以只输入个位数,例:'2016-6-7 9:55:0''2017-8-1 14:6:0',但若对应位置为零,则 0 不可被省略,比如不能输入"2017-8-1 14:6: "

3. filename 指运行的 py 文件名字,如该策略文件名为 Strategy.py,则此处应填"Strategy.py"

stop - 停止策略

停止策略,退出策略进程

函数原型:

stop()

返回值:

None

示例:

#若订阅过的代码集合为空,停止策略
if not context.symbols:
   stop()

timer - 设置定时器

设定定时器的间隔秒数,每过设定好的秒数调用一次计时器 timer_func(),直到 timer_stop()结束定时器为止。 (仿真、实盘场景适用,回测模式下不生效)

函数原型:

timer(timer_func, period, start_delay)

参数:

参数名 类型 说明
timer_func function 在 timer 设置的时间到达时触发的事件函数
period int 定时事件间隔毫秒数,设定每隔多少毫秒触发一次定时器,范围在 [1,43200000]
start_delay int 等待秒数(毫秒),设定多少毫秒后启动定时器,范围在[0,43200000]

返回值: dict

字段 类型 说明
timer_status int 定时器设置是否成功,成功=0,失败=非 0 错误码(timer_id 无效)。
timer_id int 设定好的定时器 id

#timer_stop - 停止定时器

停止已设置的定时器

函数原型:

timer_stop(timer_id)

复制成功

参数:

字段 类型 说明
timer_id int 要停止的定时器 id

返回值:

字段 类型 说明
is_stop bool 是否成功停止,True or False

示例:

def init(context):
    # 每隔1分钟执行ontime_1, 即时启动
    context.timerid_1 = timer(timer_func=ontimer_1, period=60000, start_delay=0)
    context.counter_1 = 0

    # 每隔半小时执行ontime_2, 5分钟之后启动
    context.timerid_2 = timer(timer_func=ontimer_2, period=300000, start_delay=0)
    print('启动定时器2:', context.now)
    context.counter_2 = 0


def ontimer_1(context):
    # 定时器执行次数计数
    context.counter_1 += 1
    # 定时器执行逻辑
    print('定时器1:', context.now)


def ontimer_2(context):
    # 定时器执行次数计数
    context.counter_2 += 1
    # 定时器执行逻辑(如查询账户资金)
    cash = context.account().cash

    print('定时器2:', context.now)

    # 按执行次数条件停止定时器
    if context.counter_1 >= 5:
        ret1 = timer_stop(context.timerid_1['timer_id'])
        if ret1:
            print("结束1分钟定时器")

    if context.counter_2 >= 10:
        ret2 = timer_stop(context.timerid_2['timer_id'])

注意:

  1. 仿真、实盘场景适用,回测模式下不生效
  2. period 从前一次事件函数开始执行时点起算,若下一次事件函数需要执行时,前一次事件函数没运行完毕,等待上一个事件执行完毕再执行下一个事件。

5.2数据订阅

subscribe - 行情订阅

订阅行情, 可以指定 symbol, 数据滑窗大小, 以及是否需要等待全部代码的数据到齐再触发事件。

函数原型:

subscribe(symbols, frequency='1d', count=1, unsubscribe_previous=False)

参数:

参数名 类型 说明
symbols str or list 订阅标的代码, 注意大小写,支持字串格式,如有多个代码, 中间用 , (英文逗号) 隔开, 也支持 ['symbol1', 'symbol2'] 这种列表格式
frequency str 频率, 支持 'tick', '60s', '300s', '900s' 等, 默认'1d', 详情见股票行情数据期货行情数据
### 使用Python进行量化投资和股票选择 #### 一、基础知识与准备 在现代金融市场中,投资已成为个人和机构追求财富增长的重要手段。为了更好地理解市场并做出明智的投资决策,掌握基本的金融理论和技术至关重要[^2]。 对于希望利用编程技能来辅助投资的人来说,Python 是一种非常受欢迎的语言,因为它拥有强大的数据分析能力和丰富的第三方库支持。通过学习 Python 的基础语法以及如何处理财务数据,可以为后续更复杂的模型构建打下坚实的基础[^3]。 #### 二、获取并预处理股票数据 要开始任何类型的量化分析工作之前,首先需要获得高质量的历史股价记录和其他相关信息。这通常涉及到从互联网上下载CSV文件或将API接口集成到项目里以实时抓取最新行情。常用的数据源包括 Yahoo Finance 和 Tushare 等平台。 ```python import tushare as ts pro = ts.pro_api('your_token_here') df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231') print(df.head()) ``` 这段代码展示了怎样借助Tushare API 获取特定时间段内的某只个股的日K线图数据[^4]。 #### 三、编写简单的回测框架 当拥有了足够的历史资料之后,则可以根据自己的想法设计相应的买卖逻辑,并将其转化为计算机程序的形式来进行模拟测试——即所谓的“回溯检验”。下面给出了一种基于双均线交叉法则选股策略的例子: ```python def backtest_stock_strategy(stock_code, short_window=5, long_window=60, initial_capital=1e5): df = get_stock_data(stock_code) # 计算两条不同长度周期下的简单移动平均数序列 df['short_ma'] = df.close.rolling(window=short_window).mean() df['long_ma'] = df.close.rolling(window=long_window).mean() positions = [] cash_balance = initial_capital for i in range(len(df)): current_price = df.loc[i,'close'] if not positions and df.loc[i,'short_ma']>df.loc[i,'long_ma']: shares_to_buy = int(cash_balance / current_price) cost_basis = shares_to_buy * current_price positions.append((i,current_price)) remaining_cash = cash_balance - cost_basis elif positions and df.loc[i,'short_ma']<df.loc[i,'long_ma']: purchase_index,purchase_price = positions.pop(-1) proceeds_from_sale = sum([shares*(current_price-purchase_price)for _,purchase_price in positions]) total_profit += proceeds_from_sale cash_balance+=total_profit+remaining_cash final_value = (cash_balance + len(positions)*current_price)/initial_capital*100-100 return f'最终收益率:{final_value:.2f}%' ``` 此函数实现了买入信号发生在短期均线上穿长期均线之时;反之则卖出所持有的全部仓位。它还计算了整个过程中账户价值的变化情况作为评估指标之一。 #### 四、深入研究与实践探索 随着经验积累和个人兴趣的发展,还可以尝试更多高级主题比如机器学习算法的应用或是高频交易系统的搭建等。同时也要关注行业动态及时调整优化现有方案,在不断试错的过程中找到最适合自己的方法论体系[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值