コード例 #1
0
def test_analyze_signal():
    # --------------------------------------------------------------------------------
    # Step.1 load dataview
    dv = DataView()
    dv.load_dataview(dataview_folder)

    mask = mask_index_member(dv)
    can_enter, can_exit = limit_up_down(dv)

    # --------------------------------------------------------------------------------
    # Step.3 get signal, benchmark and price data
    dv.add_formula('divert',
                   '- Correlation(vwap_adj, volume, 10)',
                   is_quarterly=False,
                   add_data=True)

    signal = dv.get_ts('divert')
    price = dv.get_ts('close_adj')
    price_bench = dv.data_benchmark

    # Step.4 analyze!
    my_period = 5
    obj = SignalDigger(output_folder='../output/test_signal',
                       output_format='pdf')
    obj.process_signal_before_analysis(
        signal=signal,
        price=price,
        high=dv.get_ts("high_adj"),  # 可为空
        low=dv.get_ts("low_adj"),  # 可为空
        group=dv.get_ts("sw1"),
        n_quantiles=5,  # quantile分类数
        mask=mask,  # 过滤条件
        can_enter=can_enter,  # 是否能进场
        can_exit=can_exit,  # 是否能出场
        period=my_period,  # 持有期
        benchmark_price=price_bench,  # 基准价格 可不传入,持有期收益(return)计算为绝对收益
        commission=0.0008,
    )
    signal_data = obj.signal_data
    result = analysis(signal_data, is_event=False, period=my_period)
    ic = pfm.calc_signal_ic(signal_data, by_group=True)
    mean_ic_by_group = pfm.mean_information_coefficient(ic, by_group=True)
    plotting.plot_ic_by_group(mean_ic_by_group)
    res = obj.create_full_report()
コード例 #2
0
def draw_analysis(
        signal="Union",
        benchmark_price=None):  #同样类似于第二章SignalDigger处理因子的方式,不过这里是定义函数
    obj.process_signal_before_analysis(
        signal=dv.get_ts(signal),
        price=dv.get_ts("close_adj"),
        high=dv.get_ts("high_adj"),  #可为空
        low=dv.get_ts("low_adj"),  #可为空
        n_quantiles=1,  # quantile分类数
        mask=mask,  #过滤条件
        can_enter=can_enter,  # 是否能进场
        can_exit=can_exit,  # 是否能出场
        period=30,  # 持有期
        benchmark_price=benchmark_price,  # 基准价格 可不传入,则持有期收益(return)计算为绝对收益
        commission=0.0008,
    )
    print(analysis(obj.signal_data, is_event=True,
                   period=30))  # is_event=False表示不是事件类因子,period=15研究周期
    obj.create_full_report()
    plt.show()
コード例 #3
0
    price=dv.get_ts("close_adj"),
    high=dv.get_ts("high_adj"),  # 可为空
    low=dv.get_ts("low_adj"),  # 可为空
    n_quantiles=5,  # quantile分类数
    mask=mask,  # 过滤条件
    can_enter=can_enter,  # 是否能进场
    can_exit=can_exit,  # 是否能出场
    period=30,  # 持有期
    benchmark_price=dv.data_benchmark,  # 基准价格 可不传入,持有期收益(return)计算为绝对收益
    commission=0.0008,
)
obj.create_full_report()
plt.show()

signal_data = obj.signal_data  #得到因子值
result = analysis(signal_data, is_event=False, period=30)  #得到分析表格
print(analysis(obj.signal_data, is_event=False, period=30))  #与上面完全一样
'''进一步测试下等权合成因子的绝对收益效果 可以尝试运行下
obj.process_signal_before_analysis(signal=comb_factors["equal_weight"],
                                   price=dv.get_ts("close_adj"),
                                   high=dv.get_ts("high_adj"), # 可为空
                                   low=dv.get_ts("low_adj"),# 可为空
                                   n_quantiles=5,# quantile分类数
                                   mask=mask,# 过滤条件
                                   can_enter=can_enter,# 是否能进场
                                   can_exit=can_exit,# 是否能出场
                                   period=30,# 持有期
                                   #benchmark_price=dv.data_benchmark, #这行注释掉即可
                                   commission = 0.0008,
                                   )
obj.create_full_report()
コード例 #4
0
ファイル: 多因子.py プロジェクト: Chenxj0/homework
obj.process_signal_before_analysis(signal=comb_factors["ic_weight"],
                                   price=dv.get_ts("close_adj"),
                                   high=dv.get_ts("high_adj"), # 可为空
                                   low=dv.get_ts("low_adj"),# 可为空
                                   n_quantiles=5,# quantile分类数
                                   mask=mask,# 过滤条件
                                   can_enter=can_enter,# 是否能进场
                                   can_exit=can_exit,# 是否能出场
                                   period=20,# 持有期
                                   benchmark_price=dv.data_benchmark, # 基准价格 可不传入,持有期收益(return)计算为绝对收益
                                   commission = 0.0008,
                                   )
obj.create_full_report()
plt.show()

print(analysis(obj.signal_data,is_event=False,period=20))


excel_data = obj.signal_data[obj.signal_data['quantile']==5]["quantile"].unstack().replace(np.nan, 0).replace(5, 1)
print (excel_data.head())
excel_data.to_excel('./ic_weight_quantile_5.xlsx')

obj = SignalDigger()
obj.process_signal_before_analysis(signal=comb_factors["ir_weight"],
                                   price=dv.get_ts("close_adj"),
                                   high=dv.get_ts("high_adj"), # 可为空
                                   low=dv.get_ts("low_adj"),# 可为空
                                   n_quantiles=5,# quantile分类数
                                   mask=mask,# 过滤条件
                                   can_enter=can_enter,# 是否能进场
                                   can_exit=can_exit,# 是否能出场
コード例 #5
0
    n_quantiles=5,  # quantile分类数
    mask=mask,  # 过滤条件
    can_enter=can_enter,  # 是否能进场
    can_exit=can_exit,  # 是否能出场
    period=5,  # 持有期
    benchmark_price=dv.data_benchmark,  # 基准价格 可不传入,持有期收益(return)计算为绝对收益
    commission=0.0008,
)
signal_data = obj.signal_data

import matplotlib.pyplot as plt
print(obj.create_full_report())
plt.show()

from jaqs_fxdayu.research.signaldigger.analysis import analysis
result = analysis(signal_data, is_event=False, period=5)

print("——ic分析——")
print(result["ic"])
print("——选股收益分析——")
print(result["ret"])
print("——最大潜在盈利/亏损分析——")
print(result["space"])
import matplotlib.pyplot as plt
obj.create_full_report()
plt.show()

obj.process_signal_before_analysis(
    signal=dv.get_ts("pe"),
    price=dv.get_ts("close_adj"),
    high=dv.get_ts("high_adj"),  # 可为空
コード例 #6
0
    mask=mask,  # 过滤条件
    can_enter=can_enter,  # 是否能进场
    can_exit=can_exit,  # 是否能出场
    period=15,  # 持有期
    benchmark_price=dv.data_benchmark,  # 基准价格 可不传入,持有期收益(return)计算为绝对收益
    commission=0.0008,
)
signal_data = obj.signal_data
signal_data.head()

# In[7]:

# In[8]:

from jaqs_fxdayu.research.signaldigger.analysis import analysis
result = analysis(signal_data, is_event=False, period=15)

# In[9]:

print("——ic分析——")
print(result["ic"])
print("——选股收益分析——")
print(result["ret"])
print("——最大潜在盈利/亏损分析——")
print(result["space"])

# 4.2
# 读取600104.XSHG的股票日线
#
# 利用正确的方法将日K线聚合成周K线
#
コード例 #7
0
    can_enter=can_enter,  # 是否能进场
    can_exit=can_exit,  # 是否能出场
    period=15,  # 持有期
    benchmark_price=dv.
    data_benchmark,  #基准价格 可不传入,持有期收益(return)计算为绝对收益,这里写了则表示计算收益为相对与指数的收益.也可以以其他指数为标准
    #改为benchmark_price=None, #则计算的是绝对收益
    commission=0.0008,  #手续费,在alphalens中就不能设置手续费
)

#得到因子值:
signal_data = obj.signal_data  #signal表示因子值,return表示持有期的收益率(买入并持有15天后的相对收益),upside_ret/ downside_ret代表在对应持有期下的最大上涨空间以及最大下跌空间(这里都是计算的绝对收益率)
signal_data.head()

#step2: 因子分析
from jaqs_fxdayu.research.signaldigger.analysis import analysis
result = analysis(signal_data, is_event=False,
                  period=15)  # is_event=False表示不是事件类因子,period=15研究周期
#这里会得到一个字典(含三个索引)
#return_ic/upside_ret_ic/downside_ret_ic: 表示持有期收益的ic/持有期(股票暴涨)最大向上空间的ic/持有期(股票暴跌)最大向下空间的ic

#long_ret/short_ret/long_short_ret/top_quantile_ret/bottom_quantile_ret/tmb_ret/all_sample_ret 表示:
#多头组合收益(做多因子值为正的股票)/空头组合收益(做空因子值为负的股票)/多空组合收益(做多因子值为正的股票,做空因子值为负的股票)/
#/做多因子值(按quantile分类)最大的组合收益/做多因子值最小(按quantile分类,后同)的组合收益/因子值最大组(构建多头)+因子值最小组(构建空头)收益/全样本(例如这里研究的沪深300的股票)-基准组合收益

#long_space/short_space/long_short_space/top_quantile_space/bottom_quantile_space/tmb_space/all_sample_space 表示:
#(与上面一行一一对应)多头组合空间/空头组合空间/多空组合空间/因子值最大组合空间/因子值最小组合空间/因子值最大组(构建多头)+因子值最小组(构建空头)空间/全样本(无论信号大小和方向)-基准组合空间

#而关于索引项(ic或收益的具体指标):
#"IC Mean", "IC Std.", "t-stat(IC)", "p-value(IC)", "IC Skew", "IC Kurtosis", "Ann. IR" 表示:
#IC均值,IC标准差,IC的t统计量,对IC做0均值假设检验的p-value,IC偏度,IC峰度,iC的年化信息比率-mean(IC)/std(IC)  (一般|IC的均值|>0.02,|iC的年化信息比率|>0.6就可认为因子效果会比较好)

#'t-stat',"p-value","skewness","kurtosis","Ann. Ret","Ann. Vol","Ann. IR","occurance" 表示: