簡(jiǎn)述
首先,大體模板,是根據(jù)網(wǎng)上的一堆教程學(xué)來(lái)的。
然后很多函數(shù)不懂,都通過(guò)API來(lái)搞定了,之后,再自己寫的,用了自己的版本。
- 這是一個(gè)alpha策略,然后用的是,一個(gè)大佬給的一個(gè)公式寫的因子。
- 然后對(duì)沖beta的時(shí)候,選擇是操作一個(gè)比例。這個(gè)比例會(huì)影響到操作期貨的方式。以及投入的錢數(shù)目。加上期貨的保證金比例數(shù)目(看打算用幾倍的杠桿)
- 然后,我感覺(jué)這個(gè)對(duì)沖beta也很一般。看看自己之后能不能搞出個(gè)稍微好點(diǎn)的對(duì)沖beta的方式吧
不過(guò)通過(guò)對(duì)沖beta確實(shí)達(dá)到了降低風(fēng)險(xiǎn)的效果。(總虧損還是被降低了很多)
可能是因?yàn)槲疫€是用了單因子。而且效果也不是很好。希望之后努力
import statsmodels.api
as sm
from statsmodels
import regression
import numpy
as np
import pandas
as pd
import time
from datetime
import date
from jqdata
import *
from jqlib.alpha191
import *
def initialize(context):g.tc =
2 g.N =
50 g.t =
0 g.weight_list = [
1] log.set_level(
'order',
'error')set_option(
'use_real_price',
True) set_slippage(FixedSlippage(
0)) set_commission(PerTrade(buy_cost=
0.0000, sell_cost=
0.000, min_cost=
0)) set_benchmark(
'000300.XSHG') g.stockrange = get_index_stocks(
'000300.XSHG')init_cash = context.portfolio.starting_cash/
2set_subportfolios([SubPortfolioConfig(cash=init_cash, type=
'stock'),SubPortfolioConfig(cash=init_cash, type=
'futures')])g.rate =
0.5g.returnsRate =
0g.changeLimiteRate =
0.2g.changeRate =
0g.betaName =
'IF9999.CCFX'
def handle_data(context, data):if g.t ==
0:g.all_stocks = pickStock(context, g.stockrange)previousStr = str(context.previous_date)adjustedBeta(context)stock_sort = get_all_cleaned_factor_ranked(g.all_stocks, g.weight_list, previousStr)rebalance_position(context, stock_sort)g.t = (g.t +
1) % g.tc
def get_all_cleaned_factor_ranked(stocks, weight_list, previousStr):value = my_apha1(stocks)value = (-value).argsort()[:g.N]
return list(map(
lambda x: stocks[x], value))
'''
調(diào)整對(duì)沖beta的量
'''def adjustedBeta(context):current_returns = context.portfolio.returns
if current_returns <= g.returnsRate * (
1 - g.changeLimiteRate):g.changeRate +=
1g.rate =
0.5 + (
0.5 / (
1+np.exp(-g.changeRate)))
elif current_returns >= g.returnsRate * (
1 + g.changeLimiteRate):g.changeRate -=
1g.rate =
0.5 + (
0.5 / (
1+np.exp(-g.changeRate)))
if current_returns > g.returnsRate:g.returnsRate = current_returns
'''
END 調(diào)整對(duì)沖beta的量
''''''
factor1
'''def single_alpha1(stock):df = get_price(stock, count=
26, fields=[
'close'])returns = (df[
1:] - df[:-
2]) / df[:-
2] value = [
0] *
5for i
in range(
5):
if np.array(returns).tolist()[-
1 - i] <
0:value[i] = returns.ix[-
20 - i:-
1 - i].std() **
2else:value[i] = df[
'close'][-
1 - i] **
2return 5 - np.array(value).argmax()
def my_apha1(stocks):value = list(map(single_alpha1, stocks))MAX = max(value)MIN = min(value)value = (np.array(value) - MIN) / (MAX - MIN)
return value
'''
END factor1
''''''
初步篩選股票
'''
def pickStock(context, stocks):universe = filter_specials(stocks, context)
for stock
in universe:days_public = (context.current_dt.date() - get_security_info(stock).start_date).days
if days_public <
60:universe.remove(stock)g.lenth = len(universe)
return universe
def set_feasible_stocks(stock_list):current_data = get_current_data()stock_list = [stock
for stock
in stock_list
if not current_data[stock].paused]
return stock_list
def rank_stock(all_factor, weight_list):C = len(all_factor.columns)ranked = all_factor.iloc[:,
0].rank() * weight_list[
0]
if C >
1:
for j
in range(
1, C):ranked = all_factor.iloc[:, j].rank() * weight_list[j] + rankedranked = pd.DataFrame(ranked)ranked.columns = [
'rank']one_sort = ranked.sort(
'rank', ascending=g.ascending)stock_sort = one_sort.index[:g.N]
return stock_sort
def filter_specials(stock_list,context):curr_data = get_current_data()stock_list = [stock
for stock
in stock_list
if \(
not curr_data[stock].paused)
and (
not curr_data[stock].is_st)
and (
'ST' not in curr_data[stock].name)
and (
'*' not in curr_data[stock].name)
and (
'退' not in curr_data[stock].name)
and (curr_data[stock].low_limit < curr_data[stock].day_open < curr_data[stock].high_limit) ]
return stock_list
'''
END 初步篩選股票
''''''
調(diào)倉(cāng)
'''def rebalance_position(context, stocks_list):current_holding = context.subportfolios[
0].positions.keys()stocks_to_sell = list(set(current_holding) - set(stocks_list))bulk_orders(stocks_to_sell,
0)total_value = context.subportfolios[
0].total_valueset_option(
'futures_margin_rate', g.rate)bete_order(context, (
1 + g.rate) * context.subportfolios[
1].total_value)bulk_orders(stocks_list, total_value / len(stocks_list))
def bulk_orders(stocks_list, target_value):for i
in stocks_list :order_target_value(i, target_value, pindex=
0)
def bete_order(context, money):amount = int( money / get_current_data()[g.betaName].last_price)order_target(g.betaName, -amount , side=
'long', pindex=
1)
'''
END 調(diào)倉(cāng)
''''''
調(diào)倉(cāng)初版
'''
def order_stock_sell(context, data, stock_sort):for stock
in context.portfolio.positions:
if stock
not in stock_sort:stock_sell = stockorder_target_value(stock_sell,
0)
def order_stock_buy(context, data, stock_sort):for stock
in stock_sort:stock_buy = stockorder_target_value(stock_buy, g.everyStock)
'''
END 調(diào)倉(cāng)初版
'''
總結(jié)
以上是生活随笔為你收集整理的【量化投资】策略四(聚宽)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。