我想用数据框创建一个简单的交易系统信号表,如:
Close buy sell
2011-01-31 50 0 0
2011-02-28 40 1 0
2011-03-31 50 0 0
2011-04-30 80 0 -1
2011-05-31 60 1 0
2011-06-30 50 1 0
2011-07-31 20 0 0
2011-08-31 30 0 -1
信号以下列方式生成:
df['buy'] = np.where( <condition> , 1, 0 )
sell
列以相同的方式创建。
问题是2011-06-30的双重购买信号,紧接在2011-05-31之前的一次。
2011-05-31 60 1 0
2011-06-30 50 1 0
如何在 df['sell']
列中以-1结束之前阻止新买入(== 1)信号?
答案 0 :(得分:2)
嗯,曾经需要一些更复杂的东西,而不是一个简单的 numpy
矢量化/广播/条件操作,类似于 np.where( <condition> , 1, 0 )
一个人必须实现一些特定于自定义的功能,以处理这些附加功能,其中有限状态自动机可能很好地用于此类目的。
简单地说,你的条件已经超越了简单的矢量化/广播矩阵运算的表现力,贸易管理子系统已经开始具有内部,一个SEQ行为和一些其内部转换的规则( s)和 - 过渡限制。
人们很难指望一般的通用工具, numpy
- 矩阵和 pandas
-DataFrame实例,旨在支持这种特定于问题领域的功能,以便模拟算法交易策略模拟。
最好选择一些特定于交易的工具来满足这种需求,或者期望必须实现一个SEQ-behavior iterator-function,这将促进所需的逻辑(没有智能numpy矢量化/广播表达式或pandas one-liner这就足够了。)
范围?
对于那些真正对快速原型交易策略示例感兴趣的人,使用基于FSA的实现方法,检查这种系统设计的简单性+内置(脚本 - 基于)自动一致性测试能力+用于估计代码跨度的行号(绝对不是numpy
SLOC):![]()
答案 1 :(得分:0)
我对派对来说有点迟,但我希望这会有所帮助。我想你想要替代1和-1。虽然不是最好的方法,但我建议您添加买入和卖出信号,并将新列称为交易信号。交易信号列以任意方式具有0,1和-1。以下代码说明了进一步的步骤。
import pandas as pd
import numpy as np
trade_signal= pd.DataFrame([1,1,0,0,-1,-1,1,1,-1])
ts_shifted=trade_signal.shift(1)
trade_rule=np.where(trade_signal!=ts_shifted,trade_signal,0)