矢量化backtest创建的pandas DataFrame

时间:2016-06-06 09:25:23

标签: python pandas vectorization

这是我在发布可能已被严重解决/描述的几个问题后的最后一次尝试。我希望得到这个DataFrame:

        Signal   price  buy_units   sell_units   cashflow  balance
   Index
      0     0       40          0         0           0     100000
      1     1       50       2000         0      -100000         0
      2    -1      100          0     -2000      +200000    200000  
      3     1       50       4000         0      -200000         0
      4    -1       70          0     -4000      +280000    280000

这是股票交易策略的回溯测试。当Signal == 1 buy_units等于当前balance(前一行的值)除以price时。然后balance减少cashflow(即单位x价格* -1)。其余部分应该是不言自明的。 问题是:在没有迭代的情况下以矢量化方式计算buy_units。谁知道如何解决这个问题?

最终我想在一个带有"计算单位"的班级中进行设计。和"计算余额"方法,但这在第一步中没有必要。

2 个答案:

答案 0 :(得分:1)

如果int Trace(node* root, int find) { node * searcher = root; if(!searcher) { cout << "Node not found" << endl; //return something here } //rest of function stays the same } -1信号始终如示例所示,则步骤+1中的余额等于步骤n+2中的余额乘以价格回报在nn+1之间。

我使用累积产品将其转换为熊猫中的矢量化操作:

n+2

可以从余额中轻松计算现金流量和单位数量。

答案 1 :(得分:0)

您可以创建临时数据框以进行计算:

public class ListActivity extends AppCompatActivity {

public final static String EXTRA_MESSAGE = "bird info";
ListView listView;
ListActivity context = this;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    listView = (ListView)findViewById(R.id.listView);

    Intent intent = getIntent();
    Habitats habitat = Habitats.detachFrom(intent); //this is an enum type sent as String, converted back to enum.

    Cursor cursor;

    DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
    databaseAccess.open();
    cursor = databaseAccess.getCursorByHabitat(habitat);
    databaseAccess.close();

    SpecieCursorAdapter adapter = new SpecieCursorAdapter(this, cursor);

    listView.setAdapter(adapter);// how to seperate the image loading?

}

然后对此数据帧执行计算:

temp = df[df.balance == 1]

删除临时数据框:

df.ix[df.balance == 1,'buy_units'] = temp.balance/temp.price