Preheat oven to 350 degrees F. Grease and flour three cake pans and line the bottoms with parchment rounds.
Whisk the cake flour, baking powder, and salt in a medium bowl. Set aside.
In a stand mixer, beat the butter, oil, and sugar on medium speed for 3 minutes until light and fluffy.
Add eggs one at a time, mixing until just combined after each.
Mix in the ube halaya and ube extract until evenly combined.
With the mixer on low, add the flour mixture in three additions, alternating with the coconut milk in two additions, starting and ending with flour. Mix just until combined.
Divide the batter evenly among the three pans and bake for 24 to 28 minutes, checking a few minutes early, until a toothpick comes out clean.
Cool in the pans for 10 minutes, then transfer to a wire rack to cool completely before frosting.
Beat the butter alone for 2 minutes until pale and creamy. Add powdered sugar one cup at a time, then mix in the ube halaya and ube extract to taste.
Frost between each layer, apply a thin crumb coat, refrigerate for 20 minutes, then apply the final coat of frosting and top with macapuno strings if using.