pandas 如何在python中创建一个for循环,根据可用数据对交易策略进行回溯测试

xpcnnkqh  于 2022-12-09  发布在  Python
关注(0)|答案(1)|浏览(121)

我正在尝试用Python编写一个算法,该算法基于可用数据对策略进行回溯测试。
1.从 x 美元金额开始
1.如果满足 condition_1,则buy x/unit_price. unit_price是股票的交易价格。
1.如果满足 condition_2,则sell unitsunit_price*. Units是在步骤2中购买的总单位数。
现在,我希望它交替为买-卖-买-卖...在这个顺序。
这是基本的想法:
| 日期|标价|更改百分比|
| - -|- -|- -|
| 2021年1月1日|一千六百|百分之一点五。|
| 2021年2月1日|小行星1680|下跌1.7%。|
下面是实际的 Dataframe :
DataFrame
到目前为止,我已经尝试定义了两个函数buy和sell,并将它们合并到for循环中。
第一个
我希望它在第一个示例中执行购买操作,然后将单位数设置为购买的单位数,接下来它将出售并将美元值设置为售出单位总数的美元值,然后使用新的美元金额购买,依此类推。
在本练习结束时,我希望能够看到总美元价值或购买的单位总数。
我得到的却是这样一个结果:
输入:

dollars

输出量:

Date
2021-11-30    0.0
2021-12-01    0.0
2021-12-02    0.0
2021-12-03    0.0
2021-12-04    0.0
             ... 
2022-11-25    0.0
2022-11-26    0.0
2022-11-27    0.0
2022-11-28    0.0
2022-11-29    0.0
Name: ETH-Close, Length: 365, dtype: float64

输入:

units

输出量:

[100]:
Date
2021-11-30    0.0
2021-12-01    0.0
2021-12-02    0.0
2021-12-03    0.0
2021-12-04    0.0
             ... 
2022-11-25    0.0
2022-11-26    0.0
2022-11-27    0.0
2022-11-28    0.0
2022-11-29    0.0
Name: ETH-Close, Length: 365, dtype: float64

我做错了什么?希望有人能帮忙。如果有些事情是显而易见的,对不起。我是新来的,试图了解这一切是如何工作的。

cidc1ykv

cidc1ykv1#

不需要全局变量。美元、单位位于顶部,因此可以访问它们。您正在向函数传递一列:df ['ETH-Close'],但您需要一行。系统将循环遍历每一行。所选行上的商品价格和该行的整数索引将传递给函数。
为了访问特定值,使用显式索引loc,其中索引在左边,列名在右边。
还使用了BUY、SELL开关(这样做是为了避免出现连续的购买或销售。也就是说,buy等待卖出信号,sold等待购买信号)。在每个事务处理上,都会打印行索引、信号类型、单位、unit_price、美元。
仔细检查一下这是你需要的吗?

import pandas as pd

dollars = 1000
units = 0

BUY = 0
SELL = 0

def buy(unit_price, index):
    print('index', index, 'buy', 'units', dollars / unit_price, 'unit_price', unit_price, 'dollars', dollars)
    return dollars / unit_price

def sell(unit_price, index):
    print('index', index, 'sell', 'units', units, 'unit_price', unit_price, 'dollars', units * unit_price)
    return units * unit_price

for i in range(len(df)):
    if BUY == 0 and df.loc[i, 'ETH-Pct-Change'] <= -1.6819:
        units = buy(df.loc[i, 'ETH-Close'], i)
        SELL = 0
        BUY = 1

    if SELL == 0 and df.loc[i, 'ETH-Pct-Change'] >= 1.4379:
        dollars = sell(df.loc[i, 'ETH-Close'], i)
        SELL = 1
        BUY = 0

print(dollars)

相关问题